确保表达式不以字符结尾的 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".