EBNF 嵌套 Optional/Grouping
EBNF Nested Optional/Grouping
我正在观察 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)] ]
如果
['*' [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
等等。
我正在观察 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)] ]
如果
['*' [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
等等。