[antlr-interest] Cannot explain "no viable alternative at input" - antlr 3.0.1

J. Matthew Pryor jmp at observant.com.au
Wed Mar 10 19:01:45 PST 2010


I am a total ANTLR newbie, and have read quite a bit, but am a bit  
flumoxed by the results I am getting with my antlr grammar

My grammar is heavily based on the expression parser example.

I am confused by some console output I am seeing of the form:

line 1:5 no viable alternative at input '&&'
line 0:-1 no viable alternative at input '<EOF>'
line 1:5 no viable alternative at input '&&'
line 0:-1 no viable alternative at input '<EOF>'

Despite seeing this console output, my boolean expression parser seems  
to work & return valid values.

All the "operators" in my base parser get called with the values I  
would expect

so when I give it the input

true && true

despite the fact that I get the following consle messages

line 1:5 no viable alternative at input '&&'
line 0:-1 no viable alternative at input '<EOF>'

My method band() gets called with 2 Boolean, both set to true

If I pass input

false || true

my method bor() gets called with the Boolean values false & true

I also intended it to support more complex expressions like

(1.1 < 2.2) && (((1/1.0) * (4.0-8)) > -5.0)

Once again we get console output about no viable alternative

but the final result of the expression is as expected.

I have attached the grammar below

I am using antlr 3.0.1 with Java 5 on a Mac 10.5

I would really appreciate any hints that you might be able to provide

Regards,
Matthew


=== GRAMMAR ====
grammar Expr;

options {
	superClass=ExprParserBase;
}

@header {
package au.com.observant.viz.expression;
import au.com.observant.viz.expression.ExprParserBase;
}
@lexer::header {
package au.com.observant.viz.expression;
}

@members {
	Object result;
	public Object getResult() {
		return result;
	}
}

prog returns [Object value]
	:	b=boolExpr {$value = $b.value;}
	;

boolExpr returns [Object value]
	:	b=relExpr {$value = $b.value;}
		( 	BAND b=relExpr {$value = band($value,$b.value);}
		| 	BOR b=relExpr {$value = bor($value,$b.value);}
		)*
	;

relExpr returns [Object value]
     :   e=expr {$value = $e.value;}
         (   '>' e=expr {$value = gt($value,$e.value);}
         |   '<' e=expr {$value = lt($value,$e.value);}
         |   '>=' e=expr {$value = gte($value,$e.value);}
         |   '<=' e=expr {$value = lte($value,$e.value);}
         |   '==' e=expr {$value = eq($value,$e.value);}
         |   '!=' e=expr {$value = neq($value,$e.value);}
         )
     ;

expr returns [Object value]
     :   e=multExpr {$value = $e.value;}
         (   '+' e=multExpr {$value = add($value,$e.value);}
         |   '-' e=multExpr {$value = subtract($value,$e.value);}
         )*
     ;

multExpr returns [Object value]
     :   e=power {$value = $e.value;}
     	(   '*' e=power {$value = multiply($value, $e.value);}
     	|   '/' e=power {$value = divide($value, $e.value);}
     	)*
     ;

power returns [Object value]
	:	f=unary
			{$value = $f.value;}
		(POW p=unary
			{$value=powerOf($value,$p.value);}
		)?
	;

unary returns [Object value]
	:	f=atom
			{$value = $f.value;}
	|	'!' f=atom
			{$value = negate($f.value);}
	|	'-' f=atom
			{$value = negate($f.value);}
	;

atom returns [Object value]
     :   INTEGER {$value = Double.parseDouble($INTEGER.text);}
     |   FLOAT {$value = Double.parseDouble($FLOAT.text);}
     |   FIELD { $value = findField($FIELD.text); }
     |   ID { $value = findField($ID.text); }
     |   '(' boolExpr ')' {$value = $boolExpr.value;}
     |   EXP '(' expr ')' {$value = exp($expr.value);}
     |   TRUE {$value = Boolean.TRUE;}
     |   FALSE {$value = Boolean.FALSE;}
     ;

EXP   : 'exp';
TRUE   : 'true';
FALSE   : 'false';
ID : LETTER ( LETTER | '0'..'9' | '_' )*;
fragment LETTER: ('a'..'z' | 'A'..'Z');
POW   : '^';
BAND   : '&&';
BOR   : '||';
INTEGER	
	:	('0'..'9')+
	;

FLOAT
	:	('0'..'9')* '.' ('0'..'9')+
	;
FIELD     : ID '.' ID ;
WS  :   (' '|'\t')+ {skip();} ;



More information about the antlr-interest mailing list