Я пытаюсь создать синтаксический анализатор для DSL, который я создаю с использованием Irony в .NET, и обнаружил проблему, которую я не могу найти.Так как он обрабатывает BNF, я думаю, что любое решение BNF поможет.
У меня есть следующий ввод:
$10 yesterday at drug store
Со следующей грамматикой:
<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 (который является действительно широким соответствием регулярному выражению) оценивается только тогда, когда все остальные токены захвачены и больше ничего не осталось.
Любая помощь приветствуется.
Спасибо!
Редактировать: Обновлен заголовок согласно предложению