2011-05-20 6 views
0

私は非常に単純なC#文法のサブセットを練習として書いています。ANTLRのトークン間にスペースを入れない

しかし、私は白い空白が私にいくつかの問題を与えているというルールを持っています。

は、私は次のように区別したい:

int a; 
int? b; 

最初は「通常の」int型であり、第二は、NULL可能のint型です。

しかし、私の現在の文法では、これを解析できません。

type  : typeBase x='?' -> { x == null } typeBase 
          -> ^('?' typeBase) 
     ; 

typeBase : 'int' 
     | 'float' 
     ; 

事はこれらのルールwhith、それが唯一の前に空白で動作することである、このような「?」:私はしたくないと思い

int ? a; 

アイデア?

+1

'type'の書き換えルールが間違っています。書き換えルールは2つあります。また、これはオプションではないでしょうか?今は常に ''? ''を含んでいなければなりません。 –

+1

とにかく、書き換えルールがなければ、 'int?'と 'int?'の両方が正しく解析されます。 –

答えて

2

1)空白の定義に欠陥があるようです...あなたが提示する文法は "int?"を受け入れるべきです。と "int?"たぶん、空白の定義を見てみるべきでしょう。

2) "int?a"を許可しない場合は、余分なトークンのintを定義できますか?と '浮きますか?' ...通常、すべてのトークンの間に空白を入れることができるので、1つのトークンにする必要があります。

+1

ええ、 'int?'、 'float?'などのような余分なトークンを定義することは、型と疑問符の間にスペースが許されない場合に行く方法になります。 #1は正しい:intとintの両方が生成されたパーサーによって受け入れられる。 –

関連する問題