📄 calcparser.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 + -