2

Eclipse 環境で ANTLR を使用しています。属性 ( n.text) を別のルール ( )に渡しdescription、後者のルールでセマンティック述語を使用して、 に関する入力を検証したいと考えていn.textます。これが私のコードです:

useCaseSpecification 
    :   n=useCase '='
        description[$n.text]
    ;

useCase
    : ucID=('UC' INTEGER)? ucName
    ;

ucName
    :   caren io
    ;

caren
    :   'create' | 'creates' | alter | read | 'erase' | 'erases' | notify
    ;

/* ..more code */

description[String str]
    :   'Description' ':' primaryActor (useCase {str==$useCase.text}?) /* more grammar */
    ;

など、セマンティック述語表現の多くの代替手段を試しました{str.equals($useCase.text)}が、何もしませんでした。パーサーが検証を行っていないようです。

例でインタープリターを実行すると、useCase タイプのすべての入力が許可されます。たとえば、入力が次の場合:

処方箋を作成する =
説明: 医師が処方箋を作成します /* ... */

それは正しいはずです。

入力が次の場合:

処方箋を作成する =
説明: 医師が Rrrrescription を作成します /* ... */

それは間違っているはずです。

4

2 に答える 2

3

インタープリター (ANTLRWorks のインタープリター、または Eclipse のプラグインのいずれか) に依存しないでください。インタプリタは述語を考慮しません。

また、使用しているターゲットが不明ですが{str==$useCase.text}?、Java を使用している場合は間違っていることに注意してください (==オブジェクトの ID を比較し、equals(...)代わりに使用してください)。

たとえば、2 つの同じ文字を解析するには、次のようにします。

grammar T;

parse
 : Letter same[$Letter.text] EOF
 ;

same [String s]
 : Letter {$Letter.text.equals(s)}?
 ;

Letter : 'a'..'z' | 'A'..'Z';

解析"AB"すると例外が発生します。

ここに画像の説明を入力

解析中"AA":

ここに画像の説明を入力

上記のツリーは、ANTLRWorks のデバッガーを使用して生成されたもので、魅力的に機能します。language=XYZデバッガーはこのオプションを無視することに注意してください: Java をターゲット言語として文法をデバッグします。したがって、Java 以外の組み込みコードは問題を引き起こします。

これらのセマンティック チェックを文法に詰め込みすぎると、文法規則とコードが混在し、保守が困難になることに注意してください。これらの種類のチェックは通常、パーサーが (抽象) 解析ツリーを作成した後に実行されます。つまりuseCase、パーサーによって作成されたツリーを反復処理するときに s を自由に照合し、検証することを意味します。

于 2012-07-23T09:31:03.693 に答える
0

あなたはEclipseを使用しているので、コメントではなく回答として投稿する必要があったでしょう。How To Configure ANTLR IDEを参照してから、ANTLR IDE を使用したデバッグ/テストを参照してください。これらが役に立った場合は、賛成票をお願いします。

于 2012-07-31T04:40:49.827 に答える