【问题标题】:How to solve Bison warning "... has no declared type"如何解决 Bison 警告“...没有声明的类型”
【发布时间】:2009-06-18 19:08:10
【问题描述】:

在这个文件上运行 Bison:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%%

exp :   NUM     {$$.val = $1.val;}
    | ID        {$$.val = vars[$1.name];}
    | exp '+' exp   {$$.val = $1.val + $3.val;}
    | ID '=' exp    {$$.val = vars[$1.name] = $3.val;}
;

%%

导致以下警告:

警告:'exp' 的 $$ 没有声明类型。

这是什么意思,我该如何解决?

【问题讨论】:

  • +1:在谷歌搜索时首先出现bison error has no declared type
  • 只是一个小细节。我有%union { int intValue; int floatValue; },但它不允许我使用$$.intValue$1.intValue。它说error: request for member ‘floatValue’ in something not a structure or union。为什么会这样?

标签: bison


【解决方案1】:

定义的联合 (%union) 不打算直接使用。相反,您需要告诉 Bison 哪个表达式使用了工会的哪个成员。

这是通过%type directive 完成的。

代码的固定版本是:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%type<val> exp NUM
%type<name> ID

%%

exp :   NUM     {$$ = $1;}
    | ID        {$$ = vars[$1];}
    | exp '+' exp   {$$ = $1 + $3;}
    | ID '=' exp    {$$ = vars[$1] = $3;}
;

%%

【讨论】:

  • 一点:符号%type&lt;val&gt; exp NUM 并不意味着特定的归约exp NUM 具有val 类型;这意味着exp 的类型为VALNUM 的类型为val。顺便说一句,这个发布的答案比没有示例的 type 指令的官方文档更有用。
  • @Reb.Cabin VAL 在哪里定义?还是你的意思是val
【解决方案2】:

进一步考虑,如果您想更明确地进行归约(如果您正在执行 AST 注释,这可能很方便),那么您可以将堆栈值指针设置为指针,然后自己处理类型值。很像标量类型:

struct myScalar {
    union {
        int num;
        char *id;
        char *float_lexeme;
    }payload;

    enum {
        TYPE_NUM,
        TYPE_IDENTIFIER,
        TYPE_FLOAT_CHAR
    } type;
    char *orig_lexeme;
};

并且有一个 typedef 和 scalar_val *val 用于堆栈。

当您转向更复杂的编译器前端时,它可以帮助您像这样构建您的 AST,这样当您遍历树时,您可以获得更好的元数据,并且您还可以通过前语义类型的翻译来增加翻译.然后归结为您的叶子产品,例如 ID,将词位洗牌到正确的标量有效负载中。

不是一个完整的解释,但你明白了。

希望这对您未来的 Bison/Lex 前端和 ...

有所帮助

祝你好运

【讨论】:

  • 你能再解释一下吗.. 我不明白%type 是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
相关资源
最近更新 更多