我有这些语法:
input : INPUT identifier SEMICOLON { gen(IN, $2, VOID, VOID); }
;
identifier : IDENTIFIER identifier_cont {
installed($1, 2);
$$ = $1;
}
;
identifier_cont : /*epsilon*/
| COMMA IDENTIFIER identifier_cont {
installed($2, 2);
$$ = $2;
}
;
这会发生代码生成(IN x VOID VOID
),但我输入的列表有问题。
因为它现在只是输入语句的第一个变量:
input x, y, x;
// ----
IN x VOID VOID
由于第5行的$$ = $1
而生成。
有时需要$$ = $2
,因此它会生成除第一个变量之外的所有内容。
我该怎么做?
答案 0 :(得分:1)
首先,您的命名非常混乱。您的identifier
规则最好称为identifier_list
,而不是identifier
,因为它与逗号分隔的标识符列表匹配,而不是单个标识符。
一旦你这样做,事情就会变得更加清晰。当identifier_list
匹配标识符列表时,它应该返回一个列表$$
而不是单个标识符。您可以通过在操作中构建列表来实现此目的:
identifier_list:
IDENTIFIER { $$ = new_singleton_list($1); }
| idenitifer_list ',' IDENTIFIER {
$$ = append_list($1, $3); }
所以现在你的顶级规则变成了:
input: INPUT identifer_list ';' {
for (auto element : $1) { // iterator over the list
gen(IN, element, VOID, VOID); } }