public bool SyntaxError(lr_parser parser, Symbol curToken) { TypeCobolProgramParser tcpParser = parser as TypeCobolProgramParser; if (tcpParser.IsTrial) { return(true); } List <string> expected = ExpectedSymbols(parser, curToken); string symName = CodeElementTokenizer.CupTokenToString(curToken.sym); Symbol validSymbol = GetParserValidStackSymbol(parser, curToken); string text = validSymbol != null ? (validSymbol.value as CodeElement).Text : ""; string msg = string.Format("extraneous input '{0}' expecting {{{1}}}", text, string.Join(", ", expected)); System.Diagnostics.Debug.WriteLine(msg); CupParserDiagnostic diagnostic = new CupParserDiagnostic(msg, validSymbol, null); AddDiagnostic(diagnostic); //Try to add the last encountered statement in the stack if it is not already entered. StackList <Symbol> stack = tcpParser.getParserStack(); foreach (var symbol in stack) { if (symbol.value is StatementElement) { lr_parser stmtParser = CloneParser(parser, TypeCobolProgramSymbols.StatementEntryPoint, symbol.value as CodeElement, true); stmtParser.parse(); break; } } return(true); }
/// <summary> /// Create a new parser using a clone. /// </summary> /// <param name="parser">The parser to be cloned</param> /// <param name="start">The start entry point to use</param> /// <param name="firstSymbol">The First Symbol</param> /// <param name="trial">If we are creating atrial parser, fals eo therwise</param> /// <returns>The new parser</returns> public lr_parser CloneParser(lr_parser parser, int start, CodeElement firstSymbol, bool trial) { TypeCobolProgramParser tcpParser = parser as TypeCobolProgramParser; ProgramClassBuilder builder = tcpParser.Builder as ProgramClassBuilder; var errorReporter = tcpParser.ErrorReporter; var tokenizer = parser.getScanner() as CodeElementTokenizer; CodeElementTokenizer newTokenizer = new CodeElementTokenizer(start, firstSymbol); TypeCobolProgramParser newParser = new TypeCobolProgramParser(newTokenizer); newParser.Builder = builder; newParser.ErrorReporter = errorReporter; newParser.IsTrial = trial; return(newParser); }