我想写一个性质的语法规则:
program = { expression }
其中{}
表示 1 个或多个。
例如,Lua 的语法使用相同的语法:
chunk ::= {stat [`;´]} [laststat [`;´]]
这可能吗?这是否符合上下文无关语法?
我相信最好的简单解决方案是:
program : expression
| program NEWLINE expression
这仅适用于 PLY 生成 LR 语法,在 LL 语法中非终结符不能以自身开头(左递归)(如果您使用的是 ANTLR 等工具)
你也可以这样做:
program : expression
| expression NEWLINE program
第二个版本很好,因为它与 LL 和 LR 语法兼容,但我相信第一个规则对于 LR 解析器更有效。
我找到了答案:
program : expression
| expression NEWLINE expression