Antlr如何避免reportAttemptingFullContext和reportAmbiguity

Antlr How to avoid reportAttemptingFullContext and reportAmbiguity

在我的 java 程序中,我解析了多行代码,为了避免歧义行,我使用了:

ParseTreeWalker walker = new ParseTreeWalker ();
if (!(lexerErrorListener.hasError() || parserErrorListener.hasError ()))
     walker.walk (listener, tree);
else
     line error

与听众:

        @Override
        public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact,
                BitSet ambigAlts, ATNConfigSet configs) {
            hasError = true;
        }

        @Override
        public void reportAttemptingFullContext(Parser recognizer, DFA dfa, int startIndex, int stopIndex,
            BitSet conflictingAlts, ATNConfigSet configs) {
            hasError = true;
        }

输入如下:|U1,0 = comment 我的语法产生歧义和全文错误。 是错误的方法还是有办法处理这些错误?

我的词法分析器:

 lexer grammar LexerGrammar;

SINGLE_COMMENT : '|' -> pushMode(COMMENT); 
NUMBER : [0-9];  
VIRGOLA : ',';
WS  : [ \t] -> skip ;   
EOL : [\r\n]+;   
 
// ------------ Everything INSIDE a COMMENT ------------ 
mode COMMENT;
    COMMENT_NUMBER  : NUMBER -> type(NUMBER);
    COMMENT_VIRGOLA : VIRGOLA -> type(VIRGOLA);  
    
    TYPE : 'I'| 'U'| 'Q';
     
    EQUAL : '=';
    
    COMMENT_TEXT: ('a'..'z' | 'A'..'Z')+;
     
    WS_1        : [ \t] -> skip ;   
    COMMENT_EOL : EOL -> type(EOL),popMode;

我的解析器:

 parser grammar Parser;

options {
      tokenVocab = LexerGrammar;
  }

prog : (line? EOL)+;   
line : comment; 

comment: SINGLE_COMMENT (defComm | genericComment); 
defComm: TYPE arg EQUAL COMMENT_TEXT; 
arg : (argument1) (VIRGOLA argument2)?;   
  
argument1    : numbers ;  
argument2    : numbers ;   
numbers      : NUMBER+ ;  
genericComment: .*?;

reportAmbiguityreportAttemptingFullContext 并不表示存在语法错误。您可以监听这些事件以了解它们是否发生,但 ANTLR 有一种确定性的方法来解决这种歧义(它使用第一种选择)。

如果您不将这些视为错误,您将从解析中获得正确的解析树。