正则表达式 – 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)
    ;

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...