如何制定包含同一令牌的几个出现的规则?

Ben*_*itz 1 grammar antlr antlr4

我正在使用ANTLR4来解析一个简单的脚本语言.

此语言对FOR循环使用以下语法:

FOR [I] = 1 to [N]
   instructions
NEXT [I]
Run Code Online (Sandbox Code Playgroud)

为了正确,FOR循环必须在FOR关键字之后和NEXT关键字之后具有完全相同的标记.

例如,这是正确的:

FOR I = 1 TO 10
NEXT I
Run Code Online (Sandbox Code Playgroud)

虽然这是不正确的:

FOR I = 1 TO 10
NEXT J
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有一个看起来像这样的规则:

forloop
    : FOR VARNAME EQUAL INT TO INT instructions NEXT VARNAME
    ;
Run Code Online (Sandbox Code Playgroud)

使用以下相关词法规则(我删除了常量关键字FOR : 'FOR';):

fragment ALPHA : [a-zA-Z_];
fragment ALPHANUM : [a-zA-Z_0-9];
fragment DIGIT : [0-9];
VARNAME : ALPHA ALPHANUM*;
INT : DIGIT+;
Run Code Online (Sandbox Code Playgroud)

但是,此规则将解释为第二个实际上不正确的示例.

如何告诉ANTLR4第二个VARNAME必须与规则中的第一个相同?

Bar*_*ers 5

可以forloop规则末尾添加一个谓词,强制两个VARNAMEs相等:

forloop
    : FOR a=VARNAME EQUAL INT TO INT instructions NEXT b=VARNAME
      {$a.getText().equals($b.getText())}?
    ;
Run Code Online (Sandbox Code Playgroud)

但是(IMO)更好的方法是让解析器只接受不等的VARNAMEs并在解析完成后检查它们(在某种遍历解析树的验证监听器中).