加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:50:30 所属栏目:百科 来源:网络整理
导读:如何在ANLTR4词法分析器中实现Perl正则表达式^和$?即.匹配行的开头和行的结尾而不消耗任何字符. 我正在尝试使用ANTLR4词法分析器来匹配行开头的#字符,但不能在行的中间匹配例如,要隔离并抛弃所有C预处理器指令,而不管它是什么指令而忽略#字符串字面量. (通
如何在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 | ~[rn])+ -> channel(PPDIR);

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

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

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读