⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calcparser.cpp

📁 用于词法分析的词法分析器
💻 CPP
字号:
/*  $Id: CalcParser.cpp,v 1.2 1997/04/20 01:17:54 matt Exp $  CalcParser class.  Implements a simple calculator parser and  evaluator.    (c) Matt Phillips, 1997.  */#include <stdlib.h>#include <math.h>#include "CalcParser.h"CalcParser::CalcParser (istream &input_) :  input (input_), scanner (input), result (0.0){  scanner.getNext ();  result = parseExpr ();  if (!scanner.eof ())    scanner.error ("junk at end of expression");}double CalcParser::parseExpr (){  double acc = parseTerm ();    while (1)  {    if (scanner.have (CalcScanner::SymPlus))      acc += parseTerm ();    else if (scanner.have (CalcScanner::SymMinus))      acc -= parseTerm ();    else      break;  }  return acc;}double CalcParser::parseTerm (){  double acc = parseFactor ();    while (1)  {    if (scanner.have (CalcScanner::SymStar))      acc *= parseFactor ();    else if (scanner.have (CalcScanner::SymSlash))      acc /= parseFactor ();    else if (scanner.have (CalcScanner::SymMod))      acc = fmod (acc, parseFactor ());    else      break;  }  return acc;}double CalcParser::parseFactor (){  double acc = 0.0;  if (scanner.getSymbol () == CalcScanner::SymVariable)  {    acc = getVariableValue (scanner.getText ());    scanner.getNext ();  } else if (scanner.getSymbol () == CalcScanner::SymNumber)  {    acc = getNumberValue (scanner.getText ());    scanner.getNext ();  } else if (scanner.have (CalcScanner::SymLBracket))  {    acc = parseExpr ();    if (!scanner.have (CalcScanner::SymRBracket))    {      scanner.error ("missing ')'");    }  } else  {    scanner.error ("expected a factor, but found '" + scanner.getText () + "'");  }  return acc;}double CalcParser::getVariableValue (const string &variable){  struct Variable  {    char *name;    double value;  };  static Variable variables [] =  {    {"pi", 3.1415927},    {"e",  2.7182818}  };  for (int i = 0; i < sizeof (variables) / sizeof (Variable); i++)  {    if (variables [i].name == variable)      return variables [i].value;  }  scanner.error ("'" + variable + "' is not a defined variable name");  return 0.0;}double CalcParser::getNumberValue (const string &number){  return atof (number.c_str ());}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -