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
必须与规则中的第一个相同?
您可以在forloop
规则末尾添加一个谓词,强制两个VARNAME
s相等:
forloop
: FOR a=VARNAME EQUAL INT TO INT instructions NEXT b=VARNAME
{$a.getText().equals($b.getText())}?
;
Run Code Online (Sandbox Code Playgroud)
但是(IMO)更好的方法是让解析器只接受不等的VARNAME
s并在解析完成后检查它们(在某种遍历解析树的验证监听器中).