GNU Bison: ошибка вывода "синтаксическая ошибка, неожиданная строка, ожидание =" - PullRequest
0 голосов
/ 18 декабря 2018

Я пытался скомпилировать свой код Bison, и, похоже, что-то не так с моим кодом, и все же я просто не могу понять, почему или где.

Вот мой код Bison,Я использую GNU Bison 2.3 на OSX.Я получаю сообщение об ошибке:

romans.y: 9.9-21: синтаксическая ошибка, неожиданная строка, ожидание =

Это ошибка, которой я не являюсьполучать на моей машине с Linux, но на машине с OSX

%{
// file created via echo
#  include <stdio.h>
#  include <stdlib.h>
int yyerror(char *s);
int yylex();
int yyparse();
%}
%output "roman.tab.c"
%token ARABIC_NUMERAL;
%token EOL
%%

calclist: /* nothing */ {}
| calclist arabic_numerals EOL { printf("%d\n", $2);  }
;

arabic_numerals: ARABIC_NUMERAL
    | ARABIC_NUMERAL { $$ = $$ + $2; }
    ;  

/* ones:
    |   ONE {$$ = 1;}
    |   ONE ONE {$$ = 2;}
    |   ONE ONE ONE {$$ = 3;}
    ;
fives:
    |   FOUR {$$ = 4;}
    |   FIVE {$$ = 5;}
    |   FIVE ones { $$ = 5 +$2;}
    ;
tens:
    |   TEN {$$ = 10;}
    |   TEN TEN { $$ = 20;}
    |   TEN TEN TEN { $$ = 30;}
    |   TEN fives { $$ = 10 + $2}
    |   NINE { $$ = 9}
    ;
fifties:
    |   FIFTY { $$ = 50;}
    |
    :*/

%% 

void yyerror(char *s)
{
  printf("error: %s\n", s);
  exit(0);
}

int
main()
{
//  yydebug = 1;
  yyparse();
  return 0;
}

Я основал свой код на программе, предоставленной мне моим профессором, которая заключается в следующем.Когда я попытался собрать его сам, у меня возникла та же проблема.Это проблема с версией бизона в моей системе?

%{ 
#  include <stdio.h>
#  include <stdlib.h>
void yyerror(char *s);
int yylex();
int yyparse();
%}
%output "brackets.c"

%token OP CP N EOL
%%

calclist: /* nothing */ {}
| calclist expr EOL { printf("Input conforms to grammar\n");  }
;

//expr: N N N { }
//;

expr: OP expr CP 
 | N
 ;
%%
void yyerror(char *s)
{
  printf("error: %s\n", s);
}


int
main()
{
//  yydebug = 1;
  yyparse();
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Обратите внимание, что обновление Bison на macOS может быть сложным.Системный Bison по умолчанию в инструментальной цепочке XCode (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/bison) равен 2,3 по состоянию на 10,14 Mojave, который, как объяснил @rici, не поддерживает синтаксис %output "brackets.c" (он ожидает %output="roman.tab.c", таким образом, ссылка = всообщение об ошибке).

Чтобы обновить Bison таким образом, чтобы он находился как в вашем пути, так и в пути вашего компилятора, вам необходимо принудительно вставить символическую ссылку после его установки через Homebrew (Homebrew требует Java 8 специально взаказ на установку бизона):

brew cask install homebrew/cask-versions/adoptopenjdk8 # Homebrew Bison requires Java8
brew install bazel bison flex

# So that the system can find the new brew Bison instead of the old system Bison.
brew link bison --force
echo 'export PATH="/usr/local/opt/bison/bin:$PATH"' >> ~/.bash_profile
export LDFLAGS="-L/usr/local/opt/bison/lib"
0 голосов
/ 18 декабря 2018

Вам следует обновить версию бизона.Тот, который поставляется по умолчанию в OS X, является древним и лишен многих функций.

В этой версии (но не в версии 2.4 или более поздней) синтаксис директивы %output имел знак равенства:

%output="roman.tab.c"

Вы можете внести это изменение, но тогда ваш файл не будет работать на вашем другом компьютере или на чьем-либо другом компьютере, например, в вашей школе.Вы также можете установить имя выходного файла при запуске команды bison:

bison -d -o roman.tab.c roman.y

, которая устраняет необходимость в директиве %output и будет работать на всех версиях зубров.

Но в целом, обновление, вероятно, ваш лучший вариант.

...