コード例 #1
0
ファイル: CsvParser.cs プロジェクト: chwlili/FBSEditor
 private bool csvTxt_sempred(CsvTxtContext _localctx, int predIndex)
 {
     switch (predIndex)
     {
     case 0: return(IgnoreSpace);
     }
     return(true);
 }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
ファイル: CsvParser.cs プロジェクト: chwlili/FBSEditor
    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);
    }