语法 returns 要么在第一位,要么一切都在第一位
Grammar returns either first or everything but first
我有这些语法:
input : INPUT identifier SEMICOLON { gen(IN, , VOID, VOID); }
;
identifier : IDENTIFIER identifier_cont {
installed(, 2);
$$ = ;
}
;
identifier_cont : /*epsilon*/
| COMMA IDENTIFIER identifier_cont {
installed(, 2);
$$ = ;
}
;
发生了代码生成 (IN x VOID VOID
),但我在处理输入列表时遇到了问题。
因为现在只是输入语句的第一个变量:
input x, y, x;
// ----
IN x VOID VOID
由于第 5 行的 $$ =
而生成。
有时需要 $$ =
所以它会生成除第一个变量之外的所有内容。
我该怎么做?
首先,你的命名很混乱。您的 identifier
规则最好称为 identifier_list
而不是 identifier
,因为它匹配 comma-separated 标识符列表,而不是单个标识符。
一旦你这样做了,事情就会变得更加清晰。由于 identifier_list
匹配标识符列表,因此它应该 return 列表为 $$
而不是单个标识符。您可以通过在操作中构建列表来做到这一点:
identifier_list:
IDENTIFIER { $$ = new_singleton_list(); }
| idenitifer_list ',' IDENTIFIER {
$$ = append_list(, ); }
所以现在你的顶级规则变成了这样的:
input: INPUT identifer_list ';' {
for (auto element : ) { // iterator over the list
gen(IN, element, VOID, VOID); } }
我有这些语法:
input : INPUT identifier SEMICOLON { gen(IN, , VOID, VOID); }
;
identifier : IDENTIFIER identifier_cont {
installed(, 2);
$$ = ;
}
;
identifier_cont : /*epsilon*/
| COMMA IDENTIFIER identifier_cont {
installed(, 2);
$$ = ;
}
;
发生了代码生成 (IN x VOID VOID
),但我在处理输入列表时遇到了问题。
因为现在只是输入语句的第一个变量:
input x, y, x;
// ----
IN x VOID VOID
由于第 5 行的 $$ =
而生成。
有时需要 $$ =
所以它会生成除第一个变量之外的所有内容。
我该怎么做?
首先,你的命名很混乱。您的 identifier
规则最好称为 identifier_list
而不是 identifier
,因为它匹配 comma-separated 标识符列表,而不是单个标识符。
一旦你这样做了,事情就会变得更加清晰。由于 identifier_list
匹配标识符列表,因此它应该 return 列表为 $$
而不是单个标识符。您可以通过在操作中构建列表来做到这一点:
identifier_list:
IDENTIFIER { $$ = new_singleton_list(); }
| idenitifer_list ',' IDENTIFIER {
$$ = append_list(, ); }
所以现在你的顶级规则变成了这样的:
input: INPUT identifer_list ';' {
for (auto element : ) { // iterator over the list
gen(IN, element, VOID, VOID); } }