[antlr-interest] Examples from the antlr book, (p 54) simple expressions
Berlin Brown
berlin.brown at gmail.com
Sat Mar 14 20:15:35 PDT 2009
I am trying to run the examples from the book (or any examples for
that matter) and getting NullPointerException errors.
With antrl 3.1.2:
Java 1.6
grammar Adder;
@header {
import java.util.HashMap;
}
@members {
HashMap memory = new HashMap();
}
prog: stat+ ;
// START: stat
stat: // Evaluate expr and emit result
expr NEWLINE { System.out.println($expr.value); }
// Match assignment and stored value
| ID '=' expr NEWLINE { memory.put($ID.text, new
Integer($expr.value)); }
| NEWLINE
;
// END: stat
expr returns [int value]
: e = multExpr { $value = $e.value; }
( '+' e = multExpr { $value += $e.value; }
| '-' e = multExpr { $value -= $e.value; }
)*
;
// END: expr
multExpr returns [int value]
: e.atom { $value = $e.value; } ('*' e.atom { $value *= $e.value; } )*
;
// START:atom
atom returns [int value]
: // Value of an INT
INT { $value = Integer.parseInt($INT.text); }
| ID
{
// Look up value of variable
Integer v = (Integer) memory.get($ID.text);
// If found , set return value
if (v != null) $value = v.intValue();
else System.err.println("Undefined variable " + $ID.text);
}
// Value of expression
| '(' expr ')' { $value = $expr.value; }
;
// END : atom
// START : tokens
ID : ('a'..'z' | 'A'..'Z')+ ;
INT : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WHITESPACE : ( ' ' | '\t' | '\n' | '\r' )+ { skip(); } ;
// END TOKENS
I am trying to run the grammar above.
I get the following error:
ntlr:
[java] warning(200):
/usr/local/projects/light_edit/src/antlr/Adder.g:14:5: Decision can
match input such as "NEWLINE" using multiple alternatives: 1, 3
[java] As a result, alternative(s) 3 were disabled for that input
[java] error(201):
/usr/local/projects/light_edit/src/antlr/Adder.g:14:5: The following
alternatives can never be matched: 3
[java]
[java] Java Result: 1
-------------------
So, I decided to remove the NEWLINE clause in the stat section.
// START: stat
stat: // Evaluate expr and emit result
expr NEWLINE { System.out.println($expr.value); }
// Match assignment and stored value
| ID '=' expr NEWLINE { memory.put($ID.text, new
Integer($expr.value)); }
;
// END: stat
If I remove that, I get the following error.
antlr:
[java] error(10): internal error:
/usr/local/projects/light_edit/src/antlr/Adder.g :
java.lang.NullPointerException
[java] org.antlr.grammar.v2.CodeGenTreeWalker.atom(CodeGenTreeWalker.java:1983)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.atom(CodeGenTreeWalker.java:2182)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.element(CodeGenTreeWalker.java:1708)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.alternative(CodeGenTreeWalker.java:1306)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.block(CodeGenTreeWalker.java:1081)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.rule(CodeGenTreeWalker.java:797)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:588)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:530)
[java] org.antlr.grammar.v2.CodeGenTreeWalker.grammar(CodeGenTreeWalker.java:348)
[java] org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:438)
[java] org.antlr.Tool.generateRecognizer(Tool.java:425)
[java] org.antlr.Tool.process(Tool.java:292)
[java] org.antlr.Tool.main(Tool.java:74)
[java] sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] java.lang.reflect.Method.invoke(Method.java:597)
[java] org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:217)
[java] org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:152)
[java] org.apache.tools.ant.taskdefs.Java.run(Java.java:747)
[java] org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:201)
[java] org.apache.tools.ant.taskdefs.Java.execute(Java.java:104)
[java] org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
[java] sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] java.lang.reflect.Method.invoke(Method.java:597)
[java] org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
[java] org.apache.tools.ant.Task.perform(Task.java:348)
[java] org.apache.tools.ant.Target.execute(Target.java:357)
[java] org.apache.tools.ant.Target.performTasks(Target.java:385)
[java] org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
[java] org.apache.tools.ant.Project.executeTarget(Project.java:1298)
[java] org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[java] org.apache.tools.ant.Project.executeTargets(Project.java:1181)
[java] org.apache.tools.ant.Main.runBuild(Main.java:698)
[java] org.apache.tools.ant.Main.startAnt(Main.java:199)
[java] org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
[java] org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
[java] Java Result: 1
--
Berlin Brown
http://botnode.com
More information about the antlr-interest
mailing list