示例#1
0
        private AST.Statement ParseArrayVariableStatement(Lexer lexer)
        {
            var text  = string.Empty;
            var token = lexer.InputToken(out text);

            if (token != Token.冒号)
            {
                lexer.ReturnToken(token, text);
            }

            var row = ParseExpression(lexer);

            token = lexer.InputToken(out text);
            if (token != Token.行)
            {
                throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列");
            }

            var col = ParseExpression(lexer);

            token = lexer.InputToken(out text);
            if (token != Token.列)
            {
                throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列");
            }

            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.V名称符号)
            {
                throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列");
            }
            var name = ParseName(text);

            AST.Expression expression;
            if (row is AST.ConstantExpression && col is AST.ConstantExpression)
            {
                var r = (int)((row as AST.ConstantExpression).Value.AsReal());
                var c = (int)((col as AST.ConstantExpression).Value.AsReal());
                expression = new AST.ConstantExpression(new ArrayValue(r, c));
            }
            else
            {
                expression = new AST.MakeArrayExpression(row, col, new BooleanValue(false));
            }
            return(new AST.VariableStatement(name, expression));
        }
示例#2
0
        private AST.Expression ParseExpressionL2(Lexer lexer)
        {
            AST.Expression expr  = null;
            var            text  = string.Empty;
            var            token = lexer.InputToken(out text);

            switch (token)
            {
            case Token.V名称符号:
            {
                var name = ParseName(text);
                token = lexer.InputToken(out text);
                if (token == Token.的第)
                {
                    var row = ParseExpression(lexer);
                    token = lexer.InputToken(out text);
                    if (token != Token.行)
                    {
                        throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列");
                    }

                    var col = ParseExpression(lexer);
                    token = lexer.InputToken(out text);
                    if (token != Token.列)
                    {
                        throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列");
                    }

                    expr = new AST.ReadArrayVariableExpression(name, row, col);
                }
                else
                {
                    lexer.ReturnToken(token, text);
                    expr = new AST.ReadVariableExpression(name);
                }
            }
            break;

            case Token.V字符串值:
            {
                var svalue = ParseStringValue(text);
                expr = new AST.ConstantExpression(new StringValue(svalue));
            }
            break;

            case Token.V数字值:
            {
                var dvalue = ParseNumberValue(text);
                if (((long)dvalue) == dvalue)
                {
                    expr = new AST.ConstantExpression(new IntegerValue((long)dvalue));
                }
                else
                {
                    expr = new AST.ConstantExpression(new RealValue(dvalue));
                }
            }
            break;

            case Token.真:
            {
                expr = new AST.ConstantExpression(new BooleanValue(true));
            }
            break;

            case Token.假:
            {
                expr = new AST.ConstantExpression(new BooleanValue(false));
            }
            break;

            case Token.方法调用:
                expr = ParseCallExpression(lexer, ParseName(text), false);
                break;

            default:
                throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列");
            }
            return(expr);
        }