[antlr-interest] Bug report: Unexplainable "no viable alternative"

Gerald Rosenberg gerald at certiv.net
Tue Nov 3 10:55:33 PST 2009


The first version is failing on the associative_dimension_1 not 
having a star or data_type and no other alternative available.

The second version falls through the associative_dimension_2 to 
sized_or_unsized_dimension to recognize the '[]'

Note, both have a bit of backtracking that may be problematic on more 
complex inputs.

HTHs,
Gerald

At 10:22 AM 11/3/2009, alex.marin at amiq.ro wrote:
>Hello,
>
>We have trouble understanding why we get a "no viable alternative" when
>running the attached parser grammar on the following input:
>
>bit bitstream [];
>
>The output is:
>
>line 1:15 no viable alternative at input ']'
>
>However, we have found two (very strange) workarounds for the issue:
>1. Commenting out the 'real' option in the data_type rule
>2. Using associative_dimension_2 rule instead of associative_dimension_1
>(although the two are equivalent)
>
>What is the explanation for this behavior?
>Is there a rigurous solution to avoid such behavior?
>
>Thanks,
>Alex Marin
>
>Notes:
>- the example is not intended to be useful by itself (it is an excerpt from
>a much larger grammar)
>- the latest antlr version has been used for code generation
>(antlr-3.2.jar)
>- you can find the referred grammar inline at the end of this e-mail and
>also in the attached file
>- by comparing the generated parsers, we noticed that the workarounds cause
>the prediction to be done by some complicated if-conditions rather than the
>dfa which throws the NoViableAlt
>
>////////////////// Example.g ////////////////////////
>
>grammar Example;
>
>options {
>         k=1;
>         output=AST;
>         }
>
>entry
>:
>(my_rule)+
>;
>
>my_rule
>         :
>           tf_port_item SEMI
>         ;
>
>tf_port_item
>:
>data_type ID variable_dimension
>;
>
>
>data_type
>:
>'bit'
>| 'byte'
>| 'real' // Comment this to suppress NoViableAlt
>| 'struct'
>| 'union' ( 'tagged' )?
>| 'enum'
>| 'virtual'
>| ps_identifier
>;
>
>ps_identifier
>:
>( ID COLON_COLON ) => ID COLON_COLON ID
>| ID
>;
>
>variable_dimension
>:
>( associative_dimension_1 ) => associative_dimension_1 variable_dimension
>// comment this line
>//        ( associative_dimension_2 ) => associative_dimension_2
>variable_dimension  // and uncomment this one to suppress NoViableAlt (
>with 'real' alt in data_type)
>| ( sized_or_unsized_dimension )*
>;
>
>associative_dimension_1
>:
>LBRACK ( STAR | data_type ) RBRACK
>;
>
>associative_dimension_2
>             :
>( LBRACK STAR ) => LBRACK STAR RBRACK
>| LBRACK data_type RBRACK
>             ;
>
>
>sized_or_unsized_dimension
>:
>LBRACK ( NUMBER )? RBRACK
>;
>
>/********** Lexer *************/
>
>SEMI: ';';
>STAR: '*';
>LBRACK: '[';
>RBRACK: ']';
>COLON_COLON: '::';
>
>WS
>:
>(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
>;
>
>ID
>:
>('a'..'z'|'A'..'Z'|'_') ('0'..'9'|'a'..'z'|'A'..'Z'|'_')*
>;
>
>NUMBER
>:
>('0'..'9')+
>;
>
>
>Content-Type: application/octet-stream; charset="UTF-8";
>  name="Example.g";
>Content-Disposition: attachment;
>  filename="Example.g";
>
>
>List: http://www.antlr.org/mailman/listinfo/antlr-interest
>Unsubscribe: 
>http://www.antlr.org/mailman/options/antlr-interest/your-email-address
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20091103/2ee031ae/attachment-0001.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Version1.png
Type: application/octet-stream
Size: 87155 bytes
Desc: not available
Url : http://www.antlr.org/pipermail/antlr-interest/attachments/20091103/2ee031ae/attachment-0002.obj 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Version2.png
Type: application/octet-stream
Size: 87947 bytes
Desc: not available
Url : http://www.antlr.org/pipermail/antlr-interest/attachments/20091103/2ee031ae/attachment-0003.obj 


More information about the antlr-interest mailing list