Antlr学习笔记

上传人:飞*** 文档编号:47798735 上传时间:2018-07-05 格式:PDF 页数:7 大小:907.66KB
返回 下载 相关 举报
Antlr学习笔记_第1页
第1页 / 共7页
Antlr学习笔记_第2页
第2页 / 共7页
Antlr学习笔记_第3页
第3页 / 共7页
Antlr学习笔记_第4页
第4页 / 共7页
Antlr学习笔记_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《Antlr学习笔记》由会员分享,可在线阅读,更多相关《Antlr学习笔记(7页珍藏版)》请在金锄头文库上搜索。

1、Antlr学习笔记一、 关于 Antlr ANTLR Another Tool for Language Recognition,其前身是PCCTS ,它为包括Java ,C+ ,C# 在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer) ,编译器( parser )和解释器(translator)的框架。 ANTLR可以通过断言(Predicate)解决识别冲突;支持动作(Action )和返回值( Return Value )来;更棒的是,它可以根据输入自动生成语法树并可视化的显示出来(这一点我将在下面的例子中演示)。由此,计算机语言的翻译变成了一项普通的任

2、务在这之前YACC/LEX显得过于学院派,而以LL(k)为基础的 ANTLR 虽然在效率上还略有不足,但是经过近些年来的升级修改,使得 ANTLR 足以应付现存的绝大多数应用。感谢Terence Parr博士和他的同事们十几年来的出色工作,他们为编译理论的基础和语言工具的构造做了大量基础性工作,也直接导致了ANTLR 的产生。Antlr的特点:1.1词法分析器( Lexer )词法分析器又称为Scanner ,Lexical analyser和 Tokenizer 。程序设计语言通常由关键字和严格定义的语法结构组成。编译的最终目的是将程序设计语言的高层指令翻译成物理机器或虚拟机可以执行的指令。

3、词法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组(也就是一个一个的Token) ,包括关键字,标识符,符号( symbols )和操作符供语法分析器使用。1.2语法分析器( Parser )编译器又称为Syntactical analyser 。在分析字符流的时候,Lexer 不关心所生成的单个 Token 的语法意义及其与上下文之间的关系,而这就是Parser 的工作。语法分析器将收到的 Tokens 组织起来, 并转换成为目标语言语法定义所允许的序列。无论是Lexer 还是 Parser 都是一种识别器,Lexer 是字符序列识别器而Parser 是 Token

4、 序列识别器。他们在本质上是类似的东西,而只是在分工上有所不同而已。1.3树分析器 (tree parser) 树分析器可以用于对语法分析生成的抽象语法树进行遍历,并能执行一些相关的操作。1.4ANTLR ANTLR 将上述结合起来,它允许我们定义识别字符流的词法规则和用于解释Token 流的词法分析规则。然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式 (如 AST Abstract Syntax Tree,抽象的语法树) 。二、Antlr的安装1、安装 java JDK 安装地址: http:/ 并设置环境变量2

5、、安装 Antlr 下载地址: http:/www.antlr.org/download.html。ANTLR 也提供了工具 ANTLRWorks 可以编辑语法文件。3、使用 AntlrWorks 三、对计算器功能的词法语法分析器的自动实现实例分析计算器程序网上有的是,在这里就不多说了,直接来看Antlr对于词法语法分析的处理构建( build )由 ANTLR 生成的 C+程序需要一个运行库的支持。我们可以选择这些代码其编译为静态链接库或者动态链接库。首先使用 VS新建一个名为ANTLRLib的 Win32的静态链接库的工程, 不要选择“Pre-compiled Header”和“ MFC

6、support ”选项。点击菜单“ Project”“Add to Project”“Files,”,将Antlr-2.7.4libcppsrc下面的除了dll.cpp之外的所有文件加入到工程中(注意一定不要加入dll.cpp,否则无法通过编译)。此时 build整个工程,就可以生成ANTLR 的运行库文件ANTLRLib.liboptions language=“Cpp“; 这里表示设定生成的程序为C+ 语言/ tokens LPAREN :(; RPAREN :); PLUS :+; MINUS :-; STAR :*; SLASH :/; NUM :(0.9)(0.9)*(.(0.9)*

7、)?; RETURN :n; 这里设定各个字符所包含的内容注意, token 下的需大写/ rules expr returns double value=0 double x; : value=term(PLUS x=term value+=x;|MINUS x=termvalue-=x;)* ; term returns double value=0 double x; : value=factor(STAR x=factor value*=x;|SLASH x=factor value /= x;)* ; factor returns double value =0 double x;

8、: value = atom (TOK_POW x = atom value = pow(value,x); )* ; 这里设定规则rules 规则的定义形式和编译理论中的扩展巴科斯范式(EBNF )极为相似, 包括规则名、 规则体、一个用作结束标志的分号和异常处理部分(可省略)。全文如下:header options language=“Cpp“; class ExprParser extends Parser; / rules expr returns double value=0 double x; : value=term(PLUS x=term value+=x;|MINUS x=t

9、ermvalue-=x;)* ; term returns double value=0 double x; : value=factor(STAR x=factor value*=x;|SLASH x=factor value /= x;)* ; factor returns double value =0 double x; : value = atom (TOK_POW x = atom value = pow(value,x); )* ; class ExprLexer extends Lexer; options k=1; caseSensitive = false; / token

10、s LPAREN :(; RPAREN :); PLUS :+; MINUS :-; STAR :*; SLASH :/; NUM :(0.9)(0.9)*(.(0.9)*)?; RETURN :n; / white space WS : ( | t ) $setType(ANTLR_USE_NAMESPACE(antlr)Token:SKIP); ; 在这里我省略了小数的处理、以及异常处理部分将该文件保存为test.g( g是默认的文法文件的扩展名)。在该文法文件中,定义了一个分析器类ExprParser和一个词法扫描器类ExprLexer 。ANTLR会为两个类分别生成头文件和实现文件。现

11、在需要由文法文件生成分析器的源代码,然后再添加其他的一些代码,最后编译这些代码,过程略显繁琐。因此这里借助VS作为开发环境来组织工程,简化步骤。使用 VS新建一个名为AntlrCpp的 Win32控制台的项目。 将文法文件test.g添加到工程中。在 VS的 FileView中右键点击该文法文件,在弹出菜单中选择 “Settings,” ,选择“Custom Build ”标签页 ,在“ Commands ”里面填入调用ANTLR 编译文法文件的命令:java -cp C:SoftwareAntlrantlr-3.4antlr.jar antlr.Tool -o “$(WkspDir)“ $(

12、InputName).g 在“ Outputs ”里面填入ANTLR 编译文法文件后要生成的所有文件的名字,如下:ExprLexer.cpp ExprLexer.hpp ExprParser.cpp ExprParser.hpp ExprParserTokenTypes.hpp ExprParserTokenTypes.txt 设置完成之后, 就可以编译该文法文件了:选中该文法文件, 执行编译操作。 在 VS的 Output窗口里面会显示出如下的内容:-Configuration: AntlrCpp - Win32 Debug- Performing Custom Build Step on .testjava.g ANTLR Parser Generator Version 3.4 1989-2011 jG ExprLexer.cpp - 0 error(s), 0 warning(s) 此时,分析器的源代码已经生成。再次点击菜单 “Project” “Add To Project” “Files ” ,将生成的所有cpp 文件和 hpp 文件添加到工程中。四、总结这次通过VS 以及 Antlr自动生成的例子,学习了Antlr的语法,并对有关代码进行了改写,对计算器的解释器进行了实现,达到了最初的目的,收获颇多。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号