Hi David, Your parser does not handle:
ans = 3 * (-x + y) * 4 properly since `ans` is an ANS-token and not an IDENT-token. Therefor it does not get matched by your `assignmentStatement` rule. Also, you should probably add the EOF at the end of your `script` rule in your combined grammar. Regards, Bart. On Fri, May 20, 2011 at 3:47 AM, David Smith <david.sm...@cc.gatech.edu>wrote: > I developed a tree parser by making minor changes to Scott > Stanchfield's tutorial videos. I don't know where to start looking > to explain the problem. > Here are the pieces: > > // The grammar: > grammar GTMat; > > options { > language = Java; > output=AST; > ASTLabelType=CommonTree; > } > > tokens { > NEGATION; > } > > > @header { > package parser; > } > > @lexer::header { > package parser; > } > > script > : statement* > ; > > statement > : assignmentStatement > ; > > assignmentStatement > : IDENT GETS^ expression SEMI? > ; > > actualParameters > : expression (COMMA expression)* > ; > > > // expressions -- fun time! > > term > : (IDENT OPENP ) => IDENT '(' actualParameters ')' > | OPENP! expression CLOSEP! > | INTEGER > | IDENT > ; > > > unary > : (PLUS! | negation^)* term > ; > > negation > : MINUS -> NEGATION > ; > > mult > : unary ((MULT^ | DIV^ ) unary)* > ; > > add > : mult ((PLUS^ | MINUS^) mult)* > ; > > relation > : add ((EQUALS^ | NOTEQ^ | LESS^ | LESSEQ^ | GT^ | GTEQ^) > add)* > ; > > expression > : relation ((AND^ | OR^) relation)* > ; > > GETS : '='; > SWITCH : 'switch'; > CASE : 'case'; > OTHERWISE > : 'otherwise'; > IF : 'if'; > ELSE : 'else'; > ELSEIF : 'elseif'; > END : 'end'; > FOR : 'for'; > WHILE : 'while'; > ANS : 'ans'; > COMMA : ','; > OPENP : '('; > CLOSEP : ')'; > NOT : '~'; > SEMI : ';'; > PLUS : '+'; > MINUS : '-'; > MULT : '*'; > DIV : '/'; > EQUALS : '=='; > NOTEQ : '!='; > LESS : '<'; > LESSEQ : '<='; > GT : '>'; > GTEQ : '>='; > AND : '&&'; > OR : '||'; > SINGLE : '\''; > > fragment LETTER : ('a'..'z' | 'A'..'Z') ; > fragment DIGIT : '0'..'9'; > INTEGER : DIGIT+ ; > IDENT : LETTER (LETTER | DIGIT)*; > WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;}; > COMMENT : '%' .* ('\n'|'\r') {$channel = HIDDEN;}; > > // The Walker Grammar: > tree grammar EvaluatorWalker; > > options { > language = Java; > tokenVocab = GTMat; > ASTLabelType = CommonTree; > } > > @header { > package parser; > import java.util.Map; > import java.util.HashMap; > } > > @members { > private Map<String, Integer> variables = new HashMap<String, Integer>(); > } > > evaluator > : assignment* EOF > ; > > assignment > : ^('=' IDENT e=expression) > { variables.put($IDENT.text, e); } > ; > > expression returns [int result] > : ^('+' op1=expression op2=expression) { result = op1 + op2; > } > | ^('-' op1=expression op2=expression) { result = op1 - op2; > } > | ^('*' op1=expression op2=expression) { result = op1 * op2; > } > | ^('/' op1=expression op2=expression) { result = op1 / op2; > } > | ^(NEGATION e=expression) { result = -e; } > | IDENT { result = variables.get($IDENT.text); } > | INTEGER { result = Integer.parseInt($INTEGER.text); } > ; > // The Test Program: > package parser; > > import org.antlr.runtime.ANTLRFileStream; > import org.antlr.runtime.CharStream; > import org.antlr.runtime.CommonTokenStream; > import org.antlr.runtime.RecognitionException; > import org.antlr.runtime.TokenStream; > import org.antlr.runtime.tree.CommonTreeNodeStream; > import java.io.IOException; > > public class Test4 { > public static void main(String[] args) > throws RecognitionException, IOException { > CharStream stream = > new ANTLRFileStream("Test.m"); > GTMatLexer lexer = new GTMatLexer(stream); > TokenStream tokenStream = new CommonTokenStream(lexer); > GTMatParser parser = new GTMatParser(tokenStream); > GTMatParser.script_return evaluator = parser.script(); > System.out.println(evaluator.tree.toStringTree()); > CommonTreeNodeStream nodeStream = new > CommonTreeNodeStream(evaluator.tree); > EvaluatorWalker walker = new EvaluatorWalker(nodeStream); > walker.evaluator(); > System.out.println("ok"); > } > } > // The input code: > x = 8 > y = 2 + 3 > ans = 3 * (-x + y) * 4 > > // When I run it, I get this: > > (= x 8) (= y (+ 2 3)) > C:<snip>src\parser\EvaluatorWalker.g: node from line 1:2 mismatched > tree node: = expecting EOF > ok > > David M. Smith http://www.cc.gatech.edu/fac/David.Smith > Georgia Institute of Technology, College of Computing > Sent from my ASR-33 Teletype > > > List: http://www.antlr.org/mailman/listinfo/antlr-interest > Unsubscribe: > http://www.antlr.org/mailman/options/antlr-interest/your-email-address > List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address -- You received this message because you are subscribed to the Google Groups "il-antlr-interest" group. To post to this group, send email to il-antlr-inter...@googlegroups.com. To unsubscribe from this group, send email to il-antlr-interest+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=en.