识别和处理编程语言是 Antlr 的首要任务,编程语言的处理是一项繁重复杂的任务,为了简化处理,一般的编译技术都将语言处理工作分为前端和后端两个部分。其中前端包括词法分析、语法分析、语义分析、中间代码生成等若干步骤,后端包括目标代码生成和代码优化等步骤。
Antlr 致力于解决编译前端的所有工作(不包括目标代码生成)。使用 Anltr 的语法可以定义目标语言的词法记号和语法规则,Antlr 自动生成目标语言的词法分析器和语法分析器;此外,如果在语法规则中指定抽象语法树的规则,在生成语法分析器的同时,Antlr 还能够生成抽象语法树;最终使用树分析器遍历抽象语法树,完成语义分析和中间代码生成。整个工作在 Anltr 强大的支持下,将变得非常轻松和愉快。
文本处理
当需要文本处理时,首先想到的是正则表达式,使用 Anltr 的词法分析器生成器,可以很容易的完成正则表达式能够完成的所有工作;除此之外使用 Anltr 还可以完成一些正则表达式难以完成的工作,比如识别左括号和右括号的成对匹配等。
先来看一张图片
字符序列:程序代码存放在程序文本里的表现形式被词法分析后生成记号序列(ex: if (x > 5 ) 这样的 i f ( x > 5 ) 这样就叫一个个字符流)
词法分析:将字符序列解析成记号序列(了解转移图的概念)
记号序列:一个个token流
语法分析:检查这个程序的语法是否合法,符合语言规则, 然后在内存当中建立一个抽象语法树这样的数据结构.
语言规则: 三型文法(正则表达式) 二型文法(上下文无关文法) 一型文法(上下文有关文法) 零型文法(任意文法).
这里只讨论上下文无关文法
上下文无关文法是一个四元组G = (T, N, P, S) 其中T是终结符集合,N是非终结符集合, P是一组产生式规则用来联系终结符集 合和非终结符集合,S是唯一的开始符号. ex:如下图
分析树和二义性文法
E-> num
| id
| E + E
| E * E
能否推导出句子 3 + 4 * 5
显然通过下面两个推导式可看出上面的文法是一个二义性文法, 造成的后果就是会生成不同的分析树 如图(a) 和图(b)
E -> E + E
-> 3 + E
-> 3 + E * E
-> 3 +