Search code examples
listenerantlrantlr4

Antlr How to avoid reportAttemptingFullContext and reportAmbiguity


In my java program im parsing many lines of code and to avoid ambiguous lines i used:

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

with the listener:

        @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;
        }

input like: |U1,0 = comment generate ambiguity and fullcontext error with my grammar. is a wrong approach or is there a way to handle these errors?

My Lexer:

 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;

my parser:

 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: .*?;

Solution

  • reportAmbiguity and reportAttemptingFullContext are not an indication that there was a syntax error. You can listen in on these events to know if they happen, but ANTLR has a deterministic approach to resolving this ambiguity (it uses the first alternative).

    If you do not treat those as errors, you will get a proper parse tree out of your parse.