コード例 #1
0
        public bool GetAST(out ProgramAst prg)
        {
            program = new ProgramAst();
            prg     = program;

            BaseAst node = BaseAst.GetInitLoopAstNode();

            while ((node.Token != TokenTypes.End) && (!node.IsError))
            {
                ReadNextAst();
                node = actualNode;

                switch (actualNode.Token)
                {
                case TokenTypes.VarRW:     // deklarace globalni promenne
                    node = GetVariables();
                    break;


                case TokenTypes.FunctionRW:     // deklarace funkce
                    node = GetFunctionAST(node as FunctionAst);
                    break;


                case TokenTypes.End:     // konec programu
                    break;


                default:
                    node = BaseAst.GetErrorAstNode(string.Format("Je ocekavano klicove slovo 'var' nebo 'function', radek {0}, sloupec {1}", node.TokenStartLine, node.TokenStartColumn));
                    break;
                }
            }

            if (node.IsError)
            {
                Console.WriteLine("Error: '{0}'", node.ErrorMessage);
                return(false);
            }
            return(true);
        }
コード例 #2
0
        private BaseAst GetBlockAST(BlockAst block)
        {
            if (block == null)
            {
                return(BaseAst.GetErrorAstNode("Chybne volana funkce 'GetBlockAST(BlockAst block)', parametr 'block' je null"));
            }

            BaseAst node = BaseAst.GetInitLoopAstNode();

            while ((node.Token != TokenTypes.BraceRight) && !(node.IsError))
            {
                node = GetStatementAST();

                switch (node.Token)
                {
                case TokenTypes.End:
                    return(BaseAst.GetErrorAstNode(string.Format("Konec programu, blok neni korektne ukoncen, radek {0}, sloupec {1}", node.TokenStartLine, node.TokenStartColumn)));

                case TokenTypes.BraceLeft:
                    node = GetBlockAST(node as BlockAst);
                    break;
                }

                if (node.IsError)
                {
                    return(node);
                }

                if (node.Token == TokenTypes.BraceRight)
                {
                    break;
                }

                block.Statements.Add(node);
            }

            return(block);
        }