首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >yacc错误没有声明类型,但我在tiger.grm中声明了这些类型?

yacc错误没有声明类型,但我在tiger.grm中声明了这些类型?
EN

Stack Overflow用户
提问于 2019-05-24 14:32:19
回答 1查看 77关注 0票数 1

我正在遵循苹果的书,但当我为第四章抽象语法做程序时,它让我感到困惑,我声明了type.how来修复它吗?

当我运行该命令时:

代码语言:javascript
复制
$ yacc -dv tiger.grm

yacc给了我:

代码语言:javascript
复制
tiger.grm:150.62-63: error: $2 of ‘arrayExp’ has no declared type
     : ID LBRACK exp RBRACK OF exp {$$ = A_arrayExp(EM_tokPos,$2,$4);}
                                                              ^^
tiger.grm:150.65-66: error: $4 of ‘arrayExp’ has no declared type
     : ID LBRACK exp RBRACK OF exp {$$ = A_arrayExp(EM_tokPos,$2,$4);}
                                                                 ^^
tiger.grm:175.51-52: error: $1 of ‘efieldList_’ has no declared type
     | COMMA efield efieldList_ {$$ = A_EfieldList($1,$3);}
                                                   ^^
tiger.grm:226.48-49: error: $1 of ‘fieldList_’ has no declared type
     | COMMA field fieldList_ {$$ = A_FieldList($1,$3);}
                                                ^^
makefile:11: recipe for target 'y.tab.c' failed
make: *** [y.tab.c] Error 1

我的生成器和环境:

ubuntu 18.04 LTS

bison (GNU Bison) 3.0.4由Robert Corbett和Richard Stallman编写。

代码语言:javascript
复制
%{
#include <stdio.h>
.......
%union {
    int pos;
    ......
    A_efieldList efieldList;
}

%token <sval> ID STRING
%token <ival> INT
%token
COMMA COLON SEMICOLON LPAREN RPAREN LBRACK RBRACK
......
FUNCTION VAR TYPE

%type <exp> exp varExp nilExp intExp stringExp callExp opExp recordExp seqExp assignExp ifExp whileExp forExp breakExp letExp arrayExp
%type <var> lvalue
%type <explist> argList argList_ seqList
%type <declist> decList funcDecList
%type <dec> dec varDec funcDec funcDec_
%type <efield> efield
%type <efieldlist> efieldList efieldList_
%type <namtylist> typeDec nametyList
%type <namty> namety
%type <field> field
%type <fieldlist> fieldList fieldList_

%nonassoc LOWER
......
%nonassoc UMINUS

%start program
%%
program 
    : exp  {absyn_root = $1;}

...... # these are so much code ,so i don't post it
       # but if you want the orignal code you can got it from
       # https://paste.ubuntu.com/p/KRQCDCftr6/

fieldList_ 
    : %empty                 {$$ = NULL;}
    | COMMA field fieldList_ {$$ = A_FieldList($1,$3);}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-24 21:36:50

所有这些错误都是错误计算右侧符号的结果。例如,在

代码语言:javascript
复制
 : ID LBRACK exp RBRACK OF exp {$$ = A_arrayExp(EM_tokPos,$2,$4);}

$2LBRACK (第二个符号),$4RBRACK。也许您想要两个exp符号($3$6)的值,但是忽略$1处的ID的值有点奇怪。

也许你认为只有有值的符号才会被计算在内。事实并非如此;$n引用右侧的符号n的值,因此如果该符号没有值,则是错误的。

请注意,yacc/bison并不能真正判断某个特定终端是否具有值;它所知道的只是您是否已经告诉它该值的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56287017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档