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); }
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); }