处理BNF语法中的歧义

时间:2011-08-17 20:53:01

标签: grammar text-parsing tokenize bnf ambiguity

我正在尝试为我在.NET中使用Irony构建的DSL构建解析器,并发现了一个我无法找到解决方法的问题。由于它处理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

我想知道是否有办法确保仅在捕获了所有其他令牌并且没有剩下任何其他令牌时才评估位置(这是一个非常广泛的正则表达式匹配)。

感谢任何帮助。

谢谢!

修改:根据建议更新了标题

1 个答案:

答案 0 :(得分:-1)

除了这不是BNF模糊性的一般答案之外,我能够通过创建一个新终端来解决我对Irony的问题。

因此,如果其他人遇到此问题,可以在以下链接中找到新终端的代码(虽然未添加到主Irony项目中):http://irony.codeplex.com/discussions/269483

由于