public void ShiftAction(SyntaxToken token, int state) { if (ShowStats.showParsingLive) { Print.PrintHeader("shift:"); } rememberSyntax.Push(new Syntax(token.Kind, token.Value)); rememberState.Push(state); Next(); }
private void ReduceAction(SyntaxToken token, int production, List <Dictionary <TokenKind, int> > gotoTable) { if (ShowStats.showParsingLive) { Print.PrintHeader("reduce:"); } if (production < 0) { Error(); return; } var grammar = Grammar.GrammarList.ElementAt(production); var rightHandSide = grammar.RightHandSide.Length; var leftHandSide = grammar.LeftHandSide; if (leftHandSide.Kind == TokenKind.Accepted) { AcceptedAction(); return; } List <Syntax> reducableList = new List <Syntax>(); while (rightHandSide > 0) { rememberState.Pop(); var reducable = rememberSyntax.Pop(); reducableList.Add(reducable); rightHandSide--; } if (ShowStats.showParsingLive) { Print.PrintLine($"{leftHandSide.Kind} ==> {grammar.RightHandSide.toString()}"); } rememberSyntax.Push(Reduce(leftHandSide, reducableList)); var previuosState = rememberState.Peek(); rememberState.Push(gotoTable[previuosState][leftHandSide.Kind]); }
public static void Run(string text) { Init(); Lexer lexer = new Lexer(text); List <SyntaxToken> tokens = lexer.Lex(); // tokens.Reverse(); tokens.Add(new SyntaxToken(TokenKind.Dollar, '$')); TreeGenerator treeGenerator = new TreeGenerator(parseTable, tokens, grammar); var tree = treeGenerator.generateTree(); if (ShowStats.showParseTree) { Print.PrintTree(tree); } Print.PrintHeader("Result"); Console.WriteLine(Evaluator.Evaluate(tree, false)); Console.WriteLine("\n End \n\n"); }