EBNF嵌套的可选/分组

时间:2018-07-20 14:51:44

标签: python grammar ebnf

我正在观察manual中列出的python语法,并考虑其EBNF形式的输出,尤其是varargslist:

varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [
'*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
| '**' vfpdef [',']]]
| '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
| '**' vfpdef [',']

尽管我对本节特别感兴趣:

['*' [vfpdef] (',' vfpdef ['=' test])* ]

我解释为:

[ [ non-terminal1 ] ( non-terminal2) ]

我意识到两者

non-terminal1 (non-terminal2)
(non-terminal2)

此格式是有效选项,但这包括:

non-terminal1

也是吗? EBNF状态的wiki

That is, everything that is set within the square brackets may be 
present just once, or not at all

但是这会将方括号内的所有内容归为一个实体,该实体只能出现一次,或者是选择性的,例如:

[ [non-terminal1] [(non-terminal2)] ]

1 个答案:

答案 0 :(得分:1)

如果

['*' [vfpdef] (',' vfpdef ['=' test])* ]

[ [ non-terminal1 ] non-terminal2 ]    -- parentheses deleted as redundant

然后non-terminal2代表

non-terminal3 *

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

因此,严格来说,一旦完成转换

non-terminal1

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

non-terminal1 non-terminal2

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

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

[ [ non-terminal1 ] non-terminal3... ]   -- Not EBNF syntax, but I hope you get the idea

,其中non-terminal2已被消除,以免干扰最终的解析。在这种情况下,由于0次或多次重复可以是0次重复,因此正确的结果应包括

                                          -- nothing :-)
non-terminal1
              non-terminal3
non-terminal1 non-terminal3
              non-terminal3 non-terminal3

以此类推。