ANTLR语法层的选项.doc_第1页
ANTLR语法层的选项.doc_第2页
ANTLR语法层的选项.doc_第3页
ANTLR语法层的选项.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ANTLR语法层的选项ANTLR语法层的选项中可以设置一系列的键值从而影响ANTLR输出的代码。这些选项是全局的,除非在某条规 则中覆盖了这些选项,否则这些选项会影响到该语法中的所有元素。选项应该紧跟在语法头后面,具有如下的形式:options name1 = value1; name2 = vaule2; .选项中的名字必须 使用标识符(identifiers),但是其值可以为标识符、单引号括起来的字串、整数或者特殊的字串*(目前仅对选项K起作用)。目前的 ANTLR支持的语法层的选项主要包括:语言选项(Language)、输出选项(output)、回溯选项(backtrack)、记忆选项 (memorize)、记号词库(tokenVocab)、重写选项(rewrite)、超类选项(superClass)、过滤选项(Filter)、 AST标签类型(ASTLabelType)以及K选项。1. 语言选项语言选项指定了ANTLR将要产生的代码的目标语言,默 认情况下该选项设置为了Java。需要注意的是,ANTLR中的嵌入的动作必须要使用目标语言来写。如下面的例子:grammar T;options language=Java;a : . action-in-Java-language . ;ANTLR使用了特有的基于字串模板(StringTemplate-based)代码生成器,构建一个新的目标语言显得较为简单, 因此我们可以构建多种语言,诸如Java,C,C+,C#,Python,Objective-C,Ruby等等。语言选项让ANNTLR去模板目录 (例如org/antlr/codegen/templates/Java or org/antlr/codegen/templates/C)下寻找合适的模板,并使用模板来构建语言。该目录下包含大量的模板,我们可以向其中加入其 他的模板以满足我们的需求。但需要注意,这些模板所在路径应该在CALSSPATH这个环境变量中已经指明。2. 输出选项输出 选项控制了ANTLR输出的数据结构,目前支持两种输出:抽象语法树AST(Abstract Syntax Trees)和字串模板(StringTemplates)template。当output这个选项被设置后,所有的规则都被输出成了AST或者 template。output=AST允许我们使用树构造运算符或者重写规则。下面是一个简单的语法,它构造了一个虚拟的根节点 DECL,并用输入的记号ID来为这个根节点创建一个子节点:grammar T;options output=AST;decl : ID - (DECL ID) ;ID : a.z+ ;关于输出模板的问题在后面,暂时还没有看到。3. 回溯选项当回溯选项打开 的时候,在执行一个LL(K)失败的时候,ANTLR会返回至LL(K)开始而尝试其他的规则。4.记忆选项memoize选项 打开以后,每条解析方法(Paser Method)开始之前,ANTLR会首先检测以前的尝试结果,并在该方法执行完成之后记录该规则是否执行成功。但是注意,对于单条的规则打开此选项经常 比在全局上打开该规则效率更高。5. tokenVocab选项大型的工程中常常利用AST作为中间产物对输入进行多次分析并最 终生成代码。对AST的遍历时需要经常使用树语法(tree grammar),而tree grammar中经常需要将符号与其他的文件中的符号进行同步或者更新。tokenVocab实现了这个功能。例如我们定义了下面的一个语法文 件:grammar P;options output=AST;expr: INT (+ INT)* ;INT : 0.9 +;WS : | r | n ;利用该文件 生成了一个标记:P.token,并生成了语法树(AST)。这时我们需要一个用于遍历该AST的tree grammar,并通过tree grammar 中的tokenVocab选项来向其中更新tokens:tree grammar Dump;options tokenVocab=P; ASTLabelType=CommonTree;expr: ( + expr System.out.print(+ ); expr ) | INT System.out.print($INT.text); ;编译tree grammar的时候ANTLR默认会在当前目录下寻找.token文件,我们可以通过-lib选项来设置用于寻找.token文件的目录,例如:java org.antlr.Tool -lib . Dump.g6. 重写选项通过重写选项可以改变ANTLR对输入的默认处理规 则,一般用在输出为template的情况下。将该选项使能之后,ANTLR将一般的输入直接拷贝至输出,而将适于模板重写规则的输入做其他的处理。7. 超类选项用于指定一个超类。8. 过滤选项用于过滤一些感兴趣的输入。但是一般在词法分析上不常用到。9. AST标签类型10. TokenLabelType 11. K选项K选项用于限制对LL(K)进行语法分 析的次数,从而提高了ANTLR的解析速度。K只能为*或者数字,默认为*。属 性和动作动作(Actions)实际上是用目标语言写成的、嵌入到规则中的代码(以花括号包裹)。它们通常直接操作输入的标号,但是他们也可以 用来调用相应的外部代码。属性,到目前为止我的理解还不多,感觉像是C+中类里面的成员,一会看完应该会更清楚一些。1. 语法动作(Grammar Actions)动作(Actions)是指嵌在语法中的、用目标语言写成的代码片段。ANTLR则把这些代码(除了 用$或%标记的以外)逐字地插入到生成的识别器中。动作可以放到规则的外边,也可以嵌入到某条规则当中。当动作位于规则之外时候,这些动作同城定 义了一些全局的或者是类的成员(变量或者成员函数);而当其嵌入规则之中时,则用于执行某些特定的命令,这些命令在识别器识别了其预订的字符的时候就会开 始执行。例如下面的例子:parser grammar T;header package p;members int i; public TParser(TokenStream input, int foo) this(input); i = foo; aint x returns int yinit int z=0;after System.out.println(after matching rule; before finally);: action1 A action2 ;catchRecognitionException re System.err.println(error);finally do-this-no-matter-what 从中可以看出,前面的两个动作,head and members是两个处于规则之外的全局的动作,定义了一些变量和类;而后两个则分别在a这个规则的前后执行(init在前,after在后,这个 在前面提到过)。 这里针对两种类型详细叙述。1.1 全局动作ANTLR提供了几个全局动作以便让用户填充代码,这些全局动作 已经预先定义了名字和执行条件,例如前面代码中的head和members等等,其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论