首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EBNF嵌套可选/分组

EBNF嵌套可选/分组
EN

Stack Overflow用户
提问于 2018-07-20 22:51:44
回答 1查看 222关注 0票数 0

我正在观察manual中列出的python语法,并考虑它们的EBNF形式的输出,特别是使用varargslist:

代码语言:javascript
复制
varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [
'*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
| '**' vfpdef [',']]]
| '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
| '**' vfpdef [',']

虽然我对这一节特别感兴趣:

代码语言:javascript
复制
['*' [vfpdef] (',' vfpdef ['=' test])* ]

我将其解释为:

代码语言:javascript
复制
[ [ non-terminal1 ] ( non-terminal2) ]

我意识到这两个

代码语言:javascript
复制
non-terminal1 (non-terminal2)
(non-terminal2)

是此表单中的有效选项,但这是否包括:

代码语言:javascript
复制
non-terminal1

也是?EBNF状态的wiki页面

代码语言:javascript
复制
That is, everything that is set within the square brackets may be 
present just once, or not at all

但是,这是将方括号中的所有内容都分组为一个可能只出现一次的实体,还是可选的,例如:

代码语言:javascript
复制
[ [non-terminal1] [(non-terminal2)] ]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-21 00:07:12

如果

代码语言:javascript
复制
['*' [vfpdef] (',' vfpdef ['=' test])* ]

代码语言:javascript
复制
[ [ non-terminal1 ] non-terminal2 ]    -- parentheses deleted as redundant

non-terminal2表示

代码语言:javascript
复制
non-terminal3 *

根据定义它是可以为空的。(即,它可能是空的。)

所以,严格地说,一旦你完成了转换

代码语言:javascript
复制
non-terminal1

不是有效的结果。解析器必须是

代码语言:javascript
复制
non-terminal1 non-terminal2

其中non-terminal2匹配了空字符串。

但是实际的解析逻辑更可能想要使用公式

代码语言:javascript
复制
[ [ non-terminal1 ] non-terminal3... ]   -- Not EBNF syntax, but I hope you get the idea

在这种情况下,non-terminal2已经被消除了,因为它分散了对结果解析的注意力。在这种情况下,由于0或更多的重复可以是0次重复,因此正确的结果将包括

代码语言:javascript
复制
                                          -- nothing :-)
non-terminal1
              non-terminal3
non-terminal1 non-terminal3
              non-terminal3 non-terminal3

诸若此类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51445192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档