2

複数の面倒な割り当てなしで次のコードを書くにはどうすればよいですか?

statement returns [Leaf node]
    :  assignment     {node = $assignment.node;}
    |  write          {node = $write.node;}
    |  writeln        {node = $writeln.node;}
    |  readBool       {node = $readBool.node;}
    |  readInt        {node = $readInt.node;}
    ;

次のようなもので十分です。

statement returns [Leaf node]
    :  a=(assignment | write | writeln | ...) { //all statements returns `Leaf`
        node = $a.node; //but 'a' is just a `Tokien`, so we get compile error.
    };
4

1 に答える 1

3

いいえ、これは不可能です。

statement returns [Leaf node]
    :  a=(assignment | write | writeln | ...) { //all statements returns `Leaf`
        node = $a.node; //but 'a' is just a `Tokien`, so we get compile error.
    };

括弧が複数のルールに一致する可能性があるため:

a=(a b | c d e | ...) 

または、パーサールールとレクサールールを混在させることができます。

a=(A b | C | d | ...) 

ただし、次のようなことができます。

statement returns [Leaf node]
    :  (a=assignment | a=write | a=writeln | ...) 
       {
         $node = $a.node;
       };

しかし、個人的には、あなたが最初に投稿したものが好きです。

statement returns [Leaf node]
    :  assignment     {node = $assignment.node;}
    |  write          {node = $write.node;}
    |  writeln        {node = $writeln.node;}
    |  readBool       {node = $readBool.node;}
    |  readInt        {node = $readInt.node;}
    ;

はるかに読みやすい、私見。

于 2012-11-11T15:56:39.610 に答える