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> /// Get the array of expected symbols on the given symbol current parser state. /// </summary> /// <param name="parser">The parser</param> /// <param name="curToken">The Symbol</param> /// <returns>The array of expected symbols</returns> private static List <string> ExpectedSymbols(lr_parser parser, Symbol curToken) { var actionTab = parser.action_table(); int state = ((TypeCobolProgramParser)parser).getParserState(); short[] row = actionTab[state]; List <string> expected = new List <string>(); for (int probe = 0; probe < row.Length; probe++) { int tag = row[probe++]; if (tag != -1 && tag != parser.error_sym()) {//symbol tag different of the default symbol. string name = CodeElementTokenizer.CupTokenToString(tag); if (name != null) { expected.Add(name); } } } return(expected); }