1

ソースコードを解析するための文法があります:

document
  : header body_block* EOF
    -> body_block*
  ;

header
  : header_statement*
  ;

body_block
  : '{' block_contents '}'
  ;

block_contents
  : declaration_list
  | ... other things ....

ドキュメントが本文のないヘッダーまたはヘッダーのない本文を持つことは合法です。

次のようなドキュメントを解析しようとすると

int i;

次に、ANTLRは、int期待していたときに見つかったと不平を言いEOFます。これは本当ですが、期待していたと言ってもらいたい{です。つまり、入力のヘッダーと EOF の間に ではない何かが含まれている場合、body_blockそのテキストを で囲むことをユーザーに提案したいと思いますbody_block

私はこれについていくつかの試みを行いました

4

1 に答える 1

1

きれいではありませんが、次のようなものがそれを行います:

body_block
 : ('{')=> '{' block_contents '}'
 | t=.
   {
     if(!$t.text.equals("{")) {
       String message = "expected a '{' on line " + $t.getLine() + " near '" + $t.text + "'";
     }
     else {
       String message = "encountered a '{' without a '}' on line " + $t.getLine();
     }
     throw new RuntimeException(message);
   }
 ;

(テストされていないため、構文エラーが含まれている可能性があります! )

'{' ... '}'そのため、が一致しない場合は常に.1になり、よりわかりやすいエラー メッセージが生成されます。



1.パーサー ルールの a は、任意の文字ではなく任意のトークンに一致することに注意してください。

于 2012-07-18T18:54:18.027 に答える