Exemple #1
0
 static void WriteStatement(StreamWriter writer, AST.Statement statement)
 {
     if (statement is AST.Return)
     {
         WriteReturn(writer, (AST.Return)statement);
     }
 }
Exemple #2
0
        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));
        }
Exemple #3
0
 /// <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}");
     }
 }
Exemple #4
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);
        }
 virtual public void visit(AST.Statement statement)
 {
     statement.body.accept(this);
 }