7

antlr を使用してログ ファイルを解析しようとしています。ログの部分的な部分にしか興味がないので、重要な部分を処理する部分的なパーサーだけを書きたいと思います。

例: セグメントを解析したい:

[ 123 begin ]

だから私は文法を書いた:

log :   
    '[' INT 'begin' ']'
    ;


INT : '0'..'9'+
    ;


NEWLINE
    : '\r'? '\n'
    ;

WS
    : (' '|'\t')+ {skip();}
    ;

ただし、セグメントは行の途中に表示される場合があります。例:

 111 [ 123 begin ] 222

議論によると: 単純な ANTLR 文法の何が問題なのですか? 私の文法が上記のステートメントを処理できない理由を知っています。

知りたいのですが、antlr にエラーを無視させ、残りのテキストの処理を続行させる方法はありますか?

アドバイスをありがとう!レオン

4

1 に答える 1

7

'['の外部でスキップされる場合もあるため[ 123 begin ]、レクサーでこれを処理する方法はありません。スキップするトークンに一致するパーサールールを作成する必要があります(ルールを参照noise)。

また、他のレクサールールが一致しない場合は、任意の文字に一致するフォールスルールールを作成する必要があります(ルールを参照ANY)。

簡単なデモ:

grammar T;

parse
    : ( log {System.out.println("log=" + $log.text);}
      | noise
      )*
      EOF
    ;

log : OBRACK INT BEGIN CBRACK
    ;

noise
    : ~OBRACK                  // any token except '['
    | OBRACK ~INT              // a '[' followed by any token except an INT
    | OBRACK INT ~BEGIN        // a '[', an INT and any token except an BEGIN
    | OBRACK INT BEGIN ~CBRACK // a '[', an INT, a BEGIN and any token except ']'
    ;

BEGIN   : 'begin';
OBRACK  : '[';
CBRACK  : ']';
INT     : '0'..'9'+;
NEWLINE : '\r'? '\n';
WS      : (' '|'\t')+ {skip();};
ANY     : .;
于 2012-11-04T18:35:17.333 に答える