using System; using System.Collections.Generic; using System.Globalization; using System.Text; using SharpLua.AST; namespace SharpLua.Parser { public partial class Parser { public Chunk ParseChunk(ParserInput input, out bool success) { this.SetInput(input); Chunk chunk = ParseChunk(out success); if (this.Position < input.Length) { success = false; Error("Failed to parse remaining input."); } return chunk; } private Chunk ParseChunk(out bool success) { var reskey = new Tuple(position, "Chunk"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Chunk; } int errorCount = Errors.Count; Chunk chunk = new Chunk(); int start_position = position; ParseSpOpt(out success); while (true) { while (true) { int seq_start_position1 = position; Statement statement = ParseStatement(out success); if (success) { chunk.Statements.Add(statement); } else { break; } while (true) { int seq_start_position2 = position; MatchTerminal(';', out success); if (!success) { break; } ParseSpOpt(out success); break; } success = true; break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(chunk, success, position); return chunk; } private Statement ParseStatement(out bool success) { var reskey = new Tuple(position, "Statement"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Statement; } int errorCount = Errors.Count; Statement statement = null; statement = ParseAssignment(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseFunction(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseLocalVar(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseLocalFunc(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseReturnStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseBreakStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseDoStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseIfStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseForStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseForInStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseWhileStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseRepeatStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } statement = ParseExprStmt(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(statement, success, position);return statement; } return statement; } private Assignment ParseAssignment(out bool success) { var reskey = new Tuple(position, "Assignment"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Assignment; } int errorCount = Errors.Count; Assignment assignment = new Assignment(); int start_position = position; assignment.VarList = ParseVarList(out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(assignment, success, position);return assignment; } ParseSpOpt(out success); MatchTerminal('=', out success); if (!success) { Error("Failed to parse '=' of Assignment."); position = start_position; ParsingResults[reskey] = new Tuple(assignment, success, position);return assignment; } ParseSpOpt(out success); assignment.ExprList = ParseExprList(out success); if (!success) { Error("Failed to parse ExprList of Assignment."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(assignment, success, position); return assignment; } private Function ParseFunction(out bool success) { var reskey = new Tuple(position, "Function"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Function; } int errorCount = Errors.Count; Function function = new Function(); int start_position = position; MatchTerminalString("function", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(function, success, position);return function; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of Function."); position = start_position; ParsingResults[reskey] = new Tuple(function, success, position);return function; } function.Name = ParseFunctionName(out success); if (!success) { Error("Failed to parse Name of Function."); position = start_position; ParsingResults[reskey] = new Tuple(function, success, position);return function; } ParseSpOpt(out success); function.Body = ParseFunctionBody(out success); if (!success) { Error("Failed to parse Body of Function."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(function, success, position); return function; } private LocalVar ParseLocalVar(out bool success) { var reskey = new Tuple(position, "LocalVar"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as LocalVar; } int errorCount = Errors.Count; LocalVar localVar = new LocalVar(); int start_position = position; MatchTerminalString("local", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(localVar, success, position);return localVar; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of LocalVar."); position = start_position; ParsingResults[reskey] = new Tuple(localVar, success, position);return localVar; } localVar.NameList = ParseNameList(out success); if (!success) { Error("Failed to parse NameList of LocalVar."); position = start_position; ParsingResults[reskey] = new Tuple(localVar, success, position);return localVar; } ParseSpOpt(out success); while (true) { int seq_start_position1 = position; MatchTerminal('=', out success); if (!success) { break; } ParseSpOpt(out success); localVar.ExprList = ParseExprList(out success); if (!success) { Error("Failed to parse ExprList of LocalVar."); position = seq_start_position1; } break; } success = true; ParsingResults[reskey] = new Tuple(localVar, success, position); return localVar; } private LocalFunc ParseLocalFunc(out bool success) { var reskey = new Tuple(position, "LocalFunc"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as LocalFunc; } int errorCount = Errors.Count; LocalFunc localFunc = new LocalFunc(); int start_position = position; MatchTerminalString("local", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(localFunc, success, position);return localFunc; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of LocalFunc."); position = start_position; ParsingResults[reskey] = new Tuple(localFunc, success, position);return localFunc; } MatchTerminalString("function", out success); if (!success) { Error("Failed to parse 'function' of LocalFunc."); position = start_position; ParsingResults[reskey] = new Tuple(localFunc, success, position);return localFunc; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of LocalFunc."); position = start_position; ParsingResults[reskey] = new Tuple(localFunc, success, position);return localFunc; } localFunc.Name = ParseName(out success); if (!success) { Error("Failed to parse Name of LocalFunc."); position = start_position; ParsingResults[reskey] = new Tuple(localFunc, success, position);return localFunc; } ParseSpOpt(out success); localFunc.Body = ParseFunctionBody(out success); if (!success) { Error("Failed to parse Body of LocalFunc."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(localFunc, success, position); return localFunc; } private ExprStmt ParseExprStmt(out bool success) { var reskey = new Tuple(position, "ExprStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as ExprStmt; } int errorCount = Errors.Count; ExprStmt exprStmt = new ExprStmt(); exprStmt.Expr = ParseExpr(out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse Expr of ExprStmt."); } ParsingResults[reskey] = new Tuple(exprStmt, success, position); return exprStmt; } private ReturnStmt ParseReturnStmt(out bool success) { var reskey = new Tuple(position, "ReturnStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as ReturnStmt; } int errorCount = Errors.Count; ReturnStmt returnStmt = new ReturnStmt(); int start_position = position; MatchTerminalString("return", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(returnStmt, success, position);return returnStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ReturnStmt."); position = start_position; ParsingResults[reskey] = new Tuple(returnStmt, success, position);return returnStmt; } returnStmt.ExprList = ParseExprList(out success); success = true; ParsingResults[reskey] = new Tuple(returnStmt, success, position); return returnStmt; } private BreakStmt ParseBreakStmt(out bool success) { var reskey = new Tuple(position, "BreakStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as BreakStmt; } int errorCount = Errors.Count; BreakStmt breakStmt = new BreakStmt(); int start_position = position; MatchTerminalString("break", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(breakStmt, success, position);return breakStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of BreakStmt."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(breakStmt, success, position); return breakStmt; } private DoStmt ParseDoStmt(out bool success) { var reskey = new Tuple(position, "DoStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as DoStmt; } int errorCount = Errors.Count; DoStmt doStmt = new DoStmt(); int start_position = position; MatchTerminalString("do", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(doStmt, success, position);return doStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of DoStmt."); position = start_position; ParsingResults[reskey] = new Tuple(doStmt, success, position);return doStmt; } doStmt.Body = ParseChunk(out success); if (!success) { Error("Failed to parse Body of DoStmt."); position = start_position; ParsingResults[reskey] = new Tuple(doStmt, success, position);return doStmt; } MatchTerminalString("end", out success); if (!success) { Error("Failed to parse 'end' of DoStmt."); position = start_position; ParsingResults[reskey] = new Tuple(doStmt, success, position);return doStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of DoStmt."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(doStmt, success, position); return doStmt; } private IfStmt ParseIfStmt(out bool success) { var reskey = new Tuple(position, "IfStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as IfStmt; } int errorCount = Errors.Count; IfStmt ifStmt = new IfStmt(); int start_position = position; MatchTerminalString("if", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(ifStmt, success, position);return ifStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of IfStmt."); position = start_position; ParsingResults[reskey] = new Tuple(ifStmt, success, position);return ifStmt; } ifStmt.Condition = ParseExpr(out success); if (!success) { Error("Failed to parse Condition of IfStmt."); position = start_position; ParsingResults[reskey] = new Tuple(ifStmt, success, position);return ifStmt; } MatchTerminalString("then", out success); if (!success) { Error("Failed to parse 'then' of IfStmt."); position = start_position; ParsingResults[reskey] = new Tuple(ifStmt, success, position);return ifStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of IfStmt."); position = start_position; ParsingResults[reskey] = new Tuple(ifStmt, success, position);return ifStmt; } ifStmt.ThenBlock = ParseChunk(out success); if (!success) { Error("Failed to parse ThenBlock of IfStmt."); position = start_position; ParsingResults[reskey] = new Tuple(ifStmt, success, position);return ifStmt; } while (true) { ElseifBlock elseifBlock = ParseElseifBlock(out success); if (success) { ifStmt.ElseifBlocks.Add(elseifBlock); } else { break; } } success = true; while (true) { int seq_start_position1 = position; MatchTerminalString("else", out success); if (!success) { break; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of IfStmt."); position = seq_start_position1; break; } ifStmt.ElseBlock = ParseChunk(out success); if (!success) { Error("Failed to parse ElseBlock of IfStmt."); position = seq_start_position1; } break; } success = true; MatchTerminalString("end", out success); if (!success) { Error("Failed to parse 'end' of IfStmt."); position = start_position; ParsingResults[reskey] = new Tuple(ifStmt, success, position);return ifStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of IfStmt."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(ifStmt, success, position); return ifStmt; } private ElseifBlock ParseElseifBlock(out bool success) { var reskey = new Tuple(position, "ElseifBlock"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as ElseifBlock; } int errorCount = Errors.Count; ElseifBlock elseifBlock = new ElseifBlock(); int start_position = position; MatchTerminalString("elseif", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(elseifBlock, success, position);return elseifBlock; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ElseifBlock."); position = start_position; ParsingResults[reskey] = new Tuple(elseifBlock, success, position);return elseifBlock; } elseifBlock.Condition = ParseExpr(out success); if (!success) { Error("Failed to parse Condition of ElseifBlock."); position = start_position; ParsingResults[reskey] = new Tuple(elseifBlock, success, position);return elseifBlock; } MatchTerminalString("then", out success); if (!success) { Error("Failed to parse 'then' of ElseifBlock."); position = start_position; ParsingResults[reskey] = new Tuple(elseifBlock, success, position);return elseifBlock; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ElseifBlock."); position = start_position; ParsingResults[reskey] = new Tuple(elseifBlock, success, position);return elseifBlock; } elseifBlock.ThenBlock = ParseChunk(out success); if (!success) { Error("Failed to parse ThenBlock of ElseifBlock."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(elseifBlock, success, position); return elseifBlock; } private ForStmt ParseForStmt(out bool success) { var reskey = new Tuple(position, "ForStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as ForStmt; } int errorCount = Errors.Count; ForStmt forStmt = new ForStmt(); int start_position = position; MatchTerminalString("for", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } forStmt.VarName = ParseName(out success); if (!success) { Error("Failed to parse VarName of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } ParseSpOpt(out success); MatchTerminal('=', out success); if (!success) { Error("Failed to parse '=' of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } ParseSpOpt(out success); forStmt.Start = ParseExpr(out success); if (!success) { Error("Failed to parse Start of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } MatchTerminal(',', out success); if (!success) { Error("Failed to parse ',' of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } ParseSpOpt(out success); forStmt.End = ParseExpr(out success); if (!success) { Error("Failed to parse End of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } while (true) { int seq_start_position1 = position; MatchTerminal(',', out success); if (!success) { break; } ParseSpOpt(out success); forStmt.Step = ParseExpr(out success); if (!success) { Error("Failed to parse Step of ForStmt."); position = seq_start_position1; } break; } success = true; MatchTerminalString("do", out success); if (!success) { Error("Failed to parse 'do' of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } forStmt.Body = ParseChunk(out success); if (!success) { Error("Failed to parse Body of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } MatchTerminalString("end", out success); if (!success) { Error("Failed to parse 'end' of ForStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forStmt, success, position);return forStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForStmt."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(forStmt, success, position); return forStmt; } private ForInStmt ParseForInStmt(out bool success) { var reskey = new Tuple(position, "ForInStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as ForInStmt; } int errorCount = Errors.Count; ForInStmt forInStmt = new ForInStmt(); int start_position = position; MatchTerminalString("for", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } forInStmt.NameList = ParseNameList(out success); if (!success) { Error("Failed to parse NameList of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } MatchTerminalString("in", out success); if (!success) { Error("Failed to parse 'in' of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } forInStmt.ExprList = ParseExprList(out success); if (!success) { Error("Failed to parse ExprList of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } MatchTerminalString("do", out success); if (!success) { Error("Failed to parse 'do' of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } forInStmt.Body = ParseChunk(out success); if (!success) { Error("Failed to parse Body of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } MatchTerminalString("end", out success); if (!success) { Error("Failed to parse 'end' of ForInStmt."); position = start_position; ParsingResults[reskey] = new Tuple(forInStmt, success, position);return forInStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of ForInStmt."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(forInStmt, success, position); return forInStmt; } private WhileStmt ParseWhileStmt(out bool success) { var reskey = new Tuple(position, "WhileStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as WhileStmt; } int errorCount = Errors.Count; WhileStmt whileStmt = new WhileStmt(); int start_position = position; MatchTerminalString("while", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(whileStmt, success, position);return whileStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of WhileStmt."); position = start_position; ParsingResults[reskey] = new Tuple(whileStmt, success, position);return whileStmt; } whileStmt.Condition = ParseExpr(out success); if (!success) { Error("Failed to parse Condition of WhileStmt."); position = start_position; ParsingResults[reskey] = new Tuple(whileStmt, success, position);return whileStmt; } MatchTerminalString("do", out success); if (!success) { Error("Failed to parse 'do' of WhileStmt."); position = start_position; ParsingResults[reskey] = new Tuple(whileStmt, success, position);return whileStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of WhileStmt."); position = start_position; ParsingResults[reskey] = new Tuple(whileStmt, success, position);return whileStmt; } whileStmt.Body = ParseChunk(out success); if (!success) { Error("Failed to parse Body of WhileStmt."); position = start_position; ParsingResults[reskey] = new Tuple(whileStmt, success, position);return whileStmt; } MatchTerminalString("end", out success); if (!success) { Error("Failed to parse 'end' of WhileStmt."); position = start_position; ParsingResults[reskey] = new Tuple(whileStmt, success, position);return whileStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of WhileStmt."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(whileStmt, success, position); return whileStmt; } private RepeatStmt ParseRepeatStmt(out bool success) { var reskey = new Tuple(position, "RepeatStmt"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as RepeatStmt; } int errorCount = Errors.Count; RepeatStmt repeatStmt = new RepeatStmt(); int start_position = position; MatchTerminalString("repeat", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(repeatStmt, success, position);return repeatStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of RepeatStmt."); position = start_position; ParsingResults[reskey] = new Tuple(repeatStmt, success, position);return repeatStmt; } repeatStmt.Body = ParseChunk(out success); if (!success) { Error("Failed to parse Body of RepeatStmt."); position = start_position; ParsingResults[reskey] = new Tuple(repeatStmt, success, position);return repeatStmt; } MatchTerminalString("until", out success); if (!success) { Error("Failed to parse 'until' of RepeatStmt."); position = start_position; ParsingResults[reskey] = new Tuple(repeatStmt, success, position);return repeatStmt; } ParseSpReq(out success); if (!success) { Error("Failed to parse SpReq of RepeatStmt."); position = start_position; ParsingResults[reskey] = new Tuple(repeatStmt, success, position);return repeatStmt; } repeatStmt.Condition = ParseExpr(out success); if (!success) { Error("Failed to parse Condition of RepeatStmt."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(repeatStmt, success, position); return repeatStmt; } private List ParseVarList(out bool success) { var reskey = new Tuple(position, "VarList"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as List; } int errorCount = Errors.Count; List list_Var = new List(); int start_position = position; Var var = ParseVar(out success); if (success) { list_Var.Add(var); } else { position = start_position; ParsingResults[reskey] = new Tuple(list_Var, success, position);return list_Var; } while (true) { while (true) { int seq_start_position1 = position; ParseSpOpt(out success); MatchTerminal(',', out success); if (!success) { Error("Failed to parse ',' of VarList."); position = seq_start_position1; break; } ParseSpOpt(out success); var = ParseVar(out success); if (success) { list_Var.Add(var); } else { Error("Failed to parse Var of VarList."); position = seq_start_position1; } break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(list_Var, success, position); return list_Var; } private List ParseExprList(out bool success) { var reskey = new Tuple(position, "ExprList"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as List; } int errorCount = Errors.Count; List list_Expr = new List(); int start_position = position; Expr expr = ParseExpr(out success); if (success) { list_Expr.Add(expr); } else { position = start_position; ParsingResults[reskey] = new Tuple(list_Expr, success, position); return list_Expr; } while (true) { while (true) { int seq_start_position1 = position; ParseSpOpt(out success); MatchTerminal(',', out success); if (!success) { Error("Failed to parse ',' of ExprList."); position = seq_start_position1; break; } ParseSpOpt(out success); expr = ParseExpr(out success); if (success) { list_Expr.Add(expr); } else { Error("Failed to parse Expr of ExprList."); position = seq_start_position1; } break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(list_Expr, success, position); return list_Expr; } private Expr ParseExpr(out bool success) { var reskey = new Tuple(position, "Expr"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Expr; } int errorCount = Errors.Count; Expr expr = null; expr = ParseOperatorExpr(out success); if (success) { return expr.Simplify(); } expr = ParseTerm(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(expr, success, position);return expr; } return expr; } private Term ParseTerm(out bool success) { var reskey = new Tuple(position, "Term"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Term; } int errorCount = Errors.Count; Term term = null; term = ParseNilLiteral(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } term = ParseBoolLiteral(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } term = ParseNumberLiteral(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } term = ParseStringLiteral(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } term = ParseFunctionValue(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } term = ParseTableConstructor(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } term = ParseVariableArg(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } term = ParsePrimaryExpr(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(term, success, position);return term; } return term; } private NilLiteral ParseNilLiteral(out bool success) { var reskey = new Tuple(position, "NilLiteral"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as NilLiteral; } int errorCount = Errors.Count; NilLiteral nilLiteral = new NilLiteral(); MatchTerminalString("nil", out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse 'nil' of NilLiteral."); } ParsingResults[reskey] = new Tuple(nilLiteral, success, position); return nilLiteral; } private BoolLiteral ParseBoolLiteral(out bool success) { var reskey = new Tuple(position, "BoolLiteral"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as BoolLiteral; } int errorCount = Errors.Count; ErrorStack.Push(errorCount); errorCount = Errors.Count; BoolLiteral boolLiteral = new BoolLiteral(); while (true) { boolLiteral.Text = MatchTerminalString("true", out success); if (success) { ClearError(errorCount); break; } boolLiteral.Text = MatchTerminalString("false", out success); if (success) { ClearError(errorCount); break; } break; } errorCount = ErrorStack.Pop(); if (success) { ClearError(errorCount); } else { Error("Failed to parse Text of BoolLiteral."); } ParsingResults[reskey] = new Tuple(boolLiteral, success, position); return boolLiteral; } private NumberLiteral ParseNumberLiteral(out bool success) { var reskey = new Tuple(position, "NumberLiteral"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as NumberLiteral; } int errorCount = Errors.Count; NumberLiteral numberLiteral = new NumberLiteral(); numberLiteral.HexicalText = ParseHexicalNumber(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(numberLiteral, success, position);return numberLiteral; } numberLiteral.Text = ParseFloatNumber(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(numberLiteral, success, position);return numberLiteral; } return numberLiteral; } private StringLiteral ParseStringLiteral(out bool success) { var reskey = new Tuple(position, "StringLiteral"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as StringLiteral; } int errorCount = Errors.Count; StringLiteral stringLiteral = new StringLiteral(); while (true) { int seq_start_position1 = position; MatchTerminal('"', out success); if (!success) { break; } stringLiteral.Text = ParseDoubleQuotedText(out success); MatchTerminal('"', out success); if (!success) { Error("Failed to parse '\\\"' of StringLiteral."); position = seq_start_position1; } break; } if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(stringLiteral, success, position);return stringLiteral; } while (true) { int seq_start_position2 = position; MatchTerminal('\'', out success); if (!success) { break; } stringLiteral.Text = ParseSingleQuotedText(out success); MatchTerminal('\'', out success); if (!success) { Error("Failed to parse ''' of StringLiteral."); position = seq_start_position2; } break; } if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(stringLiteral, success, position);return stringLiteral; } stringLiteral.Text = ParseLongString(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(stringLiteral, success, position);return stringLiteral; } return stringLiteral; } private VariableArg ParseVariableArg(out bool success) { var reskey = new Tuple(position, "VariableArg"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as VariableArg; } int errorCount = Errors.Count; VariableArg variableArg = new VariableArg(); variableArg.Name = MatchTerminalString("...", out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse Name of VariableArg."); } ParsingResults[reskey] = new Tuple(variableArg, success, position); return variableArg; } private FunctionValue ParseFunctionValue(out bool success) { var reskey = new Tuple(position, "FunctionValue"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as FunctionValue; } int errorCount = Errors.Count; FunctionValue functionValue = new FunctionValue(); int start_position = position; MatchTerminalString("function", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(functionValue, success, position);return functionValue; } ParseSpOpt(out success); functionValue.Body = ParseFunctionBody(out success); if (!success) { Error("Failed to parse Body of FunctionValue."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(functionValue, success, position); return functionValue; } private FunctionBody ParseFunctionBody(out bool success) { var reskey = new Tuple(position, "FunctionBody"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as FunctionBody; } int errorCount = Errors.Count; FunctionBody functionBody = new FunctionBody(); int start_position = position; MatchTerminal('(', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(functionBody, success, position);return functionBody; } ParseSpOpt(out success); while (true) { int seq_start_position1 = position; functionBody.ParamList = ParseParamList(out success); if (!success) { break; } ParseSpOpt(out success); break; } success = true; MatchTerminal(')', out success); if (!success) { Error("Failed to parse ')' of FunctionBody."); position = start_position; ParsingResults[reskey] = new Tuple(functionBody, success, position);return functionBody; } functionBody.Chunk = ParseChunk(out success); if (!success) { Error("Failed to parse Chunk of FunctionBody."); position = start_position; ParsingResults[reskey] = new Tuple(functionBody, success, position);return functionBody; } MatchTerminalString("end", out success); if (!success) { Error("Failed to parse 'end' of FunctionBody."); position = start_position; ParsingResults[reskey] = new Tuple(functionBody, success, position);return functionBody; } ParseSpOpt(out success); /* if (!success) { Error("Failed to parse SpOpt of FunctionBody."); position = start_position; } */ if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(functionBody, success, position); return functionBody; } private Access ParseAccess(out bool success) { var reskey = new Tuple(position, "Access"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Access; } int errorCount = Errors.Count; Access access = null; access = ParseNameAccess(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(access, success, position);return access; } access = ParseKeyAccess(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(access, success, position);return access; } access = ParseMethodCall(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(access, success, position);return access; } access = ParseFunctionCall(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(access, success, position);return access; } return access; } private BaseExpr ParseBaseExpr(out bool success) { var reskey = new Tuple(position, "BaseExpr"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as BaseExpr; } int errorCount = Errors.Count; BaseExpr baseExpr = null; baseExpr = ParseGroupExpr(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(baseExpr, success, position);return baseExpr; } baseExpr = ParseVarName(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(baseExpr, success, position);return baseExpr; } return baseExpr; } private KeyAccess ParseKeyAccess(out bool success) { var reskey = new Tuple(position, "KeyAccess"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as KeyAccess; } int errorCount = Errors.Count; KeyAccess keyAccess = new KeyAccess(); int start_position = position; MatchTerminal('[', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(keyAccess, success, position);return keyAccess; } ParseSpOpt(out success); keyAccess.Key = ParseExpr(out success); if (!success) { Error("Failed to parse Key of KeyAccess."); position = start_position; ParsingResults[reskey] = new Tuple(keyAccess, success, position);return keyAccess; } MatchTerminal(']', out success); if (!success) { Error("Failed to parse ']' of KeyAccess."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(keyAccess, success, position); return keyAccess; } private NameAccess ParseNameAccess(out bool success) { var reskey = new Tuple(position, "NameAccess"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as NameAccess; } int errorCount = Errors.Count; NameAccess nameAccess = new NameAccess(); int start_position = position; MatchTerminal('.', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(nameAccess, success, position);return nameAccess; } ParseSpOpt(out success); nameAccess.Name = ParseName(out success); if (!success) { Error("Failed to parse Name of NameAccess."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(nameAccess, success, position); return nameAccess; } private MethodCall ParseMethodCall(out bool success) { var reskey = new Tuple(position, "MethodCall"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as MethodCall; } int errorCount = Errors.Count; MethodCall methodCall = new MethodCall(); int start_position = position; MatchTerminal(':', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(methodCall, success, position);return methodCall; } ParseSpOpt(out success); methodCall.Method = ParseName(out success); if (!success) { Error("Failed to parse Method of MethodCall."); position = start_position; ParsingResults[reskey] = new Tuple(methodCall, success, position);return methodCall; } ParseSpOpt(out success); methodCall.Args = ParseArgs(out success); if (!success) { Error("Failed to parse Args of MethodCall."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(methodCall, success, position); return methodCall; } private FunctionCall ParseFunctionCall(out bool success) { var reskey = new Tuple(position, "FunctionCall"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as FunctionCall; } int errorCount = Errors.Count; FunctionCall functionCall = new FunctionCall(); functionCall.Args = ParseArgs(out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse Args of FunctionCall."); } ParsingResults[reskey] = new Tuple(functionCall, success, position); return functionCall; } private Var ParseVar(out bool success) { var reskey = new Tuple(position, "Var"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Var; } int errorCount = Errors.Count; Var var = new Var(); int start_position = position; var.Base = ParseBaseExpr(out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(var, success, position);return var; } while (true) { ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { while (true) { int seq_start_position1 = position; ParseSpOpt(out success); NameAccess nameAccess = ParseNameAccess(out success); if (success) { var.Accesses.Add(nameAccess); } else { Error("Failed to parse NameAccess of Var."); position = seq_start_position1; } break; } if (success) { ClearError(errorCount); break; } while (true) { int seq_start_position2 = position; ParseSpOpt(out success); KeyAccess keyAccess = ParseKeyAccess(out success); if (success) { var.Accesses.Add(keyAccess); } else { Error("Failed to parse KeyAccess of Var."); position = seq_start_position2; } break; } if (success) { ClearError(errorCount); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(var, success, position); return var; } private PrimaryExpr ParsePrimaryExpr(out bool success) { var reskey = new Tuple(position, "PrimaryExpr"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as PrimaryExpr; } int errorCount = Errors.Count; PrimaryExpr primaryExpr = new PrimaryExpr(); int start_position = position; primaryExpr.Base = ParseBaseExpr(out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(primaryExpr, success, position);return primaryExpr; } while (true) { while (true) { int seq_start_position1 = position; ParseSpOpt(out success); Access access = ParseAccess(out success); if (success) { primaryExpr.Accesses.Add(access); } else { Error("Failed to parse Access of PrimaryExpr."); position = seq_start_position1; } break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(primaryExpr, success, position); return primaryExpr; } private VarName ParseVarName(out bool success) { var reskey = new Tuple(position, "VarName"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as VarName; } int errorCount = Errors.Count; VarName varName = new VarName(); varName.Name = ParseName(out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse Name of VarName."); } ParsingResults[reskey] = new Tuple(varName, success, position); return varName; } private FunctionName ParseFunctionName(out bool success) { var reskey = new Tuple(position, "FunctionName"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as FunctionName; } int errorCount = Errors.Count; FunctionName functionName = new FunctionName(); int start_position = position; functionName.FullName = ParseFullName(out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(functionName, success, position);return functionName; } while (true) { int seq_start_position1 = position; ParseSpOpt(out success); MatchTerminal(':', out success); if (!success) { Error("Failed to parse ':' of FunctionName."); position = seq_start_position1; break; } ParseSpOpt(out success); functionName.MethodName = ParseName(out success); if (!success) { Error("Failed to parse MethodName of FunctionName."); position = seq_start_position1; } break; } success = true; ParsingResults[reskey] = new Tuple(functionName, success, position); return functionName; } private GroupExpr ParseGroupExpr(out bool success) { var reskey = new Tuple(position, "GroupExpr"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as GroupExpr; } int errorCount = Errors.Count; GroupExpr groupExpr = new GroupExpr(); int start_position = position; MatchTerminal('(', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(groupExpr, success, position);return groupExpr; } ParseSpOpt(out success); groupExpr.Expr = ParseExpr(out success); if (!success) { Error("Failed to parse Expr of GroupExpr."); position = start_position; ParsingResults[reskey] = new Tuple(groupExpr, success, position);return groupExpr; } MatchTerminal(')', out success); if (!success) { Error("Failed to parse ')' of GroupExpr."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(groupExpr, success, position); return groupExpr; } private TableConstructor ParseTableConstructor(out bool success) { var reskey = new Tuple(position, "TableConstructor"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as TableConstructor; } int errorCount = Errors.Count; TableConstructor tableConstructor = new TableConstructor(); int start_position = position; MatchTerminal('{', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(tableConstructor, success, position);return tableConstructor; } ParseSpOpt(out success); tableConstructor.FieldList = ParseFieldList(out success); success = true; MatchTerminal('}', out success); if (!success) { Error("Failed to parse '}' of TableConstructor."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(tableConstructor, success, position); return tableConstructor; } private List ParseFieldList(out bool success) { var reskey = new Tuple(position, "FieldList"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as List; } int errorCount = Errors.Count; List list_Field = new List(); int start_position = position; Field field = ParseField(out success); if (success) { list_Field.Add(field); } else { position = start_position; ParsingResults[reskey] = new Tuple(list_Field, success, position);return list_Field; } while (true) { while (true) { int seq_start_position1 = position; ParseFieldSep(out success); if (!success) { break; } ParseSpOpt(out success); field = ParseField(out success); if (success) { list_Field.Add(field); } else { Error("Failed to parse Field of FieldList."); position = seq_start_position1; } break; } if (!success) { break; } } success = true; while (true) { int seq_start_position2 = position; ParseFieldSep(out success); if (!success) { break; } ParseSpOpt(out success); break; } success = true; ParsingResults[reskey] = new Tuple(list_Field, success, position); return list_Field; } private Field ParseField(out bool success) { var reskey = new Tuple(position, "Field"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Field; } int errorCount = Errors.Count; Field field = null; field = ParseKeyValue(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(field, success, position);return field; } field = ParseNameValue(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(field, success, position);return field; } field = ParseItemValue(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(field, success, position);return field; } return field; } private KeyValue ParseKeyValue(out bool success) { var reskey = new Tuple(position, "KeyValue"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as KeyValue; } int errorCount = Errors.Count; KeyValue keyValue = new KeyValue(); int start_position = position; MatchTerminal('[', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(keyValue, success, position);return keyValue; } ParseSpOpt(out success); keyValue.Key = ParseExpr(out success); if (!success) { Error("Failed to parse Key of KeyValue."); position = start_position; ParsingResults[reskey] = new Tuple(keyValue, success, position);return keyValue; } MatchTerminal(']', out success); if (!success) { Error("Failed to parse ']' of KeyValue."); position = start_position; ParsingResults[reskey] = new Tuple(keyValue, success, position);return keyValue; } ParseSpOpt(out success); MatchTerminal('=', out success); if (!success) { Error("Failed to parse '=' of KeyValue."); position = start_position; ParsingResults[reskey] = new Tuple(keyValue, success, position);return keyValue; } ParseSpOpt(out success); keyValue.Value = ParseExpr(out success); if (!success) { Error("Failed to parse Value of KeyValue."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(keyValue, success, position); return keyValue; } private NameValue ParseNameValue(out bool success) { var reskey = new Tuple(position, "NameValue"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as NameValue; } int errorCount = Errors.Count; NameValue nameValue = new NameValue(); int start_position = position; nameValue.Name = ParseName(out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(nameValue, success, position);return nameValue; } ParseSpOpt(out success); MatchTerminal('=', out success); if (!success) { Error("Failed to parse '=' of NameValue."); position = start_position; ParsingResults[reskey] = new Tuple(nameValue, success, position);return nameValue; } ParseSpOpt(out success); nameValue.Value = ParseExpr(out success); if (!success) { Error("Failed to parse Value of NameValue."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(nameValue, success, position); return nameValue; } private ItemValue ParseItemValue(out bool success) { var reskey = new Tuple(position, "ItemValue"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as ItemValue; } int errorCount = Errors.Count; ItemValue itemValue = new ItemValue(); itemValue.Value = ParseExpr(out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse Value of ItemValue."); } ParsingResults[reskey] = new Tuple(itemValue, success, position); return itemValue; } private OperatorExpr ParseOperatorExpr(out bool success) { var reskey = new Tuple(position, "OperatorExpr"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as OperatorExpr; } int errorCount = Errors.Count; OperatorExpr operatorExpr = new OperatorExpr(); int start_position = position; while (true) { int seq_start_position1 = position; string unaryOper = ParseUnaryOperator(out success); if (success) { operatorExpr.Add(unaryOper); } else { break; } ParseSpOpt(out success); break; } success = true; Term firstTerm = ParseTerm(out success); if (success) { operatorExpr.Add(firstTerm); } else { Error("Failed to parse firstTerm of OperatorExpr."); position = start_position; ParsingResults[reskey] = new Tuple(operatorExpr, success, position);return operatorExpr; } ParseSpOpt(out success); while (true) { while (true) { int seq_start_position2 = position; string binaryOper = ParseBinaryOperator(out success); if (success) { operatorExpr.Add(binaryOper); } else { break; } ParseSpOpt(out success); Term nextTerm = ParseTerm(out success); if (success) { operatorExpr.Add(nextTerm); } else { Error("Failed to parse nextTerm of OperatorExpr."); position = seq_start_position2; break; } ParseSpOpt(out success); break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(operatorExpr, success, position); return operatorExpr; } private Args ParseArgs(out bool success) { var reskey = new Tuple(position, "Args"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Args; } int errorCount = Errors.Count; Args args = new Args(); args.ArgList = ParseArgList(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(args, success, position);return args; } args.String = ParseStringLiteral(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(args, success, position);return args; } args.Table = ParseTableConstructor(out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(args, success, position);return args; } return args; } private List ParseArgList(out bool success) { var reskey = new Tuple(position, "ArgList"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as List; } int errorCount = Errors.Count; List list_Expr = new List(); int start_position = position; MatchTerminal('(', out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(list_Expr, success, position);return list_Expr; } ParseSpOpt(out success); while (true) { int seq_start_position1 = position; list_Expr = ParseExprList(out success); if (!success) { break; } ParseSpOpt(out success); break; } success = true; MatchTerminal(')', out success); if (!success) { Error("Failed to parse ')' of ArgList."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(list_Expr, success, position); return list_Expr; } private ParamList ParseParamList(out bool success) { var reskey = new Tuple(position, "ParamList"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as ParamList; } int errorCount = Errors.Count; ParamList paramList = new ParamList(); while (true) { int seq_start_position1 = position; paramList.NameList = ParseNameList(out success); if (!success) { break; } while (true) { int seq_start_position2 = position; MatchTerminal(',', out success); if (!success) { break; } ParseSpOpt(out success); MatchTerminalString("...", out success); if (!success) { Error("Failed to parse '...' of ParamList."); position = seq_start_position2; } break; } paramList.HasVarArg = success; success = true; break; } if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(paramList, success, position);return paramList; } paramList.IsVarArg = MatchTerminalString("...", out success); if (success) { ClearError(errorCount); ParsingResults[reskey] = new Tuple(paramList, success, position);return paramList; } return paramList; } private List ParseFullName(out bool success) { var reskey = new Tuple(position, "FullName"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as List; } int errorCount = Errors.Count; List list_string = new List(); int start_position = position; string str = ParseName(out success); if (success) { list_string.Add(str); } else { position = start_position; ParsingResults[reskey] = new Tuple(list_string, success, position);return list_string; } while (true) { while (true) { int seq_start_position1 = position; ParseSpOpt(out success); MatchTerminal('.', out success); if (!success) { Error("Failed to parse '.' of FullName."); position = seq_start_position1; break; } ParseSpOpt(out success); str = ParseName(out success); if (success) { list_string.Add(str); } else { Error("Failed to parse Name of FullName."); position = seq_start_position1; } break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(list_string, success, position); return list_string; } private List ParseNameList(out bool success) { var reskey = new Tuple(position, "NameList"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as List; } int errorCount = Errors.Count; List list_string = new List(); int start_position = position; string str = ParseName(out success); if (success) { list_string.Add(str); } else { position = start_position; ParsingResults[reskey] = new Tuple(list_string, success, position);return list_string; } while (true) { while (true) { int seq_start_position1 = position; ParseSpOpt(out success); MatchTerminal(',', out success); if (!success) { Error("Failed to parse ',' of NameList."); position = seq_start_position1; break; } ParseSpOpt(out success); str = ParseName(out success); if (success) { list_string.Add(str); } else { Error("Failed to parse Name of NameList."); position = seq_start_position1; } break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(list_string, success, position); return list_string; } private string ParseName(out bool success) { var reskey = new Tuple(position, "Name"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); int start_position = position; int not_start_position1 = position; while (true) { ParseKeyword(out success); if (!success) { break; } ParseSpReq(out success); break; } position = not_start_position1; success = !success; if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } char ch = ParseLetter(out success); if (success) { text.Append(ch); } else { Error("Failed to parse Letter of Name."); position = start_position; ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } while (true) { ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { ch = ParseLetter(out success); if (success) { ClearError(errorCount); text.Append(ch); break; } ch = ParseDigit(out success); if (success) { ClearError(errorCount); text.Append(ch); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(text.ToString(), success, position); return text.ToString(); } private string ParseFloatNumber(out bool success) { var reskey = new Tuple(position, "FloatNumber"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); int start_position = position; int counter = 0; while (true) { char ch = ParseDigit(out success); if (success) { text.Append(ch); } else { break; } counter++; } if (counter > 0) { success = true; } if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } while (true) { int seq_start_position1 = position; char ch = MatchTerminal('.', out success); if (success) { text.Append(ch); } else { break; } counter = 0; while (true) { ch = ParseDigit(out success); if (success) { text.Append(ch); } else { break; } counter++; } if (counter > 0) { success = true; } if (!success) { Error("Failed to parse (Digit)+ of FloatNumber."); position = seq_start_position1; } break; } success = true; while (true) { ErrorStack.Push(errorCount); errorCount = Errors.Count; int seq_start_position2 = position; while (true) { char ch = MatchTerminal('e', out success); if (success) { ClearError(errorCount); text.Append(ch); break; } ch = MatchTerminal('E', out success); if (success) { ClearError(errorCount); text.Append(ch); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { break; } counter = 0; while (true) { char ch = ParseDigit(out success); if (success) { text.Append(ch); } else { break; } counter++; } if (counter > 0) { success = true; } if (!success) { Error("Failed to parse (Digit)+ of FloatNumber."); position = seq_start_position2; } break; } success = true; ParsingResults[reskey] = new Tuple(text.ToString(), success, position); return text.ToString(); } private string ParseHexicalNumber(out bool success) { var reskey = new Tuple(position, "HexicalNumber"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); int start_position = position; MatchTerminalString("0x", out success); if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } int counter = 0; while (true) { char ch = ParseHexDigit(out success); if (success) { text.Append(ch); } else { break; } counter++; } if (counter > 0) { success = true; } if (!success) { Error("Failed to parse (HexDigit)+ of HexicalNumber."); position = start_position; } if (success) { ClearError(errorCount); } ParsingResults[reskey] = new Tuple(text.ToString(), success, position); return text.ToString(); } private string ParseSingleQuotedText(out bool success) { var reskey = new Tuple(position, "SingleQuotedText"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); while (true) { ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { char ch = MatchTerminalSet("'\\", true, out success); if (success) { ClearError(errorCount); text.Append(ch); break; } ch = ParseEscapeChar(out success); if (success) { ClearError(errorCount); text.Append(ch); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(text.ToString(), success, position); return text.ToString(); } private string ParseDoubleQuotedText(out bool success) { var reskey = new Tuple(position, "DoubleQuotedText"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); while (true) { ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { char ch = MatchTerminalSet("\"\\", true, out success); if (success) { ClearError(errorCount); text.Append(ch); break; } ch = ParseEscapeChar(out success); if (success) { ClearError(errorCount); text.Append(ch); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple(text.ToString(), success, position); return text.ToString(); } private string ParseLongString(out bool success) { var reskey = new Tuple(position, "LongString"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); int start_position = position; List opening = new List(); while (true) { int seq_start_position1 = position; char ch = MatchTerminal('[', out success); if (success) { opening.Add(ch); } else { break; } while (true) { ch = MatchTerminal('=', out success); if (success) { opening.Add(ch); } else { break; } } success = true; ch = MatchTerminal('[', out success); if (success) { opening.Add(ch); } else { Error("Failed to parse '[' of LongString."); position = seq_start_position1; } break; } if (!success) { position = start_position; ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ParseEol(out success); string closing = new string(opening.ToArray()).Replace('[', ']'); success = true; while (true) { MatchTerminalString(closing, out success); if (success) break; char ch = MatchTerminalSet("", true, out success); if (success) { text.Append(ch); } else { break; } } success = true; ParsingResults[reskey] = new Tuple(text.ToString(), success, position); return text.ToString(); } private void ParseKeyword(out bool success) { int errorCount = Errors.Count; MatchTerminalString("and", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("break", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("do", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("elseif", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("else", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("end", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("false", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("for", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("function", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("if", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("in", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("local", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("nil", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("not", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("or", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("repeat", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("return", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("then", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("true", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("until", out success); if (success) { ClearError(errorCount); return; } MatchTerminalString("while", out success); if (success) { ClearError(errorCount); return; } } private char ParseDigit(out bool success) { int errorCount = Errors.Count; char ch = MatchTerminalRange('0', '9', out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse '0'...'9' of Digit."); } return ch; } private char ParseHexDigit(out bool success) { int errorCount = Errors.Count; char ch = MatchTerminalSet("0123456789ABCDEFabcdef", false, out success); if (success) { ClearError(errorCount); } else { Error("Failed to parse \"0123456789ABCDEFabcdef\" of HexDigit."); } return ch; } private char ParseLetter(out bool success) { int errorCount = Errors.Count; char ch = default(char); ch = MatchTerminalRange('A', 'Z', out success); if (success) { ClearError(errorCount); return ch; } ch = MatchTerminalRange('a', 'z', out success); if (success) { ClearError(errorCount); return ch; } ch = MatchTerminal('_', out success); if (success) { ClearError(errorCount); return ch; } return ch; } private string ParseUnaryOperator(out bool success) { var reskey = new Tuple(position, "UnaryOperator"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); char ch = MatchTerminal('#', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('-', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } string str = MatchTerminalString("not", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } return text.ToString(); } private string ParseBinaryOperator(out bool success) { var reskey = new Tuple(position, "BinaryOperator"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as string; } int errorCount = Errors.Count; StringBuilder text = new StringBuilder(); char ch = MatchTerminal('+', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('-', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('*', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('/', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('%', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('^', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } string str = MatchTerminalString("..", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } str = MatchTerminalString("==", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } str = MatchTerminalString("~=", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } str = MatchTerminalString("<=", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } str = MatchTerminalString(">=", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('<', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } ch = MatchTerminal('>', out success); if (success) { ClearError(errorCount); text.Append(ch); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } str = MatchTerminalString("and", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } str = MatchTerminalString("or", out success); if (success) { ClearError(errorCount); text.Append(str); ParsingResults[reskey] = new Tuple(text.ToString(), success, position);return text.ToString(); } return text.ToString(); } private void ParseFieldSep(out bool success) { int errorCount = Errors.Count; MatchTerminal(',', out success); if (success) { ClearError(errorCount); return; } MatchTerminal(';', out success); if (success) { ClearError(errorCount); return; } } private void ParseSpReq(out bool success) { int errorCount = Errors.Count; int counter = 0; while (true) { ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { MatchTerminalSet(" \t\r\n", false, out success); if (success) { ClearError(errorCount); break; } ParseComment(out success); if (success) { ClearError(errorCount); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { break; } counter++; } if (counter > 0) { success = true; } if (success) { ClearError(errorCount); return; } while (true) { int seq_start_position1 = position; ParseSpOpt(out success); ParseEof(out success); if (!success) { Error("Failed to parse Eof of SpReq."); position = seq_start_position1; } break; } if (success) { ClearError(errorCount); return; } } private void ParseSpOpt(out bool success) { int errorCount = Errors.Count; while (true) { ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { MatchTerminalSet(" \t\r\n", false, out success); if (success) { ClearError(errorCount); break; } ParseComment(out success); if (success) { ClearError(errorCount); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { break; } } success = true; } private void ParseComment(out bool success) { int errorCount = Errors.Count; int start_position = position; MatchTerminalString("--", out success); if (!success) { position = start_position; return; } ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { ParseLongString(out success); if (success) { ClearError(errorCount); break; } while (true) { int seq_start_position1 = position; while (true) { MatchTerminalSet("\r\n", true, out success); if (!success) { break; } } success = true; ErrorStack.Push(errorCount); errorCount = Errors.Count; while (true) { ParseEol(out success); if (success) { ClearError(errorCount); break; } ParseEof(out success); if (success) { ClearError(errorCount); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { Error("Failed to parse (Eol / Eof) of Comment."); position = seq_start_position1; } break; } if (success) { ClearError(errorCount); break; } break; } errorCount = ErrorStack.Pop(); if (!success) { Error("Failed to parse (LongString / (-\"\r\n\")* (Eol / Eof)) of Comment."); position = start_position; } if (success) { ClearError(errorCount); } } private void ParseEol(out bool success) { int errorCount = Errors.Count; MatchTerminalString("\r\n", out success); if (success) { ClearError(errorCount); return; } MatchTerminal('\n', out success); if (success) { ClearError(errorCount); return; } MatchTerminal('\r', out success); if (success) { ClearError(errorCount); return; } } private void ParseEof(out bool success) { int errorCount = Errors.Count; success = !Input.HasInput(position); if (success) { ClearError(errorCount); } else { Error("Failed to parse end of Eof."); } } private char ParseEscapeChar(out bool success) { int errorCount = Errors.Count; char ch = default(char); MatchTerminalString("\\\\", out success); if (success) { return '\\'; } MatchTerminalString("\\'", out success); if (success) { return '\''; } MatchTerminalString("\\\"", out success); if (success) { return '\"'; } MatchTerminalString("\\r", out success); if (success) { return '\r'; } MatchTerminalString("\\n", out success); if (success) { return '\n'; } MatchTerminalString("\\t", out success); if (success) { return '\t'; } MatchTerminalString("\\v", out success); if (success) { return '\v'; } MatchTerminalString("\\a", out success); if (success) { return '\a'; } MatchTerminalString("\\b", out success); if (success) { return '\b'; } MatchTerminalString("\\f", out success); if (success) { return '\f'; } MatchTerminalString("\\0", out success); if (success) { return '\0'; } return ch; } } }