/// <summary> /// Renders a single BlockStatement 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="s">The statement to render.</param> /// <param name="indentation">The indentation to use.</param> private IEnumerable <string> RenderStatement(AST.Method method, AST.BlockStatement s, int indentation) { foreach (var n in s.Statements) { foreach (var x in RenderStatement(method, n, indentation)) { yield return(x); } } }
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); }