确保表达式不以字符结尾的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_] )*
;