ANTLR语法层的选项及动作 - ANTLR

来源:互联网 发布:Linux用wine玩英雄联盟 编辑:程序博客网 时间:2024/04/26 18:13

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.g

6. 重写选项
通过重写选项可以改变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;
}
}
a[int x] returns [int y]
@init {int z=0;}
@after {System.out.println("after matching rule; before finally");}
: {《action1》} A {《action2 》}
;
catch[RecognitionException re] {
System.err.println("error");
}
finally { 《do-this-no-matter-what 》 }

从中可以看出,前面的两个动作,@head and @members是两个处于规则之外的全局的动作,定义了一些变量和类;而后两个则分别在a这个规则的前后执行(@init在前,@after在后,这个 在前面提到过)。 这里针对两种类型详细叙述。

1.1 全局动作
ANTLR提供了几个全局动作以便让用户填充代码,这些全局动作 已经预先定义了名字和执行条件,例如前面代码中的head和members等等,其含义分别为:
header ——这里的代码段将会出现在识别器的类定义之前。通常,也就是程序开始时候的包的定义和引入之前。
members ——指定了实例变量和方法。
rulecatch —— 用来取代默认的、进行出错处理的程序。
synpredgate ——用于改变默认的syntax predict date

1.2 嵌入动作——基本上前面已经全了。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅族手机相册的密码忘了怎么办 手机百度网盘本地空间不足怎么办 百度网盘保存视频内存不够怎么办 别人的百度网盘链接打不开怎么办 百度网盘视频插件升级失败怎么办 退苹果id重新登陆照片没了怎么办 苹果升级后照片效果没了怎么办 360云盘个人云盘停止服务怎么办 小米手机账号掉了手机卡没了怎么办 百度网盘下载后不能注册怎么办 微信发出的文件无法撤回怎么办 微信群发错消息无法撤回怎么办 百度网盘登录要验证码怎么办 百度网盘备份记录怎么办能删掉 手机酷狗听歌耳机声音太小了怎么办 苹果6s微信通话声音变粗怎么办 千千静听多个列表合成一个了怎么办 别人用手机号注册了邮箱怎么办 微信身份信息验证未通过怎么办 快递地址填错了已经发到了怎么办 孩子威胁同学给她买东西吃怎么办 在超市买小孩米粉过期了怎么办 出口货物被海关扣了说仿牌怎么办 有一批仿牌被宁波海关查了怎么办 付了定金不想要车了怎么办 泥墙刮石灰上涂料现在刮腻子怎么办 月经最后一天同房了怎么办吃什么药 奶水太多了宝宝总是呛到了怎么办 婴儿刚吃完奶大量喷奶怎么办 我干活细致领导说我慢怎么办 怀孕初期吃了加明矾的粉皮怎么办 绿豆面黄豆面白面蒸馒头怎么办 画油画时把颜料染在衣服上怎么办 买的布衣柜少了一个管子怎么办 小2球刚好进2球怎么办 大2球刚好进2球怎么办 大球2进了2球怎么办 身上剩的几百块钱有掉了怎么办 刚买一天的手机电板有问题怎么办 宝宝长湿疹穿少了就感冒怎么办 照片跟视频被孩子删了怎么办