语法 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); } }