【问题标题】:GNU Bison outputting error "syntax error, unexpected string, expecting ="GNU Bison 输出错误“语法错误,意外字符串,期待 =”
【发布时间】:2018-12-18 16:07:09
【问题描述】:

我一直在尝试编译我的 Bison 代码,但我的代码似乎有问题,但我就是不知道为什么或在哪里。

这是我的野牛代码,我在 OSX 上运行 GNU Bison 2.3。 我收到的错误是:

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;
}

我的代码基于我的教授给我的一个程序,如下所示。当我尝试自己编译它时,我遇到了完全相同的问题。是不是我系统的bison版本有问题?

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

【问题讨论】:

  • 指出错误在哪一行总是好的,因为野牛会告诉你(甚至告诉你哪一列的位置)。
  • @rici romans.y:9.9-21:语法错误,意外字符串,期待 =

标签: parsing compiler-construction bison flex-lexer


【解决方案1】:

您应该更新您的野牛版本。 OS X 上默认出现的那个是古老的并且缺乏许多功能。

在那个版本(但不是 2.4 或更高版本)中,%output 指令的语法有一个等号:

%output="roman.tab.c"

您可以进行该更改,但您的文件将无法在您的另一台计算机或其他任何人的计算机(例如您学校的计算机)上运行。您也可以在运行bison 命令时设置输出文件名:

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

这避免了对 %output 指令的需要,并且适用于所有版本的野牛。

但总的来说,升级可能是您的最佳选择。

【讨论】:

    【解决方案2】:

    请注意,在 macOS 上更新 Bison 可能会很棘手。 Xcode 工具链中的默认系统 Bison (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/bison) 自 10.14 Mojave 起为 2.3,正如 @rici 解释的那样,它不支持 %output "brackets.c" 语法(它需要 %output="roman.tab.c",因此 = 参考错误消息)。

    为了以同时在您的路径和编译器路径中的方式更新 Bison,您需要在通过 Homebrew 安装它之后强制对其进行符号链接(Homebrew 需要 Java 8 才能安装 Bison):

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-12
      • 2019-12-06
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      相关资源
      最近更新 更多