У ошибки yacc нет типа объявления, но я должен был объявить это в моем tiger.grm? - PullRequest
1 голос
/ 24 мая 2019

Я слежу за книгой Apple, но когда я делаю программу для главы 4 «Абстрактный синтаксис», она вводит меня в заблуждение, я объявляю тип. Как это исправить?

Когда я запускаю это:

$ yacc -dv tiger.grm

yacc дает мне:

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 Автор: РобертКорбетт и Ричард Столлман.

%{
#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);}

1 Ответ

0 голосов
/ 24 мая 2019

Все эти ошибки являются результатом неправильного подсчета символов справа.Например, в

 : ID LBRACK exp RBRACK OF exp {$$ = A_arrayExp(EM_tokPos,$2,$4);}

$2 равно LBRACK (второй символ), а $4 равно RBRACK.Возможно, вы хотели значения двух exp символов ($3 и $6), но немного странно игнорировать значение ID в $1.

Возможно, выполагая, что учитываются только символы со значениями.Это не тот случай;$n относится к значению символа n в правой части и поэтому является ошибкой, если этот символ не имеет значения.

Обратите внимание, что yacc / bison на самом деле не можетсказать, имеет ли конкретный терминал значение или нет;все, что он знает, - сказал ли ты ему, каков тип этого значения.

...