private Token getPredictToken(List <Token> tokens, int loc) { Token predictToken; if (loc < tokens.Count) { predictToken = tokens[loc]; } else { predictToken = eof; } if (predictToken is Identifier) { predictToken = new Identifier(predictToken, ""); } if (predictToken is IntLiteral) { predictToken = new IntLiteral(predictToken, "0"); } if (predictToken is StringLiteral) { predictToken = new StringLiteral(predictToken, ""); } if (predictToken is BoolLiteral) { predictToken = new BoolLiteral(predictToken, ""); } return(predictToken); }
private void initializeGrammar() { addKeywordOrNonTerminal("for"); addKeywordOrNonTerminal("in"); addKeywordOrNonTerminal("..", "\\.\\."); addKeywordOrNonTerminal("do"); addKeywordOrNonTerminal("end"); addKeywordOrNonTerminal("var"); addKeywordOrNonTerminal(";"); addKeywordOrNonTerminal(":"); addKeywordOrNonTerminal(":="); addKeywordOrNonTerminal("read"); addKeywordOrNonTerminal("print"); addKeywordOrNonTerminal("assert"); addKeywordOrNonTerminal("type"); addKeywordOrNonTerminal("int"); addKeywordOrNonTerminal("string"); addKeywordOrNonTerminal("bool"); addKeywordOrNonTerminal("(", "\\("); addKeywordOrNonTerminal(")", "\\)"); addKeywordOrNonTerminal("prog"); addKeywordOrNonTerminal("stmts"); addKeywordOrNonTerminal("stmt"); addKeywordOrNonTerminal("expr"); addKeywordOrNonTerminal("expr2"); addKeywordOrNonTerminal("expr3"); addKeywordOrNonTerminal("opnd"); addKeywordOrNonTerminal("op"); addKeywordOrNonTerminal("unary_op"); addKeywordOrNonTerminal("maybeAssign"); addOperator("+"); addOperator("-"); addOperator("*"); addOperator("/"); addOperator("<"); addOperator("="); addOperator("&"); //unary must be handled separately from binary because otherwise "abc"!"abc" is parseable Token not = new Operator("!"); o.Add("!", not); scanner.addOperator("!"); Token id = new Identifier(""); Token intV = new IntLiteral("0"); Token strV = new StringLiteral(""); Token boolV = new BoolLiteral(""); parser.addProduction(t["prog"], new List <Token> { t["stmt"], t[";"], t["stmts"] }); parser.addProduction(t["stmts"], new List <Token> { t["stmt"], t[";"], t["stmts"] }); parser.addProduction(t["stmts"], new List <Token> { }); parser.addProduction(t["stmt"], new List <Token> { t["var"], id, t[":"], t["type"], t["maybeAssign"] }); parser.addProduction(t["stmt"], new List <Token> { t["for"], id, t["in"], t["expr"], t[".."], t["expr"], t["do"], t["stmt"], t[";"], t["stmts"], t["end"], t["for"] }); parser.addProduction(t["stmt"], new List <Token> { id, t[":="], t["expr"] }); parser.addProduction(t["stmt"], new List <Token> { t["read"], id }); parser.addProduction(t["stmt"], new List <Token> { t["print"], t["expr"] }); parser.addProduction(t["stmt"], new List <Token> { t["assert"], t["("], t["expr"], t[")"] }); parser.addProduction(t["expr"], new List <Token> { t["expr2"] }); parser.addProduction(t["expr"], new List <Token> { t["unary_op"], t["opnd"] }); parser.addProduction(t["expr2"], new List <Token> { t["opnd"], t["expr3"] }); parser.addProduction(t["expr3"], new List <Token> { t["op"], t["opnd"] }); parser.addProduction(t["expr3"], new List <Token> { }); parser.addProduction(t["opnd"], new List <Token> { intV }); parser.addProduction(t["opnd"], new List <Token> { strV }); parser.addProduction(t["opnd"], new List <Token> { boolV }); parser.addProduction(t["opnd"], new List <Token> { id }); parser.addProduction(t["opnd"], new List <Token> { t["("], t["expr"], t[")"] }); parser.addProduction(t["type"], new List <Token> { t["int"] }); parser.addProduction(t["type"], new List <Token> { t["string"] }); parser.addProduction(t["type"], new List <Token> { t["bool"] }); parser.addProduction(t["maybeAssign"], new List <Token> { t[":="], t["expr"] }); parser.addProduction(t["maybeAssign"], new List <Token> { }); parser.addProduction(t["unary_op"], new List <Token> { not }); parser.addProduction(t["unary_op"], new List <Token> { o["-"] }); parser.setStartSymbol(t["prog"]); parser.prepareForParsing(); }