确保表达式不以字符结尾的 ANTLR4 词法分析器规则
ANTLR4 lexer rule ensuring expression does not end with character
根据以下示例,我有一个语法需要匹配:
some-Text->more-Text
在这个例子中,我需要将 'some-Text' 和 'more-Text' 匹配到一个词法分析器规则中的 ANTLR4 词法分析器规则,并将“->”作为另一条规则。
我正在使用下面显示的词法分析器规则作为起点,但问题是,NAMEDELEMENT 规则中允许使用“-”字符,这导致第一个 NAMEDELEMENT 匹配项变为 'some-Text-',这然后导致“->”不被 EDGE 规则捕获。
我正在寻找一种方法来确保“-”不会被捕获为 NAMEDELEMENT 规则(或产生所需结果的其他替代方法)中的最后一个字符。
EDGE
: '->'
;
NAMEDELEMENT
: ('a'..'z'|'A'..'Z'|'_'|'@') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')* { _input.LA(1) != '-' && _input.LA(2) != '>' }?
;
我正在尝试使用上面的谓词来查找一系列“-”和“>”,但它似乎不起作用。它似乎根本没有做任何事情,实际上,无论是否使用谓词都会得到相同的解析结果。
解析器规则如下,我匹配的是'selector'规则:
selector
: namedelement (edge namedelement)*
;
edge
: EDGE
;
namedelement
: NAMEDELEMENT
;
提前致谢!
在弄乱了几个小时之后,我有了一个有效的语法,尽管我看不出它在功能上与我在原始问题中发布的内容有何不同。
(我使用未注释的版本,以便我可以在生成的词法分析器中放置一个断点,以确保相等性测试正在正确评估。)
NAMEDELEMENT
//: [a-zA-Z_@] [a-zA-Z_-]* { String.fromCharCode(this._input.LA(1)) != ">" }?
: [a-zA-Z_@] [a-zA-Z_-]* { (function(a){
var c = String.fromCharCode(a._input.LA(1));
return c != ">";
})(this)
}?
;
我的目标语言是 JavaScript 并且谓词的注释和未注释形式都可以正常工作。
试试这个:
NAMEDELEMENT
: [a-zA-Z_@] ( '-' {_input.LA(1) != '>'}? | [a-zA-Z0-9_] )*
;
不确定 _input.LA(1) != '>'
是否适用于 Java 脚本运行时,但在 Java 中它正确地将 "some-->more"
标记为 "some-"
、"->"
和 "more"
.
根据以下示例,我有一个语法需要匹配:
some-Text->more-Text
在这个例子中,我需要将 'some-Text' 和 'more-Text' 匹配到一个词法分析器规则中的 ANTLR4 词法分析器规则,并将“->”作为另一条规则。
我正在使用下面显示的词法分析器规则作为起点,但问题是,NAMEDELEMENT 规则中允许使用“-”字符,这导致第一个 NAMEDELEMENT 匹配项变为 'some-Text-',这然后导致“->”不被 EDGE 规则捕获。
我正在寻找一种方法来确保“-”不会被捕获为 NAMEDELEMENT 规则(或产生所需结果的其他替代方法)中的最后一个字符。
EDGE
: '->'
;
NAMEDELEMENT
: ('a'..'z'|'A'..'Z'|'_'|'@') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')* { _input.LA(1) != '-' && _input.LA(2) != '>' }?
;
我正在尝试使用上面的谓词来查找一系列“-”和“>”,但它似乎不起作用。它似乎根本没有做任何事情,实际上,无论是否使用谓词都会得到相同的解析结果。
解析器规则如下,我匹配的是'selector'规则:
selector
: namedelement (edge namedelement)*
;
edge
: EDGE
;
namedelement
: NAMEDELEMENT
;
提前致谢!
在弄乱了几个小时之后,我有了一个有效的语法,尽管我看不出它在功能上与我在原始问题中发布的内容有何不同。
(我使用未注释的版本,以便我可以在生成的词法分析器中放置一个断点,以确保相等性测试正在正确评估。)
NAMEDELEMENT
//: [a-zA-Z_@] [a-zA-Z_-]* { String.fromCharCode(this._input.LA(1)) != ">" }?
: [a-zA-Z_@] [a-zA-Z_-]* { (function(a){
var c = String.fromCharCode(a._input.LA(1));
return c != ">";
})(this)
}?
;
我的目标语言是 JavaScript 并且谓词的注释和未注释形式都可以正常工作。
试试这个:
NAMEDELEMENT
: [a-zA-Z_@] ( '-' {_input.LA(1) != '>'}? | [a-zA-Z0-9_] )*
;
不确定 _input.LA(1) != '>'
是否适用于 Java 脚本运行时,但在 Java 中它正确地将 "some-->more"
标记为 "some-"
、"->"
和 "more"
.