2

私は、特定のトークン/トークンの組み合わせを探す、組み合わせた ANTLR 文法を持っています。一部のトークンは、0 回または 1 回使用できます。これらのトークンのハッシュマップに「見つかった」または「見つからなかった」値を保存したいと考えています。トークンが利用可能な場合にこれを行う方法はすでに知っています。しかし、見つからなかったトークンに対してどうすればよいでしょうか。
次の例は、非常に単純化されていることを示しています。

grammar Expr;

@header {
import java.util.HashMap;
}

@members {
HashMap<String,String> memory = new HashMap<String,String>();
}

statements: ONE  
      (WS TWO {memory.put("two","found");})? 
      WS THREE EOF;    

ONE: 'one';
TWO: 'two';
THREE: 'three';
WS: ' ';

この文法内で「TWO」が見つからなかったため、HashMap に別の値を設定する可能性はありますか?

memory.put("two","not found");
4

1 に答える 1

2

この文法内で「TWO」が見つからなかったため、HashMap に別の値を設定する可能性はありますか?

確かに、このように:

statements
 : ONE WS ( TWO WS THREE EOF {memory.put("two","found");}
          | THREE EOF        {memory.put("two","not found");}
          )
 ;    

編集

または、さらにオプションのトークンがある場合 ( TWOTHREEおよびFOURはオプション)、次のようにします。

statements
 : ONE (WS TWO memory.put("two","found");     | memory.put("two","not found");) 
       (WS THREE memory.put("three","found"); | memory.put("three","not found");) 
       (WS FOUR memory.put("four","found");   | memory.put("four","not found");) 
   EOF
 ;

または、次のようなものも機能するはずです。

statements
 : ONE (WS TWO)? (WS THREE)? (WS FOUR)?
   {
     memory.put("two", $TWO.text == null ? "not found" : "found");
     memory.put("three", $THREE.text == null ? "not found" : "found");
     memory.put("four", $FOUR.text == null ? "not found" : "found");
   }
 ;
于 2013-03-01T19:09:40.697 に答える