0

.NETでIronyを使用して構築しているDSLのパーサーを構築しようとしていますが、回避策が見つからない問題が見つかりました。BNFを処理するので、どのBNFソリューションも役立つと思います。

私は次の入力を持っています:

昨日ドラッ​​グストアで$10 

次の文法で:

<expr> :== unit | expr + unit
<unit> :==  money | date | location

<date> : == yesterday|today|tomorrow
<location> :== .* | <preposition> .*
<preposition> :== at
<money> :== ((\$)?\d*((\.*)\d*)*\,?\d{1,2})

この入力でチャームのように機能します。私が望んでいた結果が正確に得られます。それは次のとおりです。

Money Amount: 10
Date: Yesterday
Location: Drug Store

ただし、入力の順序を次のように変更すると

$10 at drug store yesterday

ステップを減らすため、同じ出力が得られません。出力は次のようになります。

Money amount: 10
Location: Drug Store Yesterday

Location(これは非常に広い正規表現の一致です)が他のすべてのトークンがキャプチャされ、他に何も残っていない場合にのみ評価されるようにする方法があるかどうか疑問に思いました。

どんな助けでも大歓迎です。

ありがとう!

編集:提案に従ってタイトルを更新

4

1 に答える 1

-1

これはBNFのあいまいさに対する一般的な答えではないという事実に加えて、新しいターミナルを作成することで、Ironyの問題を解決することができました。

したがって、他の誰かがこの問題に遭遇した場合、新しいターミナルのコード(メインのIronyプロジェクトには追加されていません)は次のリンクにあります:http://irony.codeplex.com/discussions/269483

ありがとう

于 2011-08-18T15:40:44.977 に答える