微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐