【问题标题】:$1 of nonterminal has no declared type$1 of nonterminal 没有声明的类型
【发布时间】:2021-12-09 08:42:58
【问题描述】:
%{
    #include<stdio.h>
%}

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

%%
INPUT: SUM

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

%%

int main(){
    return yyparse();
}

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: bison yacc lex


    【解决方案1】:
    SUM: '('SUM '+' SUM')'  {$$ = $1 + $2}
    

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

    当然,您不想将'(' 标记添加到任何东西,您想将两个总和相加。为此,您应该添加 $2$4

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多