你是否正在寻找关于语法分析器的内容?让我把最直接的东西奉献给你:
1 ANTLR简介
ANTLR—A,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。ANTLR可以通过断言(Predicate)解决识别冲突;支持动作(Action)和返回值(Return Value)来;更棒的是,它可以根据输入自动生成语法树并可视化的显示出来(这一点我将在下面的例子中演示)。由此,计算机语言的翻译变成了一项普通的任务—在这之前YACC/LEX显得过于学院派,而以LL(k)为基础的ANTLR虽然在效率上还略有不足,但是经过近些年来的升级修改,使得ANTLR足以应付现存的绝大多数应用。感谢Terence Parr博士和他的同事们十几年来的出色工作,他们为编译理论的基础和语言工具的构造做了大量基础性工作,也直接导致了俄ANTLR的产生。nother Tool for Language Recognition
1.1词法分析器(Lexer)
词法分析器又称为Scanner,Lexical analyser和Tokenizer。程序设计语言通常由关键字和严格定义的语法结构组成。编译的最终目的是将程序设计语言的高层指令翻译成物力机器或虚拟机可以执行的指令。此法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组(也就是一个一个的Token)括关键字,标识符,符号(symbols)和操作符供语法分析器使用。
1.2语法分析器(Parser)
编译器又称为Syntactical analyser。在分析字符流的时候,Lexer不关心所生成的单个Token的语法意义及其与上下文之间的关系,而这就是Parser的工作。语法分析器将收到的Tokens组织起来,并转换成为目标语言语法定义所允许的序列。
无论是Lexer还是Parser都是一种识别器,Lexer是字符序列识别器而Parser是Token序列识别器。他们在本质上是类似的东西,而只是在分工上有所不同而已。
1.3ANTLR
ANTLR将上述两者结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的词法分析规则。然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。
2 ANTLR的使用
2.1安装及使用
到下载最新版本的ANTLR开发包和源码(例如版本2.7.5)。将antlr-2.7.5.jar所在目录配置到你的环境变量中,写好语法文件(例如SensorSQL.g),运行命令“java antlr.Tool SensorSQL.g”就可以获得自动生成语法/词法分析器。

2.2ANTLR语法文件解析

下面我们对图中所描述的ANTLR语法文件做一些详细的分析。为了更好的使用ANTLR,你还可以下载ANTLR的Eclipse插件来帮助你完成工作。
1. header域:所有出现在这里的部分,都会出现在由ANTLR编译之后生成的Java文件的最顶部。在本例中你可以将包名和其他信息放到这一区域中,生成的结果如由面对应代码部分所示。
2. 你在这一部分所提供的内容对于文件中的每个语法都是唯一的。这一区域的内容将出现在实际的类定义之前。也就是说,两个import仅属于类CalcParser,而不属于在同一个文件中定义的其他类(如CalcLexer)
3. 这里是语法定义部分,你同样可以将它看成是类定义。
4. 在Option域中,你可以为你的语法提供可选项。例如是否建立缺省的抽象语法树,指定LL(K)中的参数k的值(缺省为1)等等,更详细的参数请参阅ANTLR自带的手册。
5. Token部分用来声明那些在词法分析器中没有被声明的“想象的”token。这些信息通常用在TreeParser中指定“想象”的节点。
6. 这是另一个Action区,ANTLR将会忠实地将这一区域内的信息放置到类的定义当中,相当于类的成员方法,主要为用户提供一种在Parser种定制可扩展方法的途径。

在ANTLR的语法文件中,一个规则的定义是与一个由ANTLR生成的Java源文件相对应的。
1,2,3,4:正如你所看到的那样,我们可以在一个规则定义中作与一个函数等价的所有事情。我们可以为规则指定参数(像上面的int a),制定返回值(int c),甚至抛出一个异常。从右半面我们可以清楚地看到,所有在规则中定义的内容都被忠实而准确的翻译到Java源文件的相应位置。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-18518-1.html
有必要强制回归