具有多个赋值的Antlr令牌

具有多个赋值的Antlr令牌,antlr,token,antlr3,Antlr,Token,Antlr3,我有一个代币,我想有2个作业是有效的,我试图找出最好的方式来做 比如我有 TOSTRING = 'tostring' 但我也希望“toString”像这样有效: TOSTRING = 'toString' 实现这一目标的最佳方式是什么 编辑: 我想将其输出到*.token文件,如下所示 TOSTRING=9 'toString'=9 'tostring'=9 我使用该语言的代码使用此结构,将TOSTRING='TOSTRING'放在标记{}部分会生成此结构。即使只有一个赋值的lexer规则

我有一个代币,我想有2个作业是有效的,我试图找出最好的方式来做

比如我有

TOSTRING = 'tostring'
但我也希望“toString”像这样有效:

TOSTRING = 'toString'
实现这一目标的最佳方式是什么

编辑: 我想将其输出到*.token文件,如下所示

TOSTRING=9
'toString'=9
'tostring'=9

我使用该语言的代码使用此结构,将TOSTRING='TOSTRING'放在标记{}部分会生成此结构。即使只有一个赋值的lexer规则也能做到这一点。但是,当我有多个赋值时,令牌不是为“toString”或“toString”生成的。

最快的方法是定义lexer规则
toString
以同时接受这两种:

TOSTRING
    : 'tostring'   //alternative #1, lower-case 's'
    | 'toString'   //alternative #2, upper-case 'S'
    ;
或同等标准:

TOSTRING
    : 'to' ('s' | 'S') 'tring'
    ;

最快的方法是定义lexer规则
TOSTRING
,以接受这两种规则:

TOSTRING
    : 'tostring'   //alternative #1, lower-case 's'
    | 'toString'   //alternative #2, upper-case 'S'
    ;
或同等标准:

TOSTRING
    : 'to' ('s' | 'S') 'tring'
    ;

一般来说,不要使用tokens部分,因为您会失去对lexer的一些控制。始终使用真正的lexer规则。无论如何,tokens部分只是自动添加lexer规则。这没有什么区别,只是当您想要的不仅仅是一个简单的字符串时,您开始遇到限制

如果您想要案例独立性,请参阅以下文章:

但是通过LA()的重写(这里描述)来实现它,而不是“A”|“A”方法,这将生成大量您不需要的代码。如果只是这个驼峰案例,那么:

TOSTRING
    : 'to' ('s' | 'S') 'tring'
    ;

一般来说,不要使用tokens部分,因为您会失去对lexer的一些控制。始终使用真正的lexer规则。无论如何,tokens部分只是自动添加lexer规则。这没有什么区别,只是当您想要的不仅仅是一个简单的字符串时,您开始遇到限制

如果您想要案例独立性,请参阅以下文章:

但是通过LA()的重写(这里描述)来实现它,而不是“A”|“A”方法,这将生成大量您不需要的代码。如果只是这个驼峰案例,那么:

TOSTRING
    : 'to' ('s' | 'S') 'tring'
    ;

这已经是一个很好的答案,但现在它是一个更好的答案!;)在保留令牌分配的同时,有什么可以做的吗?”TOSTRING='@merjr我不知道你所说的“保留令牌分配”是什么意思。你能用一个你正在解析的输入和将解析它的语法的例子来更新这个问题吗?然后,我可以为答案添加更好的响应,而不是试图在注释中提供帮助。我试图在tokens{}部分中定义它。它当前定义为TOSTRING='TOSTRING'。我希望能够在语言中使用tostring和tostring。我很快会在问题中发布更多信息。@merjr,不,你不能在
tokens{…}
块中这样做。正如tenterhook建议的那样,您需要实际的lexer规则。没办法。这已经是一个很好的答案,但现在它是一个更好的答案!;)在保留令牌分配的同时,有什么可以做的吗?”TOSTRING='@merjr我不知道你所说的“保留令牌分配”是什么意思。你能用一个你正在解析的输入和将解析它的语法的例子来更新这个问题吗?然后,我可以为答案添加更好的响应,而不是试图在注释中提供帮助。我试图在tokens{}部分中定义它。它当前定义为TOSTRING='TOSTRING'。我希望能够在语言中使用tostring和tostring。我很快会在问题中发布更多信息。@merjr,不,你不能在
tokens{…}
块中这样做。正如tenterhook建议的那样,您需要实际的lexer规则。没办法。我错过了问题中的“我的代码…使用此结构”,对不起。如果您想在代码中读取.token文件,请注意ANTLR只会在其中创建令牌名称和令牌ID的关联。生成lexer/parser之后没有的东西是ANTLR不关心的。你的代码对这个文件做了什么?我们能谈谈找一个替代阅读它的方法吗?我错过了问题中的“我的代码…使用这个结构”,对不起。如果您想在代码中读取.token文件,请注意ANTLR只会在其中创建令牌名称和令牌ID的关联。生成lexer/parser之后没有的东西是ANTLR不关心的。你的代码对这个文件做了什么?我们能谈谈找一个替代阅读它的方法吗?