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 回答