使用ANTLR,标记规则的组件以及高级替代方案通常非常有帮助。
如果解析器规则的一部分只能是一个具有单个类型的东西,那么通常默认的访问器就可以了。但是,如果你有几个基本上是“同一件事”的替代方案,或者你在解析器规则中不止一次有相同的子规则引用,并且想区分它们,那么给它们命名是非常方便的。(一旦你开始这样做,并看到对Context类的影响,它们提供价值的地方就会变得非常明显。)
此外,当规则有多个顶级替代方案时,给每个规则一个标签是非常方便的。这将导致ANTLR为每个备选方案生成一个单独的Context类,而不是将每个备选方案中的所有内容都转储到一个类中。
(编一些东西只是为了得到一个有效的编译)
grammar WaveParser
;
any_operator
: value_operator # val_op
| stack_operator # stack_op
| logic_operator # logic_op
| math_operator # math_op
| flow_control_operator # flow_op
;
value_operator: op = ( BIND | DEF);
stack_operator
: op = (
DUP
| EXCH
| POP
| COPY
| ROLL
| INDEX
| CLEAR
| COUNT
)
;
logic_operator: op = (AND | OR);
math_operator: op = (ADD | SUB);
flow_control_operator: op = (FLOW1 | FLOW2);
AND: 'and';
OR: 'or';
ADD: '+';
SUB: '-';
FLOW1: '>>';
FLOW2: '<<';
BIND: 'bind';
DEF: 'def';
DUP: 'dup';
EXCH: 'exch';
POP: 'pop';
COPY: 'copy';
ROLL: 'roll';
INDEX: 'index';
CLEAR: 'clear';
COUNT: 'count';