ANTLR4否定前瞻性解决方法?

时间:2015-03-06 12:21:09

标签: antlr antlr4 lexer negative-lookahead

我正在使用antlr4而我正在尝试为Matlab创建解析器。其中一个主要问题是注释和转置都使用单引号。我想到的解决方案是用以下方式定义STRING词法分析器规则:

(if previous token is not ')','}',']' or [a-zA-Z0-9]) than match '\'' ( ESC_SEQ | ~('\\'|'\''|'\r'|'\n') )* '\'' (但请注意,如果它是真的,我不想使用前一个标记。)

有没有人知道解决这个问题,因为它不支持负面预测?

1 个答案:

答案 0 :(得分:1)

您可以使用_input.LA(-1)在ANTLR4中进行否定预测(在Java中,请参阅how to resolve simple ambiguityANTLR4 negative lookahead in lexer)。

你也可以使用词法模式来处理这类东西,但你的词法分析器必须在自己的文件中定义。我们的想法是从一个可以匹配某些令牌的状态转到另一个可以匹配新令牌的状态。

以下是ANTLR4 lexer documentation的示例:

// Default "mode": Everything OUTSIDE of a tag
COMMENT : '<!--' .*? '-->' ;
CDATA : '<![CDATA[' .*? ']]>' ;
OPEN : '<'                     -> pushMode(INSIDE) ;
 ...
XMLDeclOpen : '<?xml' S        -> pushMode(INSIDE) ;
...

// ----------------- Everything INSIDE of a tag ------------------    ---
mode INSIDE;
CLOSE : '>'         -> popMode ;
SPECIAL_CLOSE: '?>' -> popMode ; // close <?xml...?>
SLASH_CLOSE : '/>'  -> popMode ;