Сдвиг / уменьшение конфликта, когда я ввожу действие в YACC - PullRequest
2 голосов
/ 22 декабря 2011

Я пишу интерфейс для моего компилятора C, где в настоящее время я добавляю систему типов. Ранее я предполагал, что все было int, и, следовательно, следующее правило работало нормально.

declaration: datatype varList ';' { gTrace<<"declaration ";}

varList: IDENTIFIER { builder.addSymbol($1); }
    | varList',' IDENTIFIER { builder.addSymbol($3); }
    ;

Но теперь я также добавил тип к символу и, следовательно, изменил свое правило, как показано ниже:

 declaration: datatype { currentType = $1; } varList ';' { gTrace<<"declaration ";   currentType = -1; }

 varList: IDENTIFIER    { builder.addSymbol($1, getType(currentType)); }
    | varList',' IDENTIFIER { builder.addSymbol($3, getType(currentType)); }
    ;

Когда я это делаю, я получаю ошибку сдвига / уменьшения, поскольку {currentType = $ 1; } рассматривается как пустое правило. Как мне поступить с этой ошибкой? Есть ли способ указать, что это просто действие?

Прикрепленный ниже фрагмент из моего y.output

32 $@6: /* empty */

33 declaration: datatype $@6 varList ';'

34 varList: IDENTIFIER
35        | varList ',' IDENTIFIER

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Я не получаю никаких ошибок или предупреждений:

%token   INT
%token   FLOAT
%token   CHAR
%token   IDENTIFIER

%%

declaration: datatype { currentType = $1; } varList ';' { gTrace<<"declaration ";   currentType = -1; }

varList : IDENTIFIER                { builder.addSymbol($1, getType(currentType)); }
        | varList  ',' IDENTIFIER   { builder.addSymbol($3, getType(currentType)); }
        ;

datatype:   INT
        |   FLOAT
        |   CHAR
        ;

%%

Команда

% bison p.yacc
%

Я думаю, вам нужно будет предоставить больше информации.

Полный файл yacc и параметры, которые вы передаете в yacc / bison

Редактировать

Я попробовал ваш файл (согласнокомментарий) Я все еще не получаю ошибок или предупреждений:

> yacc --version
bison (GNU Bison) 2.3
Written by Robert Corbett and Richard Stallman.

Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1 голос
/ 24 декабря 2011

Я исправил проблему, как показано ниже:

declaration: datatype varList ';' { gTrace<<"declaration "; currentType = -1; }

varList: IDENTIFIER { builder.addSymbol($1, getType(currentType)); }
    | varList',' IDENTIFIER { builder.addSymbol($3, getType(currentType)); }
    ;

datatype: INTEGER   { gTrace<<"int "; $$ = currentType = Type::IntegerTy; }
    | FLOAT     { gTrace<<"float "; $$ = currentType = Type::FloatTy; }
    | VOID      { gTrace<<"void "; $$ = currentType = Type::VoidTy; }
    ;

@ sarnold, надеюсь, это поможет!

0 голосов
/ 22 декабря 2011

То есть вы можете определить блок действий только для каждого правила, поэтому

declaration: datatype { currentType = $1; } varList ';' { gTrace<<"declaration ";   currentType = -1; }

должно быть сделано как

declaration: datatype varList ';' { currentType = $1; gTrace<<"declaration ";   currentType = -1; }

В любом случае, вы устанавливаете currentType на лексическое значение типа данных и на -1 сразу после

...