ANTLR V4 词法分析器前瞻正则表达式

T.R*_*.R. 3 regex parsing antlr lexer antlr4

我正在尝试为类似 XML 的语言编写语法,其中我们使用 << 而不是 < 字符。这是词法分析器的部分快照,其中 TEXT 表示(外部)标签之间的文本:

OPEN  : '<<' ;
CLOSE : '>>' ;
TEXT  : ~[^<]+ ;
Run Code Online (Sandbox Code Playgroud)

上面 TEXT 的定义显然是错误的,因为即使一个后面没有另一个 <,它也会在第一次出现 < 时停止。我正在寻找一种方法来定义“捕获所有内容,直到遇到 <<”,但不将 << 包含在匹配中。

所以这样的事情也行不通:

TEXT  : .*? '<<' ;
Run Code Online (Sandbox Code Playgroud)

有没有办法在 ANTLR4 中实现这一点?

——TR

Luc*_*ski 5

这里不需要先行查看,以下应该可以解决问题:

TEXT  : ( ~'<' | '<' ~'<' )+ ;
Run Code Online (Sandbox Code Playgroud)

即:匹配一系列非<字符,或单个字符<后跟其他字符。

顺便说一下,ANTLR 的语法对于负字符类是不同的。你应该写~[a-z]而不是[^a-z]例如。

您可能还想查看XML 示例语法,它使用词法分析器模式来区分标记内的标记,这也可能对您的语法有用。