Antlr 如何创建包含同一令牌的多个事件的规则?
我正在使用ANTLR4解析一种简单的脚本语言 此语言对循环使用以下语法:Antlr 如何创建包含同一令牌的多个事件的规则?,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,我正在使用ANTLR4解析一种简单的脚本语言 此语言对循环使用以下语法: FOR [I] = 1 to [N] instructions NEXT [I] 为了正确,FOR循环的FOR关键字和NEXT关键字后面必须有完全相同的标记 例如,这是正确的: FOR I = 1 TO 10 NEXT I 虽然这是不正确的: FOR I = 1 TO 10 NEXT J 到目前为止,我有一条规则如下: forloop : FOR VARNAME EQUAL INT TO INT ins
FOR [I] = 1 to [N]
instructions
NEXT [I]
为了正确,FOR循环的FOR
关键字和NEXT
关键字后面必须有完全相同的标记
例如,这是正确的:
FOR I = 1 TO 10
NEXT I
虽然这是不正确的:
FOR I = 1 TO 10
NEXT J
到目前为止,我有一条规则如下:
forloop
: FOR VARNAME EQUAL INT TO INT instructions NEXT VARNAME
;
使用以下相关的lexer规则(我删除了常量关键字,例如:'FOR';):
然而,这条规则将第二个实际不正确的示例解释为正确
如何告诉ANTLR4规则中的第二个VARNAME
必须与第一个相同?您可以在forloop
规则的末尾添加一个谓词,强制执行两个VARNAME
相等:
forloop
: FOR a=VARNAME EQUAL INT TO INT instructions NEXT b=VARNAME
{$a.getText().equals($b.getText())}?
;
但是(IMO)更好的方法是让解析器只接受不相等的VARNAME
s,并在解析完成后检查它们(在某种遍历解析树的验证侦听器中)
forloop
: FOR a=VARNAME EQUAL INT TO INT instructions NEXT b=VARNAME
{$a.getText().equals($b.getText())}?
;
但是(IMO)更好的方法是让解析器只接受不相等的
VARNAME
s,并在解析完成后检查它们(在某种穿越解析树的验证侦听器中)。谢谢!仔细想想,我认为你是对的,但是知道如何添加这样的谓词还是很好的:)实际上我在使用C,所以我将谓词转换为C代码:{$a.Text==$b.Text}?
。遗憾的是,我有以下错误:错误AC0066:属性“Text”不是“$a.Text”中的有效属性。
但是,如果我与调试器断开连接(使用一个简单的编译谓词),则Text属性似乎可以访问并正确定义(从IToken
接口)。有人在使用C#?@Benlitz时遇到过这样的问题,当时不是有一个$a.GetText()
方法吗?实际上我不得不使用小写$a.text
,即使C#属性是text。从antlr4cs
的作者那里,这也适用于java(请参阅)。谢谢!仔细想想,我认为你是对的,但是知道如何添加这样的谓词还是很好的:)实际上我在使用C,所以我将谓词转换为C代码:{$a.Text==$b.Text}?
。遗憾的是,我有以下错误:错误AC0066:属性“Text”不是“$a.Text”中的有效属性。
但是,如果我与调试器断开连接(使用一个简单的编译谓词),则Text属性似乎可以访问并正确定义(从IToken
接口)。有人在使用C#?@Benlitz时遇到过这样的问题,当时不是有一个$a.GetText()
方法吗?实际上我不得不使用小写$a.text
,即使C#属性是text。从antlr4cs
的作者那里,这也适用于java(请参阅)。