コード例 #1
0
        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();
        }
コード例 #2
0
        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]);
        }
コード例 #3
0
        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");
        }