1

可能な限り少ないコピー/貼り付けで、コンテキストに応じてルールを変更しようとしています。私が達成しようとしていることの擬似コードの変形から始めるのが最善です:

module[boolean isParam]: 'module' id=identity?
        declaration+ 
        update+
        'endmodule' -> ^(MODULE ({if (isParam)} IS_PARAMETER {else} $id) declaration+ update+);

が設定されている場合、モジュールをルールisParamに一致させず、代わりにトークンを作成します。これは2つの別々のルールで実行できると確信していますが、コードの重複を減らしたり、ルールをいくつかの小さなルールに分割したりせずに、よりクリーンな方法はありますか?identityIS_PARAMETERmodulemodule

4

2 に答える 2

1

私はこのようなものがうまくいくと信じています:

module[boolean isParam]: 'module' id=identity?
        declaration+ 
        update+
        'endmodule' -> {isParam}? ^(MODULE IS_PARAMETER declaration+ update+)
                    ->            ^(MODULE $id declaration+ update+);
于 2012-04-16T12:30:20.700 に答える
1

すでに示唆したように、これはうまくいくでしょう:

module[boolean isParam]
 : 'module' id=identity? declaration+ update+ 'endmodule' 
   -> {isParam}? ^(MODULE IS_PARAMETER declaration+ update+)
   ->            ^(MODULE $id? declaration+ update+)
 ;

(ただし、オプションに注意してください$id!)

しかし、あなたのルールを見ると、が存在しないidentityときはいつでも、 ASTにノードが必要であるという印象を受けます。この場合、パラメーターと述語なしでこれを処理できます。これはIMOが推奨されます。IS_PARAMETER

module
 : 'module' ( identity declaration+ update+ 'endmodule' -> ^(MODULE identity declaration+ update+)
            | declaration+ update+ 'endmodule'          -> ^(MODULE IS_PARAMETER declaration+ update+)
            )
 ;
于 2012-04-16T15:15:01.270 に答える