public Expression Parse(Parser parser, Token token, out bool trailingSemicolon) { trailingSemicolon = false; parser.Take(TokenType.LeftParen); var expression = parser.ParseExpression(); parser.Take(TokenType.RightParen); parser.Take(TokenType.LeftBrace); var hasDefault = false; var branches = new List<SwitchExpression.Branch>(); while (!parser.Match(TokenType.RightBrace)) { var conditions = new List<Expression>(); while (true) { if (parser.MatchAndTake(TokenType.Case)) { var condition = parser.ParseExpression(); conditions.Add(condition); parser.Take(TokenType.Colon); continue; } if (!parser.Match(TokenType.Default)) break; var defaultToken = parser.Take(TokenType.Default); if (hasDefault) throw new MondCompilerException(defaultToken, CompilerError.DuplicateDefault); conditions.Add(null); // special default condition hasDefault = true; parser.Take(TokenType.Colon); } if (conditions.Count > 0) { var block = ParseBlock(parser); var branch = new SwitchExpression.Branch(conditions, block); branches.Add(branch); continue; } var errorToken = parser.Peek(); throw new MondCompilerException(errorToken, CompilerError.ExpectedButFound2, TokenType.Case, TokenType.Default, errorToken); } parser.Take(TokenType.RightBrace); return new SwitchExpression(token, expression, branches); }
public Expression Parse(Parser parser, Token token, out bool trailingSemicolon) { trailingSemicolon = false; parser.Take(TokenType.LeftParen); var expression = parser.ParseExpession(); parser.Take(TokenType.RightParen); parser.Take(TokenType.LeftBrace); var branches = new List<SwitchExpression.Branch>(); BlockExpression defaultBlock = null; while (!parser.Match(TokenType.RightBrace)) { var conditions = new List<Expression>(); while (parser.MatchAndTake(TokenType.Case)) { var condition = parser.ParseExpession(); conditions.Add(condition); parser.Take(TokenType.Colon); } if (conditions.Count > 0) { var block = ParseBlock(parser); var branch = new SwitchExpression.Branch(conditions, block); branches.Add(branch); continue; } if (parser.MatchAndTake(TokenType.Default)) { parser.Take(TokenType.Colon); var block = ParseBlock(parser); defaultBlock = block; break; } var errorToken = parser.Peek(); throw new MondCompilerException(errorToken.FileName, errorToken.Line, "Expected Case or Default but got {0}", errorToken.Type); } parser.Take(TokenType.RightBrace); return new SwitchExpression(token, expression, branches, defaultBlock); }
public Expression Parse(Parser parser, Token token, out bool trailingSemicolon) { trailingSemicolon = false; parser.Take(TokenType.LeftParen); var expression = parser.ParseExpession(); parser.Take(TokenType.RightParen); parser.Take(TokenType.LeftBrace); var branches = new List <SwitchExpression.Branch>(); BlockExpression defaultBlock = null; while (!parser.Match(TokenType.RightBrace)) { var conditions = new List <Expression>(); while (parser.MatchAndTake(TokenType.Case)) { var condition = parser.ParseExpession(); conditions.Add(condition); parser.Take(TokenType.Colon); } if (conditions.Count > 0) { var block = ParseBlock(parser); var branch = new SwitchExpression.Branch(conditions, block); branches.Add(branch); continue; } if (parser.MatchAndTake(TokenType.Default)) { parser.Take(TokenType.Colon); var block = ParseBlock(parser); defaultBlock = block; break; } var errorToken = parser.Peek(); throw new MondCompilerException(errorToken.FileName, errorToken.Line, CompilerError.ExpectedButFound2, TokenType.Case, TokenType.Default, errorToken); } parser.Take(TokenType.RightBrace); return(new SwitchExpression(token, expression, branches, defaultBlock)); }
public Expression Parse(Parser parser, Token token, out bool trailingSemicolon) { trailingSemicolon = false; parser.Take(TokenType.LeftParen); var expression = parser.ParseExpression(); parser.Take(TokenType.RightParen); parser.Take(TokenType.LeftBrace); var hasDefault = false; var branches = new List <SwitchExpression.Branch>(); while (!parser.Match(TokenType.RightBrace)) { var conditions = new List <Expression>(); while (true) { if (parser.MatchAndTake(TokenType.Case)) { var condition = parser.ParseExpression(); conditions.Add(condition); parser.Take(TokenType.Colon); continue; } if (!parser.Match(TokenType.Default)) { break; } var defaultToken = parser.Take(TokenType.Default); if (hasDefault) { throw new MondCompilerException(defaultToken, CompilerError.DuplicateDefault); } conditions.Add(null); // special default condition hasDefault = true; parser.Take(TokenType.Colon); } if (conditions.Count > 0) { var block = ParseBlock(parser); var branch = new SwitchExpression.Branch(conditions, block); branches.Add(branch); continue; } var errorToken = parser.Peek(); throw new MondCompilerException(errorToken, CompilerError.ExpectedButFound2, TokenType.Case, TokenType.Default, errorToken); } parser.Take(TokenType.RightBrace); return(new SwitchExpression(token, expression, branches)); }