.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(これは非常に広い正規表現の一致です)が他のすべてのトークンがキャプチャされ、他に何も残っていない場合にのみ評価されるようにする方法があるかどうか疑問に思いました。
どんな助けでも大歓迎です。
ありがとう!
編集:提案に従ってタイトルを更新