public List <Production> GetRulesForNt(Nonterminal nt) { List <Production> rules; ntTable.TryGetValue(nt, out rules); return(rules); }
public State(Nonterminal predictionSeedNonterminal = null) { _items = new List <Item>(); _nonterminalsPredicted = new HashSet <Nonterminal>(); if (predictionSeedNonterminal != null) { _nonterminalsPredicted.Add(predictionSeedNonterminal); } }
public EarleyParser(Grammar g) { this.axiom = g.getAxiom(); if (axiom == null) { throw new ArgumentNullException(); } this.g = g; }
public static Nonterminal Of(TokenType v) { Nonterminal nonterminal; if (!_nonterminals.TryGetValue(v, out nonterminal)) { nonterminal = new Nonterminal(v); _nonterminals[v] = nonterminal; } return(nonterminal); }
private void FillNtTable() { foreach (Production pr in productions) { Nonterminal nt = pr.LeftSide; List <Production> list; if (!ntTable.TryGetValue(nt, out list)) { list = new List <Production>(); ntTable[nt] = list; } list.Add(pr); } }
private void Predictor(Item item, int stateNumber, int k) { Nonterminal nt = item.NextWord as Nonterminal; foreach (Production p in g.GetRulesForNt(nt)) { //int pos = item.Pos; Item newItem = new Item(p, 0, stateNumber); if (!S[k].Contains(newItem)) { S[k].Add(newItem); //Console.Out.WriteLine("Predicted from nonterminal in S[k+1]"); } } }
public Production(Nonterminal left, Sentence right, int number) { LeftSide = left; RightSide = right; Number = number; }
// задаем каждую продукцию однострочно в виде A -> B private void InitGrammar() { List <Production> productions = new List <Production> { new Production( Nonterminal.Of(TokenType.Axiom), new Sentence { Terminal.Of(TokenType.Import), Terminal.Of(TokenType.Fmt), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Declarations), //Terminal.Eof }, 0), // --------------- ¬џ–ј∆≈Ќ»я --------------- new Production( Nonterminal.Of(TokenType.Arguments), new Sentence { Nonterminal.Of(TokenType.Operand1lvl) }, 1), new Production( Nonterminal.Of(TokenType.Arguments), new Sentence { Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.Comma), Nonterminal.Of(TokenType.Arguments) }, 2), new Production( Nonterminal.Of(TokenType.Operand1lvl), new Sentence { Nonterminal.Of(TokenType.Operand2lvl), Terminal.Of(TokenType.LogicalOr), Nonterminal.Of(TokenType.Operand1lvl) }, 3), new Production( Nonterminal.Of(TokenType.Operand1lvl), new Sentence { Nonterminal.Of(TokenType.Operand2lvl) }, 4), new Production( Nonterminal.Of(TokenType.Operand2lvl), new Sentence { Nonterminal.Of(TokenType.Operand3lvl), Terminal.Of(TokenType.LogicalAnd), Nonterminal.Of(TokenType.Operand2lvl) }, 5), new Production( Nonterminal.Of(TokenType.Operand2lvl), new Sentence { Nonterminal.Of(TokenType.Operand3lvl) }, 6), new Production( Nonterminal.Of(TokenType.Operand3lvl), new Sentence { Nonterminal.Of(TokenType.Operand4lvl), Terminal.Of(TokenType.Comparison), Nonterminal.Of(TokenType.Operand4lvl) }, 7), new Production( Nonterminal.Of(TokenType.Operand3lvl), new Sentence { Nonterminal.Of(TokenType.Literal) }, 8), new Production( Nonterminal.Of(TokenType.Operand3lvl), new Sentence { Terminal.Of(TokenType.OpenningRoundBracket), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.ClosingRoundBracket) }, 9), new Production( Nonterminal.Of(TokenType.Operand3lvl), new Sentence { Terminal.Of(TokenType.LogicalNegation), Terminal.Of(TokenType.OpenningRoundBracket), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.ClosingRoundBracket) }, 10), new Production( Nonterminal.Of(TokenType.Operand3lvl), new Sentence { Nonterminal.Of(TokenType.Operand4lvl), }, 11), /*new Production( * Nonterminal.Of(TokenType.Operand3lvl), * new Sentence * { * Nonterminal.Of(TokenType.Operand4lvl), * Terminal.Of(TokenType.Comparison), * Nonterminal.Of(TokenType.Operand4lvl) // DONE операнд 3ур> --> <операнд 4ур> <знак операции сравнени¤> <операнд 4ур> * }, 12),*/ new Production( Nonterminal.Of(TokenType.Operand4lvl), new Sentence { Nonterminal.Of(TokenType.Operand5lvl), Terminal.Of(TokenType.Addition), Nonterminal.Of(TokenType.Operand4lvl) }, 13), new Production( Nonterminal.Of(TokenType.Operand4lvl), new Sentence { Nonterminal.Of(TokenType.Operand5lvl) }, 14), new Production( Nonterminal.Of(TokenType.Operand5lvl), new Sentence { Nonterminal.Of(TokenType.Operand6lvl), Terminal.Of(TokenType.Multiplication), Nonterminal.Of(TokenType.Operand5lvl) }, 15), new Production( Nonterminal.Of(TokenType.Operand5lvl), new Sentence { Nonterminal.Of(TokenType.Operand6lvl) }, 16), new Production( Nonterminal.Of(TokenType.Operand6lvl), new Sentence { Terminal.Of(TokenType.Identifier) }, 17), new Production( Nonterminal.Of(TokenType.Operand6lvl), new Sentence { Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Terminal.Of(TokenType.ClosingRoundBracket) }, 18), new Production( Nonterminal.Of(TokenType.Operand6lvl), new Sentence { Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Nonterminal.Of(TokenType.Arguments), Terminal.Of(TokenType.ClosingRoundBracket) }, 19), new Production( Nonterminal.Of(TokenType.Operand6lvl), new Sentence { Nonterminal.Of(TokenType.Literal) }, 20), new Production( Nonterminal.Of(TokenType.Operand6lvl), new Sentence { Terminal.Of(TokenType.OpenningRoundBracket), Nonterminal.Of(TokenType.Operand4lvl), Terminal.Of(TokenType.ClosingRoundBracket) }, 21), // --------------- ¬џ— ј«џ¬јЌ»я --------------- new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Nonterminal.Of(TokenType.VarDeclaration) }, 22), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Nonterminal.Of(TokenType.StatementIf) }, 23), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Nonterminal.Of(TokenType.StatementSwitch) }, 24), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Nonterminal.Of(TokenType.StatementFor) }, 25), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Terminal.Of(TokenType.IdentifierReturn), Terminal.Of(TokenType.EndOfStatement), }, 26), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Terminal.Of(TokenType.IdentifierReturn), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.EndOfStatement) }, 27), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.Assignment), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.EndOfStatement) }, 28), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Terminal.Of(TokenType.ClosingRoundBracket), Terminal.Of(TokenType.EndOfStatement) }, 29), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Nonterminal.Of(TokenType.Arguments), Terminal.Of(TokenType.ClosingRoundBracket), Terminal.Of(TokenType.EndOfStatement) }, 30), new Production( Nonterminal.Of(TokenType.Statements), new Sentence { Nonterminal.Of(TokenType.Statement) }, 31), new Production( Nonterminal.Of(TokenType.Statement), new Sentence { Nonterminal.Of(TokenType.Statement), Nonterminal.Of(TokenType.Statements), }, 32), // --------------- ќЅЏя¬Ћ≈Ќ»я --------------- new Production( Nonterminal.Of(TokenType.Declarations), new Sentence { Nonterminal.Of(TokenType.VarDeclaration), Nonterminal.Of(TokenType.Declarations) }, 33), new Production( Nonterminal.Of(TokenType.Declarations), new Sentence { Nonterminal.Of(TokenType.FuncDeclaration), Nonterminal.Of(TokenType.Declarations) }, 34), new Production( Nonterminal.Of(TokenType.Declarations), new Sentence { Nonterminal.Of(TokenType.FuncDeclaration) }, 35), new Production( Nonterminal.Of(TokenType.VarDeclaration), new Sentence { Terminal.Of(TokenType.IdentifierConst), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.IdentifierType), Terminal.Of(TokenType.Assignment), Nonterminal.Of(TokenType.Literal), Terminal.Of(TokenType.EndOfStatement) }, 36), new Production( Nonterminal.Of(TokenType.VarDeclaration), new Sentence { Terminal.Of(TokenType.IdentifierVar), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.IdentifierType), Terminal.Of(TokenType.Assignment), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.EndOfStatement) }, 37), new Production( Nonterminal.Of(TokenType.FuncDeclaration), new Sentence { Terminal.Of(TokenType.IdentifierFunc), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Nonterminal.Of(TokenType.Parameters), Terminal.Of(TokenType.ClosingRoundBracket), Terminal.Of(TokenType.IdentifierType), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 38), new Production( Nonterminal.Of(TokenType.FuncDeclaration), new Sentence { Terminal.Of(TokenType.IdentifierFunc), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Nonterminal.Of(TokenType.Parameters), Terminal.Of(TokenType.ClosingRoundBracket), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 39), new Production( Nonterminal.Of(TokenType.FuncDeclaration), new Sentence { Terminal.Of(TokenType.IdentifierFunc), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Terminal.Of(TokenType.ClosingRoundBracket), Terminal.Of(TokenType.IdentifierType), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 40), new Production( Nonterminal.Of(TokenType.FuncDeclaration), new Sentence { Terminal.Of(TokenType.IdentifierFunc), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.OpenningRoundBracket), Terminal.Of(TokenType.ClosingRoundBracket), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 41), new Production( Nonterminal.Of(TokenType.Parameters), new Sentence { Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.IdentifierType) }, 42), new Production( Nonterminal.Of(TokenType.Parameters), new Sentence { Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.IdentifierType), Terminal.Of(TokenType.Comma), Nonterminal.Of(TokenType.Parameters) }, 43), // ------------------ IF ------------------ new Production( Nonterminal.Of(TokenType.StatementIf), new Sentence { Terminal.Of(TokenType.IdentifierIf), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 44), new Production( Nonterminal.Of(TokenType.StatementIf), new Sentence { Terminal.Of(TokenType.IdentifierIf), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 45), new Production( Nonterminal.Of(TokenType.StatementIf), new Sentence { Terminal.Of(TokenType.IdentifierIf), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Nonterminal.Of(TokenType.ElseBrunch) }, 46), new Production( Nonterminal.Of(TokenType.StatementIf), new Sentence { Terminal.Of(TokenType.IdentifierIf), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Terminal.Of(TokenType.ClosingCurlyBracket), Nonterminal.Of(TokenType.ElseBrunch) }, 47), new Production( Nonterminal.Of(TokenType.ElseBrunch), new Sentence { Terminal.Of(TokenType.IdentifierElse), Nonterminal.Of(TokenType.StatementIf) }, 48), new Production( Nonterminal.Of(TokenType.ElseBrunch), new Sentence { Terminal.Of(TokenType.IdentifierElse), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 49), new Production( Nonterminal.Of(TokenType.ElseBrunch), new Sentence { Terminal.Of(TokenType.IdentifierElse), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 50), // ----------------- FOR ------------------ new Production( Nonterminal.Of(TokenType.StatementFor), new Sentence { Terminal.Of(TokenType.IdentifierFor), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 51), new Production( Nonterminal.Of(TokenType.StatementFor), new Sentence { Terminal.Of(TokenType.IdentifierFor), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.ShortAssignment), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.Semicolon), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.Semicolon), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.Assignment), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 52), new Production( Nonterminal.Of(TokenType.StatementFor), new Sentence { Terminal.Of(TokenType.IdentifierFor), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 53), new Production( Nonterminal.Of(TokenType.StatementFor), new Sentence { Terminal.Of(TokenType.IdentifierFor), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.ShortAssignment), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.Semicolon), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.Semicolon), Terminal.Of(TokenType.Identifier), Terminal.Of(TokenType.Assignment), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 54), // ---------------- SWITCH ---------------- new Production( Nonterminal.Of(TokenType.StatementSwitch), new Sentence { Terminal.Of(TokenType.IdentifierSwitch), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.OpenningCurlyBracket), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.CaseClause), Terminal.Of(TokenType.ClosingCurlyBracket), Terminal.Of(TokenType.EndOfStatement) }, 55), new Production( Nonterminal.Of(TokenType.CaseClause), new Sentence { Nonterminal.Of(TokenType.CaseBrunches), Terminal.Of(TokenType.IdentifierDefault), Terminal.Of(TokenType.Colon), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements) }, 56), new Production( Nonterminal.Of(TokenType.CaseClause), new Sentence { Nonterminal.Of(TokenType.CaseBrunches) }, 57), new Production( Nonterminal.Of(TokenType.CaseBrunches), new Sentence { Terminal.Of(TokenType.IdentifierCase), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.Colon), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements) }, 58), new Production( Nonterminal.Of(TokenType.CaseBrunches), new Sentence { Terminal.Of(TokenType.IdentifierCase), Nonterminal.Of(TokenType.Operand1lvl), Terminal.Of(TokenType.Colon), Terminal.Of(TokenType.EndOfStatement), Nonterminal.Of(TokenType.Statements), Nonterminal.Of(TokenType.CaseBrunches) }, 59), // --------------- Ћ»“≈–јЋџ --------------- new Production( Nonterminal.Of(TokenType.Literal), new Sentence { Terminal.Of(TokenType.BoolLiteral) }, 60), new Production( Nonterminal.Of(TokenType.Literal), new Sentence { Terminal.Of(TokenType.FloatLiteral) }, 61), new Production( Nonterminal.Of(TokenType.Literal), new Sentence { Terminal.Of(TokenType.IntLiteral) }, 62), new Production( Nonterminal.Of(TokenType.Literal), new Sentence { Terminal.Of(TokenType.StringLiteral) }, 63) }; /*foreach (var letter in new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" }) * { * productions.Add( * new Production(Nonterminal.Of(TokenType.Letter), new Sentence { * Terminal.Of(letter), * }) * ); * } * foreach (var digit in new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }) * { * productions.Add( * new Production(Nonterminal.Of(TokenType.Digit), new Sentence { * Terminal.Of(digit), * }) * ); * }*/ this.start = Nonterminal.Of(TokenType.Axiom); this.productions = productions; //FillNtTable(); ntTable = BuildTable( () => productions, (p) => p.LeftSide, (p) => p, () => new List <Production>(), (x, y) => x.Add(y) ); }