-
语法分析其实就是按照事先定义好的语法,对词法分析器返回的
Token
与语法元素进行匹配,若是发现不匹配则报错。本程序采用递归下降语法分析器进行分析。那么该如何与预定义的语法进行匹配呢?这就要用到
FIRST
集合与FOLLOW
集合了。其实也并没有辣么理论化,只需要根据当前读取到的Token
判断应该进入哪个处理函数就行了。比如读到while
就知道要进入while
的处理函数;读到if
就知道要处理if
了。进入处理函数之后,我们定义一个
expect(Token)
函数来期待接下来的Token
。传入期待的Token
,要是与接下来读取到的Token
匹配,就继续往下分析,要是不匹配,就抛出异常,停止分析。
-
首先,需要根据CMM词法特性构造出其对应的
DFA
,然后再根据DFA
构造其状态转换表,再根据状态转换表构建分析程序。DFA
中,每个结束状态都表示成功识别一个词法单元。当成功识别一个词法单元之后,重新回到DFA中的开始状态,再次进行识别,直到EOF
为止。理论上,需要维护一个状态转换表,其结构为一维数组。数组角标对应于DFA中的状态编号,其值为一个
dict
,dict
中存储了状态转换键值对。其中,key
对应于DFA中的转移字符,value
对应于转换后的状态。终止状态对应于其识别到的TOKEN
。然而,由于构建的
DFA
比较简单,lexer
处理程序中并没有机械性地根据状态转换表进行识别,而是根据DFA
直接采用传统的if-else
结构进行词法分析。(其实是因为刚开始没有想到用状态转换表,写完了才意识到;而且转换表的状态太多了,还不如就用if-else判断方便)
-
顾名思义,JavaCC是一个词法分析器和语法分析器的生成工具。其主要功能是通过用户给定的文法规则,生成一个纯Java语言编写的语法分析器。用户输入一段测试字符串,该分析器就能判断该字符串是否满足该文法的规则。检测合法性的同时,也可以生成该字符串的语法分析树。另外,该工具还能根据用户定义的模板文件生成对应的描述该语言的文档。
通常所说的javacc指的是
javacc.jar
这个jar包,jar包中包含三个主要可执行类- javacc 根据模板文件生成语法分析器
- jjtree 根据模板文件生成语法生成树
- jjdoc 根据模板文件生成对应语言的文档