Python 我的EBNF逻辑错误吗?
我在Python程序中使用它来解析一些相当简单的语言学。它应该能够解析以下示例文本(每行分别): 我已经为上述内容编写了以下EBNF,但解析器一直在困扰我,即使是在“d6”的简单情况下: 我开始怀疑我的EBNF中的逻辑是否有错误 编辑:出于好奇,以下是最终EBNF的外观:Python 我的EBNF逻辑错误吗?,python,parsing,ebnf,Python,Parsing,Ebnf,我在Python程序中使用它来解析一些相当简单的语言学。它应该能够解析以下示例文本(每行分别): 我已经为上述内容编写了以下EBNF,但解析器一直在困扰我,即使是在“d6”的简单情况下: 我开始怀疑我的EBNF中的逻辑是否有错误 编辑:出于好奇,以下是最终EBNF的外观: roll := space,operations,space operations := function function := (dice,op,operations)/(grouping
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]*
您还没有定义编号,我在文档中也没有看到它是预定义的。对不起,我应该发表评论,但是SimpleParse实际上有一个预定义的“编号”库,我已经包含了该库,所以这不应该是个问题。我要补充一点。我看到的另一件事是,您对
函数的分组有点奇怪。这是故意的吗?number
不包括十六进制,是吗?如果它这样做,它将吃掉d
。似乎number
不包含十六进制。如果没有其他人可以帮忙,我所能建议的就是复制和简化,从一个语法开始,只针对最简单的情况,然后在每个阶段进行测试,直到生成完整的语法,看看错误出在哪里。祝你好运。这是一个关于十六进制的好问题。我没想到。我要做一些测试。就函数而言,我希望能够涵盖将其与操作配对并适当结束的几种不同情况。
# '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]*
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]*