如何在 ANLTR4 词法分析器中实现 Perl 正则表达式 ^ 和 $?IE。在不消耗任何字符的情况下匹配行首和行尾。
我正在尝试使用 ANTLR4 词法分析器来匹配行首的 # 字符,但不在行的中间例如,隔离并丢弃所有 C++ 预处理器指令,无论它是哪个指令,同时忽略 a 中的 #字符串字面量。(通常我们可以标记 C++ 字符串文字以消除出现在行中间的 # 但假设我们没有这样做)。这意味着我只想指定 # .*? 无需打扰#if #ifndef #pragma 等。
此外,C++ 标准允许在 # 之前和之后使用空格和多行注释,例如
/* helo
world*/ # /* hel
l
o
*/ /*world */ifdef .....
被认为是出现在单行上的有效预处理器指令。(ML COMMENT 中的 CRLF 被扔掉了)
这就是我目前正在做的事情:
PPLINE: '\r'? '\n' (ML_COMMENT | '\t' | '\f' |' ')* '#' (ML_COMMENT | ~[\r\n])+ -> channel(PPDIR);
但问题是我必须依赖 # 之前存在 CRLF 并将该 CRLF 与指令一起丢弃。我需要替换由该指令行的 CRLF 抛出的 CRLF,因此我必须确保该指令由 CRLF 终止。
但是,这意味着我的语法无法处理出现在文件开头的指令(即没有前面的 CRLF)或前面有 EOF 而不终止 CRLF。
如果 Perl 风格的正则表达式 ^ $ 语法可用,我可以匹配 SOL/EOL 而不是显式匹配和使用 CRLF。