编译原理的学习与实践
文章平均质量分 82
本专栏是笔者在学习编译原理过程中的心得总结,旨在分享、交流,与CSDN网友共同进步。本栏目侧重编程实践,通过开发简单的编译器工具,深入掌握编译器的理论知识。
造梦工程师
这个作者很懒,什么都没留下…
展开
-
正则表达式与上下文无关文法
保留版权,转载需注明出处(潘军彪的CSDN博客http://blog.csdn.net/panjunbiao)正则表达式正则表达式在日常开发中时不时都会遇到,我们先来看看正则表达式( Regular Expression)的定义(参考龙书英文第2版121页):ε是一个正则表达式,它生成的语言L(ε)等价于{ε},即L(ε)={ε},就是一个空字符串如果a属于符号集Σ,那么a原创 2013-07-18 13:07:54 · 11680 阅读 · 0 评论 -
非确定有限状态自动机的构建(一)——NFA的定义和实现
保留版权,转载需注明出处(http://blog.csdn.net/panjunbiao)。非确定有限状态自动机(Nondeterministic Finite Automata,NFA)由以下元素组成:一个有限的状态集合S一个输入符号集合Sigma,并且架设空字符epsilon不属于Sigma一个状态迁移函数,对于所给的每一个状态和每一个属于Sigma或{epsilon}的符号,输出原创 2013-07-17 15:16:59 · 15496 阅读 · 1 评论 -
开源啦!我的Compiler-Construction项目
前段时间的一些代码已经上传到GitHub,有兴趣的同学请移步https://github.com/panjunbiao/compiler-construction。这个项目刚刚起步,还达不到实用的程度,只是和大家分享、交流。前段时间写的一些文章,其中的代码全部都可以在这个项目中找到。原创 2013-07-08 15:21:49 · 1818 阅读 · 2 评论 -
到底什么是上下文无关文法?
在龙书Compilers - Principles, Techniques, & Tools英文版第2版42页中,提到上下文无关文法有以下的特点:一个终结符的有限集(A set of terminal symbols),构成文法的最基本的字符就是这个文法的终结符,例如一个能够产生个位数的文法规则digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |原创 2013-07-08 10:23:38 · 11424 阅读 · 1 评论 -
基于Predictive Parsing的ABNF语法分析器(十四)——RFC2234文法解析实战
现在开始,我们的解析器要进入实战阶段了,首先来看看,能不能直接分析ABNF文法本身呢?先把RFC2234上面关于自身的文法定义的片段copy下来,保存成文件,例如文件名RFC2234.Demo.1.txt ALPHA = %x41-5A / %x61-7A ; A-Z / a-z BIT = "0" / "1"原创 2013-07-02 17:32:38 · 1936 阅读 · 1 评论 -
基于Predictive Parsing的ABNF语法分析器(十三)——rulelist、rule、rulename、define-as和elements
我们来看看rulelist,它是整个ABNF文法的入口,就是说一个ABNF文法就是一个规则列表rulelist。一个rulelist由若干个rule规则组成,每个rule由规则名rulename、定义方式define-as和元素elements构成。先来看解析代码:/* This file is one of the component a Context-free Gramm原创 2013-06-19 13:04:41 · 2191 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(十二)——alternation、concatenation、group和option
今天一鼓作气再写多点东西吧,这个题目差不多接近尾声了。来看看alternation、concatenation、group和option的解析代码:/* This file is one of the component a Context-free Grammar Parser Generator, which accept a piece of text as the原创 2013-06-18 13:29:11 · 1440 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(十一)——AbnfParser文法解析器之重复文法(repetition)
今天写的是关于重复文法的解析,ABNF和BNF相比,一个明显的差异就是引入了重复语法,使得我们可以方便的让一个文法元素重复若干次。例如30"B"表示30个字母B,30*60表示最少30个,最多60个字母B,等等。先来看看解析部分的代码:/* This file is one of the component a Context-free Grammar Parser Gen原创 2013-06-18 11:50:25 · 1871 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(十)——AbnfParser文法解析器之数值类型(num-val)
ANBF语法中的数值类型有3种:二进制、十进制和十六进制,可以是一个以点号分隔的数列,也可以是一个数值的范围。例如,%d11.22.33.44.55表示五个有次序的十进制数字“11、22、33、44、55”,而%x80-ff表示一个字节,这个字节的数值可以是在0x80至0xff之间。我把以点号分隔的数列定义为NumVal,把范围类型的数值定义为RangedNumVal。这两个类实现了Eleme原创 2013-06-17 13:17:45 · 1526 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(九)——AbnfParser文法解析器之带星号的情形(c-wsp和comment)
直接上代码吧,都写到注释里面了。/* This file is one of the component a Context-free Grammar Parser Generator, which accept a piece of text as the input, and generates a parser for the inputted context原创 2013-06-14 12:16:47 · 1625 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(八)——AbnfParser文法解析器之带星号的情形(如char-val, prose-val)
带星号*表示重复的次数,例如*A表示A可以重复0至任意多次,*3A表示A可以重复0次、1次、2次或3次,4*A表示A至少要重复4次。我们先来看最简单的情形*A,ABNF的语法定义中char-val和prose-val都属于这种。/* This file is one of the component a Context-free Grammar Parser Generator,原创 2013-06-13 17:16:30 · 1490 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(七)——AbnfParser文法解析器之多个选项的情形(如WSP、c-nl和element)
现在来看看对于产生式有多个选项的情形,例如WSP可以是空格SP或者跳格HTAB。对于这种情况,一般是向前看一个字符,根据这个字符来选择产生式。当然,如果两个产生式的起始字符都一样,那么只向前看一个字符就不够了,这种情况下需要向前看2个或者更多。WSP、c-nl和element的文法解析程序:/* This file is one of the component a Conte原创 2013-06-09 13:19:42 · 1657 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(六)——AbnfParser文法解析器之多个符号连接的情形(如rule和CRLF)
基于预测的文法分析器,一个明显的特点就是将非终结符定义为解析函数(方法),当非终结符号可以派生为其他非终结符号时,在解析函数中递归调用即可。这种方法的一个缺点,是难以处理需要回溯的情形,后面我们再详细分析。上次我们研究了诸如CR、LF、HTAB等单个字符的解析,这一篇来看看稍微复杂一点的多个符号连接的情形,包括CRLF和RULE两个符号。/* This file is one of the原创 2013-06-09 12:11:32 · 1473 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(五)——AbnfParser文法解析器之单字符的情形(如HTAB、LF、CR、SP)
先来看看AbnfParser类如何对ABNF文法中最简单的一些单字节符号如何进行解析,这些单字节符号包括跳格、换行、回车和空格:/* This file is one of the component a Context-free Grammar Parser Generator, which accept a piece of text as the input, and g原创 2013-06-08 15:26:47 · 1743 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(四)——准备单元测试代码
单元测试的重要性是不言而喻的,对于ABNF的例子来说,通过单元测试除了可以发现程序的BUG之外,还可以发现预测解析器能够支持哪些情况下的文法,以及那些情况下解析器无能为力(所谓FEATURE,嘿嘿)。我在这个项目中使用JUnit来做单元测试,先来看一段最简单的测试代码:/* This file is one of the component a Context-free Gra原创 2013-06-07 16:56:44 · 1835 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(三)——ABNF语法解析器的基本框架
前面说过,一个能够识别ABNF文法并且自动构造ABNF文法解析器的生成器(parser generator),它首先要能够识别ABNF文法,即把ABNF读入内存并结构化之后,才能进行后续的生成解析器的步骤。我把这个读入ABNF文法的模块称为AbnfParser类。下面先来看看这个类的基本结构:/* This file is one of the component a Contex原创 2013-06-06 15:14:53 · 3011 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(二)——ABNF语法元素的类定义
下面根据ABNF的语法定义,逐条来定义ANBF语法元素类:(一)首先来看rulelist:rulelist = 1*( rule / (*c-wsp c-nl) )rulelist(规则列表)是ABNF语法的最顶层的符号,也就说一份符合ABNF规定的文法,它就是一个rulelist。rulelist至少由一个rule(规则)组成,在Java语言中,我们直接使用List来定原创 2013-06-06 13:30:08 · 1941 阅读 · 0 评论 -
基于Predictive Parsing的ABNF语法分析器(一)——ABNF语法介绍
最近一直在做Session Initiation Protocol (SIP)协议方面的开发,SIP在电信VoIP领域应用非常广泛,是一个基于文本语法的协议。SIP的语法规范是使用ABNF来定义的。对SIP语法有兴趣的同学请移步其Augmented BNF for the SIP Protocol章节。Augmented BNF for Syntax Specifications: ABNF本原创 2013-06-06 10:33:34 · 3618 阅读 · 0 评论