2012-11-11 28 views
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. 
    }; 

回答

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 | ...) 

或parser-和詞法規則可以在混合

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;} 
    ; 

更具可讀性,恕我直言。

相關問題