我正在尝试为我在 .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 (这是一个非常广泛的正则表达式匹配)。
任何帮助表示赞赏。
谢谢!
编辑:根据建议更新标题