【问题标题】:Is my EBNF logic wrong here?我的EBNF逻辑在这里错了吗?
【发布时间】:2011-03-30 02:46:35
【问题描述】:

我在 Python 程序中使用SimpleParse 来解析一些相当简单的语言。它应该能够解析以下示例文本(每行单独):

d6
(d4 + d8 + 5) + 6
{5d20}+12
[d10 + 6d6] + 9
(d10 + d12) + 8d8

我已经为上面的内容编写了以下 EBNF,但解析器总是在我身上崩溃,即使是在“d6”的简单情况下:

# 'number' is already predefined in SimpleParse to parse exactly what you think it will parse
root          := roll
roll          := space,operations,space
operations    := function+
function      := ((dice,op,function)/(grouping,op,function)/(function,op,grouping))/(dice/grouping/constant) #just to clarify, the '/' is a FirstOf operator
constant      := number
grouping      := ([[(],operations,[])])/'{',dice,'}'
dice          := number?,[dD],number
op            := space,[-+],space
space         := [ \t]*

我开始怀疑我的 EBNF 逻辑是否在某个地方弄错了。

编辑:对于好奇的人,这是最终的 EBNF 的样子:

roll          := space,operations,space
operations    := function
function      := (dice,op,operations)/(grouping,op,operations)/dice/constant/grouping
constant      := number
grouping      := ('(',operations,')')/('{',dice,'}')/('[',operations,']')
dice          := number?,[dD],number
op            := space,[-+],space
space         := [ \t]*

【问题讨论】:

    标签: python parsing ebnf


    【解决方案1】:

    您还没有定义number,我在文档中没有看到它预定义。

    【讨论】:

    • 对不起,我应该发表评论,但 SimpleParse 实际上有一个预定义的“数字”库,我已经包含了它,所以这应该不是问题。我会补充的。
    • 我看到的唯一另一件事是您对function 的分组有点奇怪。这是故意的吗?
    • number 不包括十六进制,是吗?如果是这样,它会吃掉d
    • 看来number 不包括十六进制。如果没有其他人可以提供帮助,我所能建议的就是复制和简化,从仅用于最简单情况的语法开始,并在构建完整语法时在每个阶段进行测试,以查看错误出现在哪里。好运气。
    • 这是一个关于十六进制的好问题。我没有想到。我会做一些测试。就功能而言,我希望能够涵盖几种不同的情况,将其与操作配对并适当地结束。
    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 2016-02-22
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    相关资源
    最近更新 更多