Example #1
0
        private ExpressionAST ParseVariableAssignment()
        {
            var variable = new VariableExpressionAST();

            variable.IsToSet   = true;
            variable.IsMutable = parser.LastToken.TokenType == TokenType.Var;

            parser.ProceedToken(); // val/var を消費
            Assert.AssertTypeMatch(parser.LastToken, TokenType.Identifier);
            variable.Name = parser.LastToken.Value;

            parser.ProceedToken(); // 変数名を消費

            if (parser.LastToken.TokenType == TokenType.BlockStartOrColon)
            {
                parser.ProceedToken(); // : を消費
                Assert.AssertTypeMatch(parser.LastToken, TokenType.Identifier);
                variable.ReturnType = parser.LastToken.Value;
                parser.ProceedToken(); // 型を消費
            }

            if (parser.LastToken.TokenType != TokenType.Equals)
            {
                if (variable.ReturnType == null)
                {
                    RevnException.ThrowParserException($"Variable {variable.Name} must have a type.", parser.LastToken);
                }
                functionGenerator.AddVariable(variable);
                return(variable);
            }

            parser.ProceedToken(); // = を消費

            var assignment = new AssignmentAST
            {
                LHS = variable,
                RHS = GenerateExpressionAST()
            };

            if (variable.ReturnType == null)
            {
                variable.ReturnType = assignment.RHS.ReturnType;
            }
            functionGenerator.AddVariable(variable);

            return(assignment);
        }
Example #2
0
 internal void AddVariable(VariableExpressionAST variable)
 {
     variable.Index = localVariables.Count;
     localVariables.Add(variable);
 }
Example #3
0
        private ExpressionAST ParseIdentifier(string inferedType)
        {
            string identifier = parser.LastToken.Value;

            parser.ProceedToken();

            while (parser.LastToken.TokenType == TokenType.Period)
            {
                parser.ProceedToken(); // . を消費
                Assert.AssertTypeMatch(parser.LastToken, TokenType.Identifier);
                identifier += "." + parser.LastToken.Value;
                parser.ProceedToken(); // 変数を消費
            }

            if (parser.LastToken.TokenType != TokenType.LParen)
            {
                if (!functionGenerator.HasLocalVariable(identifier))
                {
                    RevnException.ThrowParserException("Variable is not assigned.", parser.LastToken);
                }

                string type = functionGenerator.GetVariable(identifier).ReturnType;

                var variable = new VariableExpressionAST();
                variable.ReturnType = type;
                variable.Name       = identifier;
                variable.Index      = LocalVariableIndex;
                return(variable);
            }

            if (inferedType == null)
            {
                inferedType = "void";
            }

            parser.ProceedToken(); // ( を消費

            var args = new List <ExpressionAST>();

            if (parser.LastToken.TokenType != TokenType.RParen)
            {
                while (true)
                {
                    var arg = GenerateExpressionAST();
                    args.Add(arg);

                    if (parser.LastToken.TokenType == TokenType.RParen)
                    {
                        break;
                    }

                    if (parser.LastToken.TokenType != TokenType.Comma)
                    {
                        RevnException.ThrowParserException("Expected comma or )", parser.LastToken);
                    }
                    parser.ProceedToken(); // , を消費
                }
            }

            parser.ProceedToken(); // ) を消費

            return(new CallExpressionAST(identifier, args, inferedType));
        }