$1 的非终结符没有声明的类型

$1 of nonterminal has no declared type

%{
    #include<stdio.h>
%}

%start INPUT
%union {int num}
%token <num> val
%type <num>SUM

%%
INPUT: SUM

SUM: '('SUM '+' SUM')'  {$$ =  + }
    | val               {$$ = }

%%

int main(){
    return yyparse();
}

我正在尝试制作一个解析器。虽然我声明了 SUM 非终结符的类型,但它给了我警告:

error:  of ‘SUM’ has no declared type
 SUM: '('SUM '+' SUM')'  {$$ =  + }

我该如何解决这个问题?

SUM: '('SUM '+' SUM')'  {$$ =  + }

这里的</code>是指<code>'('</code>是指<code>SUM。所以当 bsion 抱怨 </code> 没有声明类型时,这意味着 <code>'(' 令牌没有声明类型,这是真的。

当然,您不想将 '(' 标记添加到任何内容,您想要添加两个总和。为此,您应该添加 </code> 和 <code>.

为避免此类索引错误,您还可以考虑像这样使用 named references

SUM: '(' SUM[left] '+' SUM[right] ')'  { $$ = $left + $right; }