private bool csvTxt_sempred(CsvTxtContext _localctx, int predIndex) { switch (predIndex) { case 0: return(IgnoreSpace); } return(true); }
/// <summary> /// 创建CSV的AST树 /// </summary> /// <param name="parseTree">解析树</param> /// <returns>CSV结构</returns> private static CsvTable CreateCsvAST(string filePath, CsvParser.CsvTabContext parseTree) { var table = new CsvTable(); for (int i = 0; i < parseTree._rows.Count; i++) { var row = new CsvRow(); row.isEmpty = false; var emptyCount = 0; var cols = parseTree._rows[i]._cols; for (int j = 0; j < cols.Count + 1; j++) { var col = new CsvCol(); ParserRuleContext colField = null; CsvTxtContext txtField = null; if (j < cols.Count) { colField = cols[j]; txtField = cols[j].content; } else { colField = parseTree._rows[i].end; txtField = colField != null ? parseTree._rows[i].end.content : null; } if (txtField != null && txtField._txt.Count > 0) { IList <IToken> tokens = txtField._txt; StringBuilder sb = new StringBuilder(); foreach (var token in tokens) { sb.Append(token.Text); } col.text = sb.ToString(); col.row = tokens[0].Line; col.col = tokens[0].Column; col.start = tokens[0].StartIndex; col.stop = tokens[tokens.Count - 1].StopIndex; } else { col.text = string.Empty; col.row = colField.Start.Line; col.col = colField.Start.Column; col.start = colField.Start.StartIndex; col.stop = colField.Stop.StartIndex; } row.Add(col); if (string.IsNullOrEmpty(col.text)) { emptyCount++; } } row.isEmpty = emptyCount == row.Count; table.Add(row); } return(table); }
public CsvTxtContext csvTxt() { CsvTxtContext _localctx = new CsvTxtContext(Context, State); EnterRule(_localctx, 8, RULE_csvTxt); int _la; try { State = 56; ErrorHandler.Sync(this); switch (Interpreter.AdaptivePredict(TokenStream, 10, Context)) { case 1: EnterOuterAlt(_localctx, 1); { State = 34; if (!(IgnoreSpace)) { throw new FailedPredicateException(this, "IgnoreSpace"); } State = 36; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la == WS) { { State = 35; Match(WS); } } State = 40; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case STRING: { State = 38; _localctx._STRING = Match(STRING); _localctx._txt.Add(_localctx._STRING); } break; case TEXT: { State = 39; _localctx._TEXT = Match(TEXT); _localctx._txt.Add(_localctx._TEXT); } break; default: throw new NoViableAltException(this); } State = 43; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la == WS) { { State = 42; Match(WS); } } } break; case 2: EnterOuterAlt(_localctx, 2); { State = 46; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la == WS) { { State = 45; _localctx._WS = Match(WS); _localctx._txt.Add(_localctx._WS); } } State = 50; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case STRING: { State = 48; _localctx._STRING = Match(STRING); _localctx._txt.Add(_localctx._STRING); } break; case TEXT: { State = 49; _localctx._TEXT = Match(TEXT); _localctx._txt.Add(_localctx._TEXT); } break; default: throw new NoViableAltException(this); } State = 53; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if (_la == WS) { { State = 52; _localctx._WS = Match(WS); _localctx._txt.Add(_localctx._WS); } } } break; case 3: EnterOuterAlt(_localctx, 3); { State = 55; Match(WS); } break; } } catch (RecognitionException re) { _localctx.exception = re; ErrorHandler.ReportError(this, re); ErrorHandler.Recover(this, re); } finally { ExitRule(); } return(_localctx); }