[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