首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(4)- 语法分析1

项目github地址及源码: https://github.com/yunwei37/tryC 这一章开始进入解释的核心部分: 语法分析; 我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算...Algol 60编程语言的语法。...BNF语法定义的语言是一个字符串集合,可以按照下述规则书写,这些规则叫做书写规范(产生式规则),例如一个四则运算表达式可以表示为: exp -> exp op exp | ( exp ) | number...+ | - | * | / 其中'|'用于表示可选择的不同项,"->"用于表示推导规则,从产生式左边的符号可以推导出产生式右边的符号; 要解析一个表达式,我们可以完成这样一个替换:对于 (3+2)*4...通常我们在编译构建中使用的都是上下文无关文法。

1.7K00

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言...用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个...600行的类c语言解释: 给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现...用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC...这一章开始进入解释的核心部分: 语法分析; 我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算tryC中的表达式。

50420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    实现JavaScript语言解释(一)

    因此为了更好地理解JavaScript的语言特性,我就自己动手实现了一个叫做Simple的JavaScript语言解释,这个解释十分简单,它基于TypeScript实现了JavaScript语法的子集...项目介绍 编译 vs 解释 在开始了解Simple的实现原理之前,我们先来搞清楚两个基本的编译原理概念:编译(Compiler) vs 解释(Interpreter)。...解释 解释顾名思义就是会对我们的代码进行解释执行,它和编译不一样,它不会对源代码进行转换(最起码不会输出中间文件),而是边解释边执行源代码的逻辑。...Simple解释 由于Simple不会对编写的JavaScript代码进行中间代码转换,它只会解释并且执行代码的逻辑,所以它是一个不折不扣的JavaScript语言解释。...综上所述,一个语言解释的软件架构大体是这样的: 上面其实也就是Simple的软件架构,接着让我们来看一下词法分析的具体实现。

    1.3K30

    实现JavaScript语言解释(二)

    end": { "line": 1, "column": 21 } } } ] 在语法解析(Syntax Analysis)阶段,Simple解释会根据定义的语法规则来分析单词之间的组合关系...在语法解析阶段,如果Simple解释发现输入的Token字符串不能通过既定的语法规则来解析,就会抛出一个语法错误(Syntax Error),例如赋值语句没有右表达式的时候就会抛出Syntax Error...那么对于Simple解释来说,它的语法规则又是什么呢?...细心的你可能发现在上面的例子中所有语句都是以分号;结尾的,这是因为为了简化语法解析的流程,Simple解释强制要求每个表达式都要以分号结尾,这样我们才可以将重点放在掌握语言的实现原理而不是拘泥于JavaScript...对于程序员来说最清晰的解释应该是直接看代码了,所以我们可以来看一下Simple语言语法解析的代码部分。

    59810

    Python语言编译解释

    一、解释语言Python Python语言是一种解释型、面向对象、动态数据类型的高级程序设计语言。 ?...编译型语言 先整体编译,再执行 运行速度快,任意改动需重新编译 可脱离编译环境运行 解释语言解释,边执行 运行速度慢 部分改动无需整体重新编译 不可脱离解释环境运行 编译型与解释语言列表...二、Python解释种类 CPython 官方版本的解释。这个解释是用C语言开发的,所以叫CPython。CPython是使用最广的Python解释。...我们通常说的、下载的、讨论的、使用的都是这个解释。 Ipython 基于CPython之上的一个交互式解释,在交互方式上有所增强,执行Python代码的功能和CPython是完全一样的。...PyPy 一个追求执行速度的Python解释。采用JIT技术,对Python代码进行动态编译(注意,不是解释),可以显著提高Python代码的执行速度。

    1.5K20

    c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析

    c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600...行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释:...给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个...600行的类c语言解释: 给编程初学者的解释教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC 这一篇讲讲在...但对于我们这样一个简单的解释来说,手工构造词法分析,并且完全不涉及到正则表达式的知识,理解起来也并不是很困难啦。

    67431

    C语言(4)----数组

    也就是这样: 4.数组的下标(以一维数组为例) C语⾔规定数组是有下标的,下标是从0开始的,也就是说当有a个元素的时候,最后一个元素的下标并不是a,而是a-1。...对于int arr[10] = {1,2,3,4,5,6,7,8,9,10};这个数组,使用arr[3],访问出来的结果就是4。 5.一维数组和多维数组 数组在维度上可以分为一维数组和多维数组。...所以第3行第2列指的并不是4而是6。 6.数组的输入和输出 单个数组元素我们可以访问,那么整个数组我们也是可以访问的,很简单,只需要用上循环即可。...8.C99的变长数组 上面我们认识的数组都是放入的常量值,那么我们可不可以放入变量值呢?这里就给出了C99的变长数组来提供给我们放入变量值。 也就是这样,a和b都是变量。...首先vs2022不支持变长数组,需要使用例如gcc编译来实现。 其次由于变长数组的变量性质,只有在程序运行时才能确定数组长度,所以我们不能将其初始化。

    6210

    C语言基础(4

    int arr[10]={1,2,3,4,5,6,7,8,9,10}//定义一个整型数组最多放十个元素 c语言规定,数组中的每个数都有下标,下标从0开始计数。...x、y都要括起来,整体为宏体也要括起来 int main() { printf("%d\n", 6*ADD(2, 3)); return 0; } 五、指针 1.内存 内存是电脑上特别重要的存储,...stdio.h> int main() { int a =10; printf("%p\n",&a); //%p是专门用来打印地址的 int* pa=&a //pa是用来存放地址的,在c语言中...(一个二进制位等于一个比特位) 例:32位机器上存放一个地址需要32个比特位,也就是说需要4个字节,所以指针的大小为4个字节。64位机器同理。...故,指针的大小与平台的类型有关, 六、结构体 结构体是c语言中特别重要的知识点,结构体使得c语言能创建出新的类型。 比如描述学生,学生包含:名字+年龄+性别+学号这几项信息。这里只能用结构体来描述。

    12010

    C语言(指针)4

    按道理说数组名是数组首元素的地址,那 sizeof(arr)求出来应该是4个字节的大小,这里为什么是40个字节的大小呢?...如果你并没有这个疑惑,可能是你学的非常扎实,我们一起继续努力;也可能是你学的还不太扎实,或者没有好好看我之前的文章,罚你去看 —> C语言(指针)1 。...可以看到,对数组首元素的地址+1增大了4个字节,对整个数组的地址+1增大了40个字节(其中地址是16进制表示),这一点相信看过我之前文章的小伙伴都已经非常清楚了,就不再赘述了。...4.冒泡排序 学了上面的内容,我们就可以用数组和指针的知识来实现一下冒泡排序。我们这里写升序。...首先,我们先简单地介绍一下冒泡排序是怎么一回事,详细的解释这里就不赘述了,不了解的同学还请查看别的资料。

    7510

    c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析

    词法分析能够对源码字符串做预处理,以减少语法分析的复杂程度。...,就得到这样一个标记流: {Sym, num}, {'=', assign}, {Num, 123.4} 词法分析的具体实现 由于词法分析对于各个语言基本都是大同小异,在其他地方也有很多用途,并且手工构造的话实际上是一个很枯燥又容易出错的活计...但对于我们这样一个简单的解释来说,手工构造词法分析,并且完全不涉及到正则表达式的知识,理解起来也并不是很困难啦。...循环的原因有以下几个: 处理错误: 如果碰到了一个我们不认识的字符,可以指出错误发生的位置,然后用while循环跳过当前错误,获取下一个token并继续编译; 跳过空白字符; 在我们实现的tryC语言中...对变量的处理需要以下几个步骤: 获取完整的变量名: 在符号表中查找变量: 如果在符号表中找到了变量,根据变量不同的类型,返回不同的token值; 如果没有找到,在符号表中间插入新的变量 关于符号表具体的内容,会独立出一篇文章来解释

    1.3K00

    c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言

    c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600...行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释:...给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个...,尤其在没有生成中间代码的情况下; 参考资料 《编译原理及其实践》 c4 用四个函数和很少的代码就完成了功能相当完善的 C 语言编译, 并且能够自举;我自己写作的时候也借鉴了c4的许多实现思想...; 手把手教你构建 C 语言编译c4的一个重写版,附有详细的中文教程 Let’s Build a Compiler, by Jack Crenshaw 一个英文的初学者教程,讲解如何实现一个编译

    46420

    c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计

    c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600...行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释:...给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个...600行的类c语言解释: 给编程初学者的解释教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC 需要了解的一些基本概念...而解释是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,它并不会把源代码预编译成机器码,而是一行一行地分析源代码并且直接执行,相对编译而言可能效率较为低下,但实现也相对简单,并且容易在不同的机器上进行移植

    57410

    c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计

    项目github地址及源码: https://github.com/yunwei37/tryC 需要了解的一些基本概念 编译解释的区别不同 通常我们说的 “编译” 是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码...而解释是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,它并不会把源代码预编译成机器码,而是一行一行地分析源代码并且直接执行,相对编译而言可能效率较为低下,但实现也相对简单,并且容易在不同的机器上进行移植...解释与编译仅在代码生成阶段有区别,而在前三个阶段如词法分析、语法分析、语义分析基本是一样的。...(实际上完成一个可以跑起来的解释并不难,而且还是一件很有成就感的事,不是嘛?)...tryC编译的设计: 从上面可以看出,我们的tryC解释需要这三个模块: 词法分析 语法分析 语义分析和解释执行 需要这两个数据结构(用来在阶段之间保存或传递值): token,用来在词法分析和语法分析之间传递标记

    1.7K00

    c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言

    项目github地址及源码: https://github.com/yunwei37/tryC 一个小目标 这一系列教程希望面向初学者,使用c语言手工实现一个简单的解释来玩,不需要您掌握除了c语言以外的其他前置知识...写一个能执行代码的解释不仅是一件很有(zhuang)趣(bi)的事情,大概也可以作为刚学习完c语言的一个练手的小项目啦 不同于大部分常见的其他只支持四则运算的所谓”手工解释“教程,我们希望在代码结构尽量清晰的...需要了解的前置知识 c语言的指针、函数指针、结构体等 递归的思想 心理准备 写一个600行的解释虽然不算什么大工程,但相关的原理还是稍微有些复杂的,可能需要多花一些时间理解程序的运行过程; 代码可能难以调试...,尤其在没有生成中间代码的情况下; 参考资料 《编译原理及其实践》 c4 用四个函数和很少的代码就完成了功能相当完善的 C 语言编译, 并且能够自举;我自己写作的时候也借鉴了c4的许多实现思想;...手把手教你构建 C 语言编译c4的一个重写版,附有详细的中文教程 Let's Build a Compiler, by Jack Crenshaw 一个英文的初学者教程,讲解如何实现一个编译

    1.4K00

    c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2

    | // 数组定义 statement的代码实现 布尔表达式和算术表达式的代码之前已经讲过了,这里看看statement的实现,以及如何在语法分析的同时解释执行...: 这里使用的方法是,对于流程控制语句,在语法分析的时候就进行条件判断,如果if判断失败或者while不进入循环块,就跳过该语句块不进行语法分析、解释执行; 其中RETURNFLAG用来表示在函数中返回...statement()) return RETURNFLAG; } match('}'); } .... if语句 由于tryC解释是边进行语法分析...,边解释执行的,因此如果不需要解释执行执行某一个语句块,就调用函数 skipStatments() 跳过该语句块,不对其进行语法分析,不解释执行;(在if语句和while语句中使用): ...

    80100

    C语言---深入指针(4

    回调函数 //回调函数就是通过函数指针调用的函数 //这个在之前的转移表-计算里面很明显,通过函数指针数组内的函数指针进行函数的调用 // // // 将这四段代码分装成一个函数,一个代码将这4个问题都解决...****\n"); printf("********** 1.add 2.sub***********\n"); printf("********* 3.mull 4....Calc(Div); break; case 0: printf("退出计算\n");...// a,b,c,d,c,e,f a,b,c,q 因为d的ASCII小于q的,所以第一行的字符串就小于第二行的字符串 strcmp比较的不是长度,比较的是对应位置的字符ASCII大小的 qsort的结构...这个函数就能处理任意类型的数据了 //这里的base指向的是数组的首元素的地址,sz是数组元素个数 //仅仅知道这两个消息是仅仅不够的,因为我们不知道每个元素的字节大小是多少,因为不同类型的元素字节大小不同 //解释一下这个函数

    8810

    初识C语言·指针(4

    在上一篇中模拟实现加减乘除的计算中,我们使用了函数指针数组,也就是转移表,这种方法也较为快捷,但是实际上,回调函数也是非常快捷的。...ret); return 0; } int main() { int input = 0; printf("**1 Add 2 Sub*****\n"); printf("**3 Mul 4...{ case 1: Fun(Add); break; case 2: Fun(Sub); break; case 3: Fun(Mul); break; case 4:...cplusplus对第四个参数的介绍是这样的,全是英文也不要怕,我们用一下翻译咯,总之介绍的是,这个参数里面还有两个参数,分别是两个指针,被const修饰,因为我们只是对数据进行排序,不会改变它的值,...说实话博主也不大清楚,可能涉及到C语言中对它的定义? 但是我们现在应该考虑的是如何传这个参数,其实很简单,只需要在写一个函数,函数的参数是两个指针,返回类型是int就行了。

    5910
    领券