Имея дело с неоднозначностью в грамматике БНФ - PullRequest
0 голосов
/ 18 августа 2011

Я пытаюсь создать синтаксический анализатор для 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 (который является действительно широким соответствием регулярному выражению) оценивается только тогда, когда все остальные токены захвачены и больше ничего не осталось.

Любая помощь приветствуется.

Спасибо!

Редактировать: Обновлен заголовок согласно предложению

1 Ответ

0 голосов
/ 18 августа 2011

Помимо того, что это не общий ответ на неоднозначность BNF, я смог решить мою проблему с Иронией, создав новый Терминал.

Так что, если кто-то еще столкнется с этой проблемой, код для нового Терминала (хотя и не добавлен в основной проект Irony) можно найти по этой ссылке: http://irony.codeplex.com/discussions/269483

Спасибо

...