编译原理
文章平均质量分 54
学习编译原理,化复杂为简单!
撬动未来的支点
空谈误国,实干兴邦
展开
-
【编译原理】总体把握编译原理
这里容易误解的是,根据生成式解析代码的过程中,是需要查看一定的上下文的,因为我们需要根据已经解析的符号,加上后面出现的符号,来判断语句的类型和内容,这个过程本身就是一种上下文分析的过程,只不过这个上下文范围很小。感兴趣的同学可以看我之前的文章。编译器用生成式来对代码进行词法和语法解析,只需要使用生成式约定的规则,就可以从一串文本中,确定一个符合语法的语句后,就可以明确这个语句的含义,不需要这条语句前面的内容(即上文),和下面的内容(即下文)来确定这条语句所表达的含义,也就是说语句所表达的含义不会有歧义。原创 2024-09-17 16:20:20 · 287 阅读 · 0 评论 -
【编译原理】七、从编码过程理解生成式
前面的文章中,我们从理论和实践的角度,围绕着代码解析做了相关工作。理论和实践密不可分,通过实践,我们可以加强对理论的理解。本篇文章我们主要总结对生成式理论的补充理解。通过实际编码,可以加深对生成式的理解。理论本身的创造过程应该是从实践中总结出来的,但是我们在学习理论的时候,往往是从理论开始的,这就造成了理论很难理解,理论本身有时候并不是很难,而是没有和实践结合起来。词法解析部分的基本原理,我们基本弄明白了。后面我们将进行语法解析的理论学习及程序设计。原创 2023-08-16 22:17:56 · 217 阅读 · 0 评论 -
【编译原理】六、四则运算支持括号及括号嵌套
在上一篇文章中,我们实现了简单四则运算,现在我们在此基础上,让四则运算支持括号。注意,为了降低复杂度,不支持括号嵌套。原创 2023-08-07 09:43:25 · 318 阅读 · 0 评论 -
【编译原理】五、简单四则运算的代码实现
前面说了那么多BNF的相关理论知识,实际上就是为了一个目的:描述语法规则描述语法规则是一切的开始。最终,还是要用代码来实现。如果对于BNF仍然是一头雾水,也没关系,因为我们的最终目的是编写解析器,从现在开始,我们的重点应该放到编码上。编写代码需要注意的问题,以及编写思路,并不是一个公式就能描述的,有非常多的细节需要处理,编码实现是理论知识的一个升级。在编写代码的过程中,我们可以加强对理论的理解,加强理论理解同时又能编写复杂的解析代码,正所谓:“理论要联系实际”。原创 2023-08-06 19:14:07 · 308 阅读 · 0 评论 -
【编译原理】词法分析程序设计
词法分析即对程序源码进行分词处理,分词处理就是把文本流分割成一个又一个。分词处理的输入输出是什么呢?输入是源码字符串流输出是:整型的类型枚举值,表示符号类型,如字符串;符号内容信息,如字符串内容"abcdef"。...原创 2021-03-22 00:02:32 · 243 阅读 · 0 评论 -
【编译原理】如何根据EBNF编写代码?
此篇文章承接上一篇:【编译原理】如何编写BNF?我们知道,完整的编译过程总体大概需要经历六个阶段:词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成EBNF是位于词法分析阶段涉及的技术。要想根据EBNF解析代码,判断代码语法是否正确、获取语句相关信息之前,需要先进行词法分析。词法分析可以手写,也可以使用Lex等词法分析工具自动生成解析代码。关于如何实现,涉及到具体代码,最好的办法是看源码,调试。函数如何设计、如何调用看了源码会一目了然。原创 2021-03-07 16:23:31 · 956 阅读 · 0 评论 -
【编译原理】三、编写BNF
此篇文章承接上一篇:【编译原理】理解BNF既然BNF是树形分解,那么反过来,BNF应该可以由语法的分解树转化而来。原创 2021-03-07 11:14:19 · 1839 阅读 · 1 评论 -
【编译原理】学习LUA
123原创 2021-03-07 10:55:54 · 379 阅读 · 0 评论 -
【编译原理】什么是AST?
自己写的确实没有别人写的好,所以在此推荐以下内容供参考:抽象语法树—百度百科AST系列(一): 抽象语法树为什么抽象编程语言的实现,从AST(抽象语法树)开始知乎话题-抽象语法树原创 2021-03-07 10:49:44 · 2790 阅读 · 0 评论 -
【编译原理】一、什么是上下文无关文法?
上下文无关是指,一句话的含义与其前后的内容没有或者几乎没有关系,只由自己决定,把它剪切到其他任何位置,也还是原有的意思。例如:...a = 0;...这是一个赋值语句,无论此语句的前后是什么代码,此语句所代表的操作是确定的。即:给变量a赋予值0换句话说,CPU遇到什么语句就执行什么语句,不用管其他的。编程语言为什么不用人类的语言(自然语言),而是用上下文无关的文法呢?因为便于设计编译器。试想一下,如果可以用自然语言写代码,那不就是实现了人工智能了吗?客观上技术目前无法实现。原创 2021-03-07 10:01:38 · 5679 阅读 · 1 评论 -
【编译原理】为什么编程语言中,标识符不能以数字开头?
标识符不能以数字为开头, 是为了简化词法解析器设计和实现,规避词法解析中以数字开头的变量与数字解析冲突的问题。如果两种类型的词,如果起始符号不同,那么可以很容易把二者区分开;如果起始符号相同,那么以下符号:234到底是变量还是数字常量?这种情况下,需要根据上下文判断。这就离“上下文无关法”越来越远了,解析难度也更高。比如:int 234=234;我们只有根据 int 才知道第一个234是标识符,只有根据 int 和 = 才知道后面的234是数字常量。不仅实现起来复杂,而且代码可读性更差。原创 2021-03-06 10:56:53 · 5126 阅读 · 2 评论 -
【编译原理】二、理解BNF
总体理解一个源码文件本质上就是一棵树,即数据结构中的树。解析源码的本质就是将一维的字符串序列转换为一颗语法树。这个可以自己对着源码理解,代码中的缩进就是一种树层次的体现。BNF范式BNF范式本质上就是树形分解,很简单嘛。前端代码解析的难点就在于BNF,对于对数学不敏感的人来说,看到公式就很烦(像我一样)。那么我们就从计算机专业的角度来掌握它。产生式产生式就是将语法的分解规则表达出来的等式。如句子 = 主 + 谓 + 宾将语法规则描述出来是为了便于代码实现,便于计算,所以产生式可以看做原创 2021-01-24 11:15:31 · 19351 阅读 · 3 评论