确保表达式不以字符结尾的ANTLR4 lexer规则

确保表达式不以字符结尾的ANTLR4 lexer规则,antlr4,lexer,Antlr4,Lexer,给定以下示例,我有一个需要匹配的语法: some-Text->more-Text 从这个例子中,我需要ANTLR4词法规则,将“一些文本”和“更多文本”匹配到一个词法规则中,并将“->”作为另一个规则 我使用如下所示的lexer规则作为起点,但问题是,NAMEDELEMENT规则中允许使用“-”字符,这会导致第一个NAMEDELEMENT匹配变成“some Text-”,然后导致边规则无法捕获“->” 我正在寻找一种方法,以确保在NAMEDELEMENT规则(或产生所需结果的其他替代方法

给定以下示例,我有一个需要匹配的语法:

some-Text->more-Text
从这个例子中,我需要ANTLR4词法规则,将“一些文本”和“更多文本”匹配到一个词法规则中,并将“->”作为另一个规则

我使用如下所示的lexer规则作为起点,但问题是,NAMEDELEMENT规则中允许使用“-”字符,这会导致第一个NAMEDELEMENT匹配变成“some Text-”,然后导致边规则无法捕获“->”

我正在寻找一种方法,以确保在NAMEDELEMENT规则(或产生所需结果的其他替代方法)中,不会将“-”捕获为最后一个字符

我试图使用上面的谓词来查找'-'和'>'的序列,但它似乎不起作用。实际上,它似乎没有做任何事情,因为无论是否使用谓词,都会得到相同的解析结果

解析器规则如下所示,其中我匹配的是“选择器”规则:

selector
    :   namedelement (edge namedelement)*
    ;

edge
    :   EDGE
    ;

namedelement
    :   NAMEDELEMENT
    ;

提前谢谢

经过几个小时的讨论,我有了一个有效的语法,尽管我看不出它在功能上与我在原始问题中发布的有什么不同

(我使用未注释的版本,以便在生成的lexer中放置断点,以确保平等性测试的计算正确。)


我的目标语言是JavaScript,谓词的注释和未注释形式都可以正常工作

经过几个小时的讨论,我有了一个有效的语法,尽管我看不出它在功能上与我在原始问题中发布的有什么不同

(我使用未注释的版本,以便在生成的lexer中放置断点,以确保平等性测试的计算正确。)

我的目标语言是JavaScript,谓词的注释和未注释形式都可以正常工作

试试这个:

NAMEDELEMENT
 : [a-zA-Z_@] ( '-' {_input.LA(1) != '>'}? | [a-zA-Z0-9_] )*
 ;
不确定input.LA(1)!='>'在JavaScript运行时可以使用,但在Java中,它正确地将
“some-->more”
标记为
“some-”
“->”和
“more”

尝试以下操作:

NAMEDELEMENT
 : [a-zA-Z_@] ( '-' {_input.LA(1) != '>'}? | [a-zA-Z0-9_] )*
 ;
不确定input.LA(1)!='>'
在JavaScript运行时是可以的,但在Java中,它正确地将
“some-->more”
标记为
“some-”
“->”和
“more”

NAMEDELEMENT
 : [a-zA-Z_@] ( '-' {_input.LA(1) != '>'}? | [a-zA-Z0-9_] )*
 ;