static void WriteStatement(StreamWriter writer, AST.Statement statement) { if (statement is AST.Return) { WriteReturn(writer, (AST.Return)statement); } }
private AST.Statement ParseIfStatement(Lexer lexer) { var expr = ParseExpression(lexer); var text = string.Empty; var token = lexer.InputToken(out text); if (token == Token.辅助标点) { token = lexer.InputToken(out text); } if (token != Token.则) { throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } token = lexer.InputToken(out text); if (token != Token.冒号) { lexer.ReturnToken(token, text); } var trueBlock = ParseBlockStatement(lexer); AST.Statement falseBlock = null; token = lexer.InputToken(out text); if (token == Token.否则) { token = lexer.InputToken(out text); if (token != Token.冒号) { lexer.ReturnToken(token, text); } falseBlock = ParseBlockStatement(lexer); } else { lexer.ReturnToken(token, text); } return(new AST.IfStatement(expr, trueBlock, falseBlock)); }
/// <summary> /// Renders a single statement with the given indentation /// </summary> /// <returns>The VHDL lines in the statement.</returns> /// <param name="method">The method the statement belongs to.</param> /// <param name="statement">The statement to render.</param> /// <param name="indentation">The indentation to use.</param> private IEnumerable <string> RenderStatement(AST.Method method, AST.Statement statement, int indentation) { if (statement is AST.ForStatement) { return(RenderStatement(method, statement as AST.ForStatement, indentation)); } else if (statement is AST.ReturnStatement) { return(RenderStatement(method, statement as AST.ReturnStatement, indentation)); } else if (statement is AST.BlockStatement) { return(RenderStatement(method, statement as AST.BlockStatement, indentation)); } else if (statement is AST.SwitchStatement) { return(RenderStatement(method, statement as AST.SwitchStatement, indentation)); } else if (statement is AST.IfElseStatement) { return(RenderStatement(method, statement as AST.IfElseStatement, indentation)); } else if (statement is AST.ExpressionStatement) { return(RenderStatement(method, statement as AST.ExpressionStatement, indentation)); } else if (statement is AST.CommentStatement) { return(RenderStatement(method, statement as AST.CommentStatement, indentation)); } else if (statement is AST.EmptyStatement) { return(new string[0]); } else { throw new Exception($"Unuspported statement type: {statement.GetType().FullName}"); } }
private AST.BlockStatement ParseBlockStatement(Lexer lexer) { var block = new AST.BlockStatement(); var exitLoop = false; while (!exitLoop) { var text = string.Empty; var token = lexer.InputToken(out text); AST.Statement steatement = null; switch (token) { case Token.一个数字: steatement = ParseNumberVariableStatement(lexer); break; case Token.一句话: steatement = ParseStringVariableStatement(lexer); break; case Token.一个逻辑量: steatement = ParseBooleanVariableStatement(lexer); break; case Token.一个阵列: steatement = ParseArrayVariableStatement(lexer); break; case Token.一种方法: steatement = ParseFunctionStatement(lexer); break; case Token.设: steatement = ParseSetVariableStatement(lexer); break; case Token.如果: steatement = ParseIfStatement(lexer); break; case Token.当: steatement = ParseWhileStatement(lexer); break; case Token.列操作: steatement = ParseLoopCountStatement(lexer); break; case Token.跳出循环: steatement = ParseBreakStatement(lexer); break; case Token.返回: steatement = ParseReturnStatement(lexer); break; case Token.方法调用: steatement = ParseCallExpression(lexer, ParseName(text), true); break; case Token.行结束符号: continue; case Token.段结束符号: exitLoop = true; continue; case Token.V程序结束: lexer.ReturnToken(token, text); exitLoop = true; continue; default: throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } block.AddStatement(steatement); } return(block); }
virtual public void visit(AST.Statement statement) { statement.body.accept(this); }