Ejemplo n.º 1
0
 /// <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);
         }
     }
 }
Ejemplo n.º 2
0
        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);
        }