ANTLR4负前瞻解决方案?

ANTLR4负前瞻解决方案?,antlr,antlr4,lexer,negative-lookahead,Antlr,Antlr4,Lexer,Negative Lookahead,我正在使用antlr4,我正在尝试为Matlab制作一个解析器。其中一个主要问题是,注释和转置都使用单引号。我想到的解决方案是以以下方式定义字符串lexer规则: (如果上一个标记不是“)”、“}”、““]”或[a-zA-Z0-9])而不是匹配“\”(ESC_SEQ| ~(“\\'\\'\\'\'\'''''\'\n'))*””(但请注意,如果上一个标记为true,我不想使用它) 有人知道这个问题的解决方法吗,因为它不支持负前瞻?您可以在ANTLR4中使用\u input.LA(-1)(在Jav

我正在使用antlr4,我正在尝试为Matlab制作一个解析器。其中一个主要问题是,注释和转置都使用单引号。我想到的解决方案是以以下方式定义字符串lexer规则:

(如果上一个标记不是“)”、“}”、““]”或[a-zA-Z0-9])而不是匹配“\”(ESC_SEQ| ~(“\\'\\'\\'\'\'''''\'\n'))*”
”(但请注意,如果上一个标记为true,我不想使用它)


有人知道这个问题的解决方法吗,因为它不支持负前瞻?

您可以在ANTLR4中使用
\u input.LA(-1)
(在Java中,请参阅或)

您也可以使用lexer模式来处理此类内容,但是您的lexer必须在其自己的文件中定义。这个想法是从一个可以匹配某些令牌的状态转到另一个可以匹配新令牌的状态

以下是一个例子:

//默认“模式”:标记之外的所有内容
评论:“;
CDATA:“”;
打开“”->popMode;
特殊关闭:“?>”->popMode;//接近
斜杠闭合:'/>'->popMode;

你知道在语义谓词中指定一个范围吗,例如,{u input.LA(-1)!=[a-zA-Z0-9]}?这段代码直接放在生成的lexer中(代码直接放在java/你的目标语言中到生成的lexer中),所以我认为你不能直接使用范围。但是,由于是Java(或您的目标语言)复制到lexer中,因此您可以使用
匹配(…)
或等效函数。但是,在您的情况下,使用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 ;