ANTLR全局规则范围内声明VS @members声明(antlr global rule scop

2019-07-29 10:17发布

你更喜欢哪一个声明在这种情况下,全球范围内或@members声明一个变量? 在我看来,他们可以服务于同样的目的?

在这里更新是一个语法来解释我的意思。

grammar GlobalVsScope;

scope global{
  int i;
}
@lexer::header{package org.inanme.antlr;}
@parser::header{package org.inanme.antlr;}

@parser::members {
  int j;
}

start
scope global;
@init{
  System.out.println($global::i);
  System.out.println(j);
}:R EOF;

R:'which one';

Answer 1:

需要注意的是,除了全球(ANTLR)范围,你也可以有当地规则范围,就像这样:

grammar T;

options { backtrack=true; }

parse
scope { String x; }
parse
 : 'foo'? ID {$parse::x = "xyz";} rule*
 | 'foo' ID
 ;

rule
 : ID {System.out.println("x=" + $parse::x);}
 ;  

我会考虑使用本地规则范围的唯一时间是当有很多谓词,或全球回溯启用(导致所有规则,让在他们面前的谓词)。 在这种情况下,你可以创建一个成员变量String x (或在全局范围内定义),并设置它在parse规则,但你可能会改变这种情况下/ scope变量之后,解析器可以原路返回,这回溯会不会造成全局变量被设置为它的原始形式/状态! 局部范围的变量也不会是“未设置”,但很可能会少一个危险的:他们是本地的一个规则。

总结:是的,你是对的,全球范围和成员/实例变量是相像。 但我宁愿选择为成员变量,因为友好的语法。



文章来源: antlr global rule scope declaration vs @members declaration
标签: antlr antlr3