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); }
internal void AddVariable(VariableExpressionAST variable) { variable.Index = localVariables.Count; localVariables.Add(variable); }
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)); }