public Statement Parse(ScriptParser parser, ScriptToken token, out bool trailingSemicolon) { trailingSemicolon = true; var baseType = parser.ParseType(token); var definitions = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) => { var name = parser.Take(ScriptTokenType.Identifier).Contents; var arrayDims = 0; while (parser.MatchAndTake(ScriptTokenType.LeftSquare)) { parser.Take(ScriptTokenType.RightSquare); arrayDims++; } var type = baseType; if (arrayDims > 0) { type = new ScriptType(baseType.Name, baseType.ArrayDimensions + arrayDims, baseType.IsResizable); } Expression value = null; if (parser.MatchAndTake(ScriptTokenType.Assign)) { value = parser.ParseExpression(); } return(new VariableStatement.Definition(type, name, value)); }).ToList(); return(new VariableStatement(token, parser.Previous, baseType, false, definitions)); }
public Expression Parse(ScriptParser parser, ScriptToken token) { var type = string.Join(".", parser.ParseSeparatedBy(ScriptTokenType.Dot, (_, first) => parser.Take(ScriptTokenType.Identifier).Contents)); if (type == "string") { type = "String"; } var isArray = parser.Match(ScriptTokenType.LeftSquare); parser.Take(isArray ? ScriptTokenType.LeftSquare : ScriptTokenType.LeftParen); var parameters = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) => { if (first && parser.Match(isArray ? ScriptTokenType.RightSquare : ScriptTokenType.RightParen)) { return(null); } return(parser.ParseExpression()); }).ToList(); parser.Take(isArray ? ScriptTokenType.RightSquare : ScriptTokenType.RightParen); List <Expression> values = null; if (isArray && parser.MatchAndTake(ScriptTokenType.LeftBrace)) { values = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) => { if (parser.Match(ScriptTokenType.RightBrace)) { return(null); } return(parser.ParseExpression()); }).ToList(); parser.MatchAndTake(ScriptTokenType.RightBrace); } int arrayDimensions = isArray ? 1 : 0; if (isArray) { while (parser.Match(ScriptTokenType.LeftSquare) && parser.Match(ScriptTokenType.RightSquare, 1)) { parser.Take(ScriptTokenType.LeftSquare); parser.Take(ScriptTokenType.RightSquare); arrayDimensions++; } } return(new NewExpression(token, parser.Previous, type, arrayDimensions, parameters, values)); }
public Declaration Parse(ScriptParser parser, ScriptToken token) { var done = false; var tokens = parser.ParseSeparatedBy(ScriptTokenType.Dot, (_, first) => { if (done) { return(null); } if (parser.Match(ScriptTokenType.Multiply)) { done = true; return(parser.Take(ScriptTokenType.Multiply)); } return(parser.Take(ScriptTokenType.Identifier)); }); var name = string.Join(".", tokens.Select(t => t.Contents)); if (!parser.MatchAndTake(ScriptTokenType.Semicolon)) { Console.WriteLine("JFjngkjasnholjhnaskl"); } return(new IncludeDeclaration(token, parser.Previous, name)); }
public Declaration Parse(ScriptParser parser, ScriptToken token) { var returnType = parser.ParseType(token); var name = parser.Take(ScriptTokenType.Identifier).Contents; if (parser.MatchAndTake(ScriptTokenType.Assign)) { var value = parser.ParseExpression(); parser.Take(ScriptTokenType.Semicolon); return(new FieldDeclaration(token, parser.Previous, returnType, name, value, false, false)); } parser.Take(ScriptTokenType.LeftParen); var parameters = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) => { if (parser.Match(ScriptTokenType.RightParen)) { return(null); } ScriptType paramType; string paramName; parser.ParseNamedType(out paramType, out paramName); return(new MethodDeclaration.Parameter(paramType, paramName)); }).ToList(); parser.Take(ScriptTokenType.RightParen); var block = parser.ParseBlock(false); return(new MethodDeclaration(token, parser.Previous, returnType, name, parameters, block)); }
public Statement Parse(ScriptParser parser, ScriptToken token, out bool trailingSemicolon) { trailingSemicolon = false; var first = true; var branches = new List <IfStatement.Branch>(); IfStatement.Branch defaultBranch = null; do { var isDefaultBranch = !first && !parser.MatchAndTake(ScriptTokenType.If); first = false; Expression condition = null; if (!isDefaultBranch) { parser.Take(ScriptTokenType.LeftParen); condition = parser.ParseExpression(); parser.Take(ScriptTokenType.RightParen); } var block = parser.ParseBlock(); var branch = new IfStatement.Branch(condition, block); if (isDefaultBranch) { defaultBranch = branch; } else { branches.Add(branch); } if (isDefaultBranch) { break; } } while (parser.MatchAndTake(ScriptTokenType.Else)); return(new IfStatement(token, parser.Previous, branches, defaultBranch)); }
public Declaration Parse(ScriptParser parser, ScriptToken token) { var tokens = parser.ParseSeparatedBy(ScriptTokenType.Dot, (_, first) => parser.Take(ScriptTokenType.Identifier)); var name = string.Join(".", tokens.Select(t => t.Contents)); if (!parser.MatchAndTake(ScriptTokenType.Semicolon)) { Console.WriteLine("fkshgnbkashnkhnasb"); } return(new InheritsDeclaration(token, parser.Previous, name)); }
public Statement Parse(ScriptParser parser, ScriptToken token, out bool trailingSemicolon) { trailingSemicolon = false; parser.Take(ScriptTokenType.LeftParen); var expression = parser.ParseExpression(); parser.Take(ScriptTokenType.RightParen); parser.Take(ScriptTokenType.LeftBrace); var hasDefault = false; var branches = new List <SwitchStatement.Branch>(); while (!parser.Match(ScriptTokenType.RightBrace)) { var conditions = new List <Expression>(); while (true) { if (parser.MatchAndTake(ScriptTokenType.Case)) { var condition = parser.ParseExpression(); conditions.Add(condition); parser.Take(ScriptTokenType.Colon); continue; } if (!parser.Match(ScriptTokenType.Default)) { break; } var defaultToken = parser.Take(ScriptTokenType.Default); if (hasDefault) { throw new CompilerException(defaultToken, "Multiple default labels"); } conditions.Add(null); // special default condition hasDefault = true; parser.Take(ScriptTokenType.Colon); } if (conditions.Count > 0) { var block = ParseBlock(parser); var branch = new SwitchStatement.Branch(conditions, block); branches.Add(branch); continue; } var errorToken = parser.Peek(); throw new CompilerException(errorToken, "Expected Case or Default but found {0}", errorToken); } parser.Take(ScriptTokenType.RightBrace); return(new SwitchStatement(token, parser.Previous, expression, branches)); }