6

いくつかの表現を認識するための簡単な文法を書いています。ここでは、説明を簡単にするために書いた、より単純なバージョンを投稿しています。この単純なバージョンでは、次のような式を認識できます。

  1. これはテキストです
  2. [n]これは別のテキストです[/n]
  3. [n][n]これは複合式です[/n][/n]

私の問題は、[i]これは認識例外を生成する必要があります[/n]のような式を送信するときです。

認識例外がスローされますが、パーサーは「[」に一致するため無限再帰に入りますが、「i」に一致しない場合は自分自身を失います。文法のテキスト コンポーネントに角かっこを含めることができないため、それが起こっていると思います。というわけで、文法を掲載します。

grammar ErrorTest;

expression
    :    rawText EOF
    |    command EOF
    ;

rawText
    :    word+
    ;

word
    :    ESPACE* TEXT ESPACE*
    ;

command 
    :    simpleCommand
    |    compoundCommand
    ;

simpleCommand
    :    HELP
    ;

compoundCommand
    :    rawText
    |    BEGIN compoundCommand END
    ;

HELP   : '[help]';

BEGIN  : '[n]';
END    : '[/n]';

ESPACE : ' ';
TEXT   : ~(' '|'['|']')*;

どうすれば解決できますか?

4

2 に答える 2

6

単語は空の文字列と一致します。

word
    :    ESPACE* TEXT ESPACE*
    ;

TEXTは空の文字列と一致します。

rawText
    :    word+
    ;

無限にループします。

変化する

TEXT   : ~(' '|'['|']')*;

TEXT   : ~(' '|'['|']')+;

これにより、文法が非常にあいまいになります。

これについて考える方法は、rawTextが多くの方法で空の文字列と一致する可能性があるということです

  1. ゼロTEXTトークン
  2. 長さ0の1つのTEXTトークン。
  3. 長さが0の2つのTEXTトークン。
  4. 長さが0の3つのTEXTトークン。
  5. ..。

これは、構文エラー([i])がある場合に発生します。これは、これらの選択肢のいずれかがエラーを解決するかどうかを確認するために、これらの選択肢のそれぞれを試行するためです。


二次動作を取り除くには、完全に明確にする必要があります。

rawText : ign (word (ign word)*)? ign;
ign     : ESPACE*;
word    : TEXT;

単純な修正の問題は、rawTextが"foo"いくつかの方法で一致する可能性があることです。

  1. TEXT("foo")
  2. TEXT("fo"), ESPACE(""), TEXT("o")
  3. TEXT("f"), ESPACE(""), TEXT("oo")
  4. TEXT("f"), ESPACE(""), TEXT("o"), ESPACE(""), TEXT("o")
于 2012-04-25T23:28:06.637 に答える
1

このようなことをしてみませんか:

grammar Test;

expression
 : atom+ EOF
 ;

atom
 : TEXT
 | ESPACE
 | command
 ;

command 
 : simpleCommand
 | compoundCommand
 ;

simpleCommand
 : HELP
 ;

compoundCommand
 : BEGIN atom+ END
 ;

HELP   : '[help]';
BEGIN  : '[n]';
END    : '[/n]';
ESPACE : ' ';
TEXT   : ~(' '|'['|']')+;

これは次のように入力をoparseします

this is [n][n]a [help][n]compound[/n] expression[/n][/n]

次の解析ツリーに:

ここに画像の説明を入力してください

(画像をクリックすると拡大します)

于 2012-04-26T07:09:58.650 に答える