package de.fuberlin.projectci.test.driver; import de.fuberlin.commons.lexer.ILexer; import de.fuberlin.commons.lexer.TokenType; import de.fuberlin.commons.parser.ISyntaxTree; import de.fuberlin.projectci.grammar.Grammar; import de.fuberlin.projectci.grammar.NonTerminalSymbol; import de.fuberlin.projectci.grammar.Production; import de.fuberlin.projectci.grammar.Symbol; import de.fuberlin.projectci.grammar.TerminalSymbol; import de.fuberlin.projectci.lrparser.SyntaxTreeNode; import de.fuberlin.projectci.parseTable.AcceptAction; import de.fuberlin.projectci.parseTable.Goto; import de.fuberlin.projectci.parseTable.ParseTable; import de.fuberlin.projectci.parseTable.ReduceAction; import de.fuberlin.projectci.parseTable.ShiftAction; import de.fuberlin.projectci.parseTable.State; import de.fuberlin.projectci.test.driver.DriverTest.DriverTestDataProvider; /** * Testdaten anhand des Beispiels aus dem Drachenbuch (vgl. Abbildung 4.37/ 4.38 / 2. deutsche Auflage). * */ public class DriverTestDataProvider1 implements DriverTestDataProvider{ private ILexer lexer; private ParseTable parseTable; private Grammar grammar; public DriverTestDataProvider1() { super(); setUp(); } // **************************************************************************** // * Implementierung von DriverTestDataProvider // **************************************************************************** @Override public ParseTable getParseTable() { return parseTable; } @Override public Grammar getGrammar() { return grammar; } @Override public ILexer getLexer() { return lexer; } @Override public ISyntaxTree expectedResult(){ /* * Parsebaum AST * E E * / | \ / | \ * E + T T + id * | | / | \ * T F id * id * / | \ | * T * F id * | | * F id * | * id */ SyntaxTreeNode e=new SyntaxTreeNode(new NonTerminalSymbol("E")); SyntaxTreeNode t=new SyntaxTreeNode(new NonTerminalSymbol("T")); t.addChild(new SyntaxTreeNode(new TerminalSymbol("id"))); t.addChild(new SyntaxTreeNode(new TerminalSymbol("*"))); t.addChild(new SyntaxTreeNode(new TerminalSymbol("id"))); e.addChild(t); e.addChild(new SyntaxTreeNode(new TerminalSymbol("+"))); e.addChild(new SyntaxTreeNode(new TerminalSymbol("id"))); return e; } // **************************************************************************** // * Erstellung von parseTable, grammar und lexer // * TODO Generische Implementierung die den GrammarReader vewendet und die Parsetabelle aus TSV-Daten erstellt // **************************************************************************** private void setUp(){ parseTable=new ParseTable(); State s0=new State(0); State s1=new State(1); State s2=new State(2); State s3=new State(3); State s4=new State(4); State s5=new State(5); State s6=new State(6); State s7=new State(7); State s8=new State(8); State s9=new State(9); State s10=new State(10); State s11=new State(11); TerminalSymbol ts0=new TerminalSymbol("id"); TerminalSymbol ts1=new TerminalSymbol("+"); TerminalSymbol ts2=new TerminalSymbol("*"); TerminalSymbol ts3=new TerminalSymbol("("); TerminalSymbol ts4=new TerminalSymbol(")"); TerminalSymbol ts5=Grammar.INPUT_ENDMARKER; NonTerminalSymbol nts0=new NonTerminalSymbol("E"); NonTerminalSymbol nts1=new NonTerminalSymbol("T"); NonTerminalSymbol nts2=new NonTerminalSymbol("F"); Production p1= new Production(nts0, new Symbol[]{nts0, ts1, nts1}); Production p2= new Production(nts0, new Symbol[]{nts1}); Production p3= new Production(nts1, new Symbol[]{nts1, ts2, nts2}); Production p4= new Production(nts1, new Symbol[]{nts2}); Production p5= new Production(nts2, new Symbol[]{ts3, nts0, ts4}); Production p6= new Production(nts2, new Symbol[]{ts0}); grammar=new Grammar(); grammar.addProduction(p1); grammar.addProduction(p2); grammar.addProduction(p3); grammar.addProduction(p4); grammar.addProduction(p5); grammar.addProduction(p6); parseTable.setInitialState(s0); parseTable.getActionTableForState(s0).setActionForTerminalSymbol(new ShiftAction(s5), ts0); parseTable.getActionTableForState(s0).setActionForTerminalSymbol(new ShiftAction(s4), ts3); parseTable.getActionTableForState(s1).setActionForTerminalSymbol(new ShiftAction(s6), ts1); parseTable.getActionTableForState(s1).setActionForTerminalSymbol(new AcceptAction(), ts5); parseTable.getActionTableForState(s2).setActionForTerminalSymbol(new ReduceAction(p2), ts1); parseTable.getActionTableForState(s2).setActionForTerminalSymbol(new ShiftAction(s7), ts2); parseTable.getActionTableForState(s2).setActionForTerminalSymbol(new ReduceAction(p2), ts4); parseTable.getActionTableForState(s2).setActionForTerminalSymbol(new ReduceAction(p2), ts5); parseTable.getActionTableForState(s3).setActionForTerminalSymbol(new ReduceAction(p4), ts1); parseTable.getActionTableForState(s3).setActionForTerminalSymbol(new ReduceAction(p4), ts2); parseTable.getActionTableForState(s3).setActionForTerminalSymbol(new ReduceAction(p4), ts4); parseTable.getActionTableForState(s3).setActionForTerminalSymbol(new ReduceAction(p4), ts5); parseTable.getActionTableForState(s4).setActionForTerminalSymbol(new ShiftAction(s5), ts0); parseTable.getActionTableForState(s4).setActionForTerminalSymbol(new ShiftAction(s4), ts3); parseTable.getActionTableForState(s5).setActionForTerminalSymbol(new ReduceAction(p6), ts1); parseTable.getActionTableForState(s5).setActionForTerminalSymbol(new ReduceAction(p6), ts2); parseTable.getActionTableForState(s5).setActionForTerminalSymbol(new ReduceAction(p6), ts4); parseTable.getActionTableForState(s5).setActionForTerminalSymbol(new ReduceAction(p6), ts5); parseTable.getActionTableForState(s6).setActionForTerminalSymbol(new ShiftAction(s5), ts0); parseTable.getActionTableForState(s6).setActionForTerminalSymbol(new ShiftAction(s4), ts3); parseTable.getActionTableForState(s7).setActionForTerminalSymbol(new ShiftAction(s5), ts0); parseTable.getActionTableForState(s7).setActionForTerminalSymbol(new ShiftAction(s4), ts3); parseTable.getActionTableForState(s8).setActionForTerminalSymbol(new ShiftAction(s6), ts1); parseTable.getActionTableForState(s8).setActionForTerminalSymbol(new ShiftAction(s11), ts4); parseTable.getActionTableForState(s9).setActionForTerminalSymbol(new ReduceAction(p1), ts1); parseTable.getActionTableForState(s9).setActionForTerminalSymbol(new ShiftAction(s7), ts2); parseTable.getActionTableForState(s9).setActionForTerminalSymbol(new ReduceAction(p1), ts4); parseTable.getActionTableForState(s9).setActionForTerminalSymbol(new ReduceAction(p1), ts5); parseTable.getActionTableForState(s10).setActionForTerminalSymbol(new ReduceAction(p3), ts1); parseTable.getActionTableForState(s10).setActionForTerminalSymbol(new ReduceAction(p3), ts2); parseTable.getActionTableForState(s10).setActionForTerminalSymbol(new ReduceAction(p3), ts4); parseTable.getActionTableForState(s10).setActionForTerminalSymbol(new ReduceAction(p3), ts5); parseTable.getActionTableForState(s11).setActionForTerminalSymbol(new ReduceAction(p5), ts1); parseTable.getActionTableForState(s11).setActionForTerminalSymbol(new ReduceAction(p5), ts2); parseTable.getActionTableForState(s11).setActionForTerminalSymbol(new ReduceAction(p5), ts4); parseTable.getActionTableForState(s11).setActionForTerminalSymbol(new ReduceAction(p5), ts5); parseTable.getGotoTableForState(s0).setGotoForNonTerminalSymbol(new Goto(s1), nts0); parseTable.getGotoTableForState(s0).setGotoForNonTerminalSymbol(new Goto(s2), nts1); parseTable.getGotoTableForState(s0).setGotoForNonTerminalSymbol(new Goto(s3), nts2); parseTable.getGotoTableForState(s4).setGotoForNonTerminalSymbol(new Goto(s8), nts0); parseTable.getGotoTableForState(s4).setGotoForNonTerminalSymbol(new Goto(s2), nts1); parseTable.getGotoTableForState(s4).setGotoForNonTerminalSymbol(new Goto(s3), nts2); parseTable.getGotoTableForState(s6).setGotoForNonTerminalSymbol(new Goto(s9), nts1); parseTable.getGotoTableForState(s6).setGotoForNonTerminalSymbol(new Goto(s3), nts2); parseTable.getGotoTableForState(s7).setGotoForNonTerminalSymbol(new Goto(s10), nts2); lexer=new DummyLexer(); ((DummyLexer)lexer).addToken(TokenType.ID, null); ((DummyLexer)lexer).addToken(TokenType.OP_MUL, null); ((DummyLexer)lexer).addToken(TokenType.ID, null); ((DummyLexer)lexer).addToken(TokenType.OP_ADD, null); ((DummyLexer)lexer).addToken(TokenType.ID, null); ((DummyLexer)lexer).addToken(TokenType.EOF, null); } }