相关疑难解决方法(0)

100
推荐指数
2
解决办法
2万
查看次数

ANTLR4 Lexer匹配行首行行尾

如何在ANLTR4词法分析器中实现Perl正则表达式^和$?即。在不消耗任何字符的情况下匹配行首和行尾。

我正在尝试使用ANTLR4词法分析器在行的开头而不是在行的中间匹配##例如,要隔离并扔掉所有C ++预处理程序指令,而不管它是哪个指令,而忽略a中的#字符串字面量。(通常,我们可以对C ++字符串文字进行标记化,以消除出现在行中间的#,但前提是我们不这样做)。那意味着我只想指定#。*?无需烦扰#if #ifndef #pragma等

同样,C ++标准允许在#eg前后添加空格和多行注释。

   /* helo
world*/  #  /* hel
l
o
*/  /*world */ifdef .....
Run Code Online (Sandbox Code Playgroud)

被认为是有效的预处理器指令,出现在一行上。(ML COMMENTs中的CRLF被扔掉)

这是我目前正在做的:

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

但是问题是我必须依靠#之前CRLF的存在,并将CRLF与指令一起丢弃。我需要替换该指令行的CRLF扔掉的CRLF,所以我必须确保该指令被CRLF终止。

但是,这意味着我的语法无法处理出现在文件开头的指令(即没有在前面的CRLF)或在没有终止CRLF的情况下在EOF之后出现的指令。

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

regex antlr4

5
推荐指数
1
解决办法
3034
查看次数

标签 统计

antlr4 ×2

antlr ×1

antlr3 ×1

regex ×1