ANTLR4 否定前瞻解决方法?
ANTLR4 Negative lookahead workaround?
我正在使用 antlr4,我正在尝试为 Matlab 制作一个解析器。主要问题之一是评论和转置都使用单引号。我想到的解决方案是按以下方式定义 STRING 词法分析器规则:
(if previous token is not ')','}',']' or [a-zA-Z0-9]) than match '\'' ( ESC_SEQ | ~('\'|'\''|'\r'|'\n') )* '\'
'(但请注意,如果它是真的,我不想使用之前的令牌)。
有谁知道这个问题的解决方法,因为它不支持负前瞻?
您可以使用 _input.LA(-1)
(在 Java 中,参见 how to resolve simple ambiguity or ANTLR4 negative lookahead in lexer)在 ANTLR4 中进行负前瞻。
你也可以使用词法分析器模式来处理这种东西,但是你的词法分析器必须在它自己的文件中定义。这个想法是从一个可以匹配一些令牌的状态到另一个可以匹配新令牌的状态。
这是来自 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 ;
我正在使用 antlr4,我正在尝试为 Matlab 制作一个解析器。主要问题之一是评论和转置都使用单引号。我想到的解决方案是按以下方式定义 STRING 词法分析器规则:
(if previous token is not ')','}',']' or [a-zA-Z0-9]) than match '\'' ( ESC_SEQ | ~('\'|'\''|'\r'|'\n') )* '\'
'(但请注意,如果它是真的,我不想使用之前的令牌)。
有谁知道这个问题的解决方法,因为它不支持负前瞻?
您可以使用 _input.LA(-1)
(在 Java 中,参见 how to resolve simple ambiguity or ANTLR4 negative lookahead in lexer)在 ANTLR4 中进行负前瞻。
你也可以使用词法分析器模式来处理这种东西,但是你的词法分析器必须在它自己的文件中定义。这个想法是从一个可以匹配一些令牌的状态到另一个可以匹配新令牌的状态。
这是来自 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 ;