使用flex和bison做一个简单的计算器

问题描述 投票:0回答:1

我正在尝试使用flex和bison生成器制作一个非常简单的计算器。它仅适用于整数。我正确编译了lexer文件,没有错误;但是当我编译解析器文件时,它显示了一些警告:

  • 警告:1个非终结符在语法上无用
  • 警告:2条规则在语法上无用
  • 21.1-4:警告:语法中无终止符:行
  • 21.9-1:警告:规则在语法中无用:行:NWL
  • 22.9-55:警告:1个非终结符在语法上无用:Exp NWL

显示这些警告后,将生成输出文件。我用gcc编译了输出文件;它制作了一个[[.exe文件。当我运行。exe文件并尝试计算时,它向我显示此错误:

    语法错误
  • 请帮助我。

    我的代码:

    lexer文件

    %option noyywrap %{ #define YYSTYPE double #include <stdio.h> #include "x.tab.h" %} DIG [0-9] %% {DIG}+ { yylval = atoi(yytext); return NUM; } "+" { return PLS; } "-" { return MNS; } "*" { return MUL; } "/" { return DIV; } "\n" { return NWL; } "(" { return LFT; } ")" { return RIT; } %%

    解析器文件

  • ] >>%{ #include <stdio.h> #define YYSTYPE double int yyerror (char const *s); extern int yylex (void); %} %token PLS MNS %token MUL DIV %token NWL %token NUM %token LFT RIT %left PLS MNS %left MUL DIV %% Exp: NUM { $$ = $1; }; Exp: Exp PLS Exp { $$ = $1 + $3; }; Exp: Exp MNS Exp { $$ = $1 - $3; }; Exp: Exp MUL Exp { $$ = $1 * $3; }; Exp: Exp DIV Exp { $$ = $1 / $3; }; Exp: LFT Exp RIT { $$ = $2; }; Line: NWL; Line: Exp NWL { printf("%f\n", $1); }; ; %% int yyerror(char const *s) { printf("%s\n", s); } int main(){ int ret = yyparse(); if (ret){ fprintf(stderr, "%d error found.\n",ret); } return 0; }
    我正在尝试使用flex和bison生成器制作一个非常简单的计算器。它仅适用于整数。我正确编译了lexer文件,没有错误;但是当我编译解析器文件时,它是...
    c parsing bison flex-lexer yacc
    1个回答
    0
    投票
    语法的起始符号是Exp,而不是Line。要么先放置Line规则,要么使用%start Line声明。那应该使您处在程序可以处理第一行的位置,例如3 + 4;-)
    © www.soinside.com 2019 - 2024. All rights reserved.