正则表达式 – ANTLR4 Lexer匹配行结束行

前端之家收集整理的这篇文章主要介绍了正则表达式 – ANTLR4 Lexer匹配行结束行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在ANLTR4词法分析器中实现Perl正则表达式^和$?即.匹配行的开头和行的结尾而不消耗任何字符.

我正在尝试使用ANTLR4词法分析器来匹配行开头的#字符,但不能在行的中间匹配例如,要隔离并抛弃所有C预处理器指令,而不管它是什么指令而忽略#字符串字面量. (通常我们可以对C字符串文字进行标记,以消除出现在行中间的#,但假设我们没有这样做).这意味着我只想指定#.*?没有打扰#if #ifndef #pragma等.

此外,C标准允许在#例如之前和之后的空白和多行注释.

/* helo
world*/  #  /* hel
l
o
*/  /*world */ifdef .....

被认为是出现在单行上的有效预处理程序指令. (ML COMMENTs内的CRLF被抛出)

这就是我目前正在做的事情:

PPLINE: '\r'? '\n' (ML_COMMENT | '\t' | '\f' |' ')* '#' (ML_COMMENT | ~[\r\n])+ -> channel(PPDIR);

但问题是我必须在#之前依赖CRLF的存在并且将CRLF与指令一起抛出.我需要替换由该指令行的CRLF抛出的CRLF,因此我要确保指令由CRLF终止.

但是,这意味着我的语法不能处理出现在文件开头的指令(即没有前面的CRLF)或者在没有终止CRLF的情况下先于EOF.

如果Perl样式的regex ^ $语法可用,我可以匹配SOL / EOL而不是显式匹配和使用CRLF.

解决方法

您可以对条件使用语义谓词.

PPLINE
    :   {getCharPositionInLine() == 0}?
        (ML_COMMENT | '\t' | '\f' |' ')* '#' (ML_COMMENT | ~[\r\n])+
        {_input.LA(1) == '\r' || _input.LA(1) == '\n'}?
        -> channel(PPDIR)
    ;

猜你在找的正则表达式相关文章