我正在使用antlr4,并试图为Matlab制作一个解析器。其中一个主要问题是注释和转置都使用单引号。我想的解决方案是以以下方式定义STRING lexer规则:
(if previous token is not ')','}',']' or [a-zA-Z0-9]) than match ''' ( ESC_SEQ | ~('\'|'''|'r'|'n') )* ''
'(但请注意,如果前一个令牌为true,我不想使用它)。
有人知道这个问题的解决方法吗,因为它不支持负面表情?
您可以使用_input.LA(-1)
在ANTLR4中进行负前瞻(在Java中,请参阅如何在lexer中解决简单歧义或ANTLR4负前瞻)。
您也可以使用lexer模式来处理这类事情,但您的lexer必须在自己的文件中定义。这个想法是从一个可以匹配一些代币的州变成另一个可以与新代币匹配的州。
以下是ANTLR4 lexer文档中的一个示例:
// 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 ;