ANTLR4 DefaultErrorStrategy fails to inject missing token -


i'm trying run in testrig following grammar:

grammar cobolfragment;  // hidden tokens ws : [ ]+ -> channel(hidden); nl : '\n' -> channel(hidden);  // keywords period : '.';  division : 'division'; section : 'section';  data : 'data'; working_storage : 'working-storage';  file : 'file';  fd : 'fd';  external : 'external'; global : 'global';  block : 'block'; contains : 'contains'; characters : 'characters';  // data integer : [0-9]+; id : [a-z][a-z0-9]*;  datadivision :     data division period     filesection?     workingstoragesection? ;  filesection :     file section period     filedescription* ;  filedescription :     fd filename=id //    (is? global)?          // 1. global clause //    (is? external)?        // 2. external clause     blockclause?     period ;  blockclause :     block contains? blocksize=integer characters ;  workingstoragesection :     working_storage section period ; 

with following input:

data division. file section. fd fd01 working-storage section. 

clearly third line of input ("fd fd01") missing terminator period asked in filedescription rule.

the defaulterrorstrategy correctly acknowledges , conjures missing token:

parse tree missing token correcly injected

on stderr correct report displayed: line 4:0 missing '.' @ 'working-storage'.

but if fragments commented out enabled (that is, clauses 'is external' , 'is global' brought in grammar again), single token insertion fails:

parse tree missing missing token

on stderr misleading report displayed: line 4:0 no viable alternative @ input 'working-storage'

how enable full grammar (with external , global clauses) retaining ability correct missing period?

side note 1: if enable either external or global, not both clauses, defaulterrorstrategy works nicely , injects missing token.

side note 2: code generated grammar both clauses enabled has following code (compared grammar 1 of them enabled):

public final filedescriptioncontext filedescription() ... {     ...     try {         ...         switch ( getinterpreter().adaptivepredict(_input,4,_ctx) ) {         case 1:             {             setstate(31);             _la = _input.la(1);             if (_la==is) {                 {                 setstate(30); match(is);                 }             }              setstate(33); match(global);             }             break;         }         ...     }     catch (recognitionexception re) {         ... 

and adaptivepredict() call culprit, because throws no viable alternative @ input 'working-storage' before parser has chance match(period) (in generated code, not pasted here).

i've managed solve adding new clause both clauses:

(here fragments changed)

... filedescription :     fd filename=id     isclauses?     blockclause?     period ;  isclauses :     is? global (is? external)? |   is? external ; ... 

now defaulterrorstrategy work , injects missing period.

why not isclauses : (is? global?) (is? external)?; well, tried first, of course. got warning (warning(154): rule 'filedescription' contains optional block @ least 1 alternative can match empty string) , no missing period injected.


Comments

Popular posts from this blog

php - failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request -

java - How to filter a backspace keyboard input -

java - Show Soft Keyboard when EditText Appears -