Antlr 如何创建包含同一令牌的多个事件的规则?

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

我正在使用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 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(请参阅)。