语法首先返回,或者首先返回所有内容

时间:2018-04-09 21:22:32

标签: bison yacc

我有这些语法:

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,因此它会生成除第一个变量之外的所有内容。

我该怎么做?

1 个答案:

答案 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); } }