Bison Flex C++版计算器实现

本文档介绍如何利用Bison和Flex工具来创建一个C++版的计算器程序。通过解析输入的数学表达式,该计算器可以执行基本的算术运算。详细步骤包括编写解析器(使用Bison)和扫描器(使用Flex),并将它们与C++代码集成以实现计算功能。
摘要由CSDN通过智能技术生成

main.cpp

#include <iostream>
#include "driver.h"
using namespace Marker;
int main(int argc, char const *argv[]) {
  /* code */
  Driver driver;
  driver.parse();
  return 0;
}

driver.h

#ifndef DRIVER_HH
#define DRIVER_HH
#include <iostream>
#include "scanner.h"
#include "parser.hpp"

namespace Marker {
  class Driver {
    friend class Scanner;
    friend class Parser;
  private:
    /* data */
    Parser m_parser;
    Scanner m_scanner;
  public:
    Driver ();
    int parse();
    virtual ~Driver ();
  };
} /*Marker */
#endif
driver.cpp

#ifndef DRIVER_CPP
#define DRIVER_CPP
#include "driver.h"
#include <iostream>
using namespace Marker;
using namespace std;
Driver::Driver():m_scanner(*this),m_parser(m_scanner,*this){

}
Driver::~Driver(){

}
int Driver::parse(){
  m_scanner.switch_streams(cin,cout);
  return m_parser.parse();
}
#endif

scanner.h

/***********************************/
/*对yyFlexLexer进行继承,获得更多的控制
*
***********************************/

#ifndef SCANNER_HH
#define SCANNER_HH
/*重要*/
#if ! defined(yyFlexLexerOnce)
#undef yyFlexLexer
#define yyFlexLexer Marker_FlexLexer  //根据prefix修改
#include <FlexLexer.h>
#endif
/*替换默认的get_next_token定义*/
#undef YY_DECL
#define YY_DECL Marker::Parser::symbol_typ
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您解答这个问题。 FlexBison是一对强大的工具,它们可以帮助我们实现编译器和解释器。在这里,我们将使用它们来实现一个简单的小数计算器。 首先,我们需要编写一个Flex文件,它将识别我们的输入并将其分解为标记。下面是一个示例: ``` %{ #include "y.tab.h" %} %% [0-9]+\.[0-9]+ { yylval.dval = atof(yytext); return NUMBER; } [ \t] ; /* 忽略空格和制表符 */ \n return EOL; . return yytext[0]; %% int yywrap() { return 1; } ``` 在这个文件中,我们定义了一个模式来匹配小数(数字后面跟着一个小数点和另一个数字)。我们还定义了一些规则来处理空格和换行符。 接下来,我们需要编写一个Bison文件来处理这些标记并计算结果。下面是一个示例: ``` %{ #include <stdio.h> %} %token NUMBER %left '+' '-' %left '*' '/' %left UMINUS %% line: /* 空 */ | line exp EOL { printf("%.2f\n", $2); } ; exp: exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec UMINUS { $$ = -$2; } | '(' exp ')' { $$ = $2; } | NUMBER { $$ = $1; } ; %% int main() { yyparse(); return 0; } int yyerror(char *s) { fprintf(stderr, "error: %s\n", s); return 0; } ``` 在这个文件中,我们定义了一些规则来处理各种运算符和括号。我们还定义了一个规则来处理负数。最后,我们定义了一个主函数来解析输入并计算结果。 完成了这两个文件后,我们需要使用一些命令来生成代码并编译它。下面是一个示例: ``` flex calc.l bison -d calc.y gcc lex.yy.c calc.tab.c -o calc ``` 这将生成一个可执行文件,您可以使用它来运行您的小数计算器。例如: ``` $ ./calc 1+2.5*3-4/2 10.50 ``` 希望这可以帮助您开始使用FlexBison实现您自己的编译器或解释器!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值