ANTLR4 Lexer匹配行首行行尾

Jav*_*Man 5 regex antlr4

如何在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。

Sam*_*ell 5

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

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