我在ANTLR中为一种语言写了一条语法规则,如下所示:
variable: idlist COLON type (EQUAL explist)? SEMI;
idlist: identifier (COMMA identifier)*;
explist: exp (COMMA exp)*;
COLON: ':';
EQUAL: '=';
SEMI: ';';
COMMA: ',';
此输入对上述语法有效:
a, b, c: integer = 3, 4, 6;
但是现在如果我需要这个输入:
a, b, c, d: integer = 3, 4, 6;
或者这个:
a, b, c: integer = 3, 4, 6, 1;
由于 * idlist * 中的ID数量和 * exist * 中的值不等而变得无效,我如何重写我的语法?
2条答案
按热度按时间g52tjvyc1#
不要让你的语法来处理这个语义任务。语法在所有这些情况下都是正确的。左值和右值的数量必须相等的约束是你应该在语义阶段执行的语义规则,在解析步骤(语法阶段)之后。这通常是通过评估生成的解析树来完成的。
tvz2xvvm2#
我同意前面的回答,正确的方法应该是稍后在生成的解析树/AST的评估过程中进行。
但是如果你坚持的话,这里有一个语法的例子,它与声明和初始化的数量相匹配。请注意,它更多的是一个展示上下文无关语法的力量的练习,而不是我很乐意在产品代码中找到的东西。
如果列表大小不匹配,错误消息会令人困惑:
这就是为什么我不建议使用这种方法。