#include<bits/stdc++.h> using namespace std; enum Token_value { NAME, NUMBER, END, PLUS = '+', MINUS = '-', MUL = '', DIV = '/', PRINT = ';', ASSIGN = '=', LP = '(', RP = ')' }; Token_value get_token(); double error(const string& s); double expr(bool get); double term(bool get); double prim(bool get); Token_value curr_tok = PRINT; double number_value; string string_value; map<string, double> table; int no_of_errors; int main() { table["pi"] = 3.1415926535897932385; table["e"] = 2.7182818284590452354; while (cin) { get_token(); if (curr_tok == END) break;// if (curr_tok == PRINT) continue;// cout << expr(false) << "\n"; } return no_of_errors; } Token_value get_token() { char ch = 0; // cin >> ch; do{ if(!cin.get(ch)) return curr_tok = END; }while (ch!='\n' && isspace(ch)); switch(ch){ case ':': case '\n': return curr_tok = PRINT; } 中各函数的作用
时间: 2024-04-28 19:20:35 浏览: 90
这段代码是一个简单的解释器,可以解析一些简单的数学表达式,如加减乘除等。下面是各个函数的作用:
- `Token_value get_token()`: 该函数用于获取下一个 token(即表达式中的一个基本单元),并更新全局变量 `curr_tok`。具体的 token 类型有 `NAME`(变量名)、`NUMBER`(数字)、`END`(结束符)、`PLUS`(加号)、`MINUS`(减号)、`MUL`(乘号)、`DIV`(除号)、`PRINT`(分号)、`ASSIGN`(赋值符号)、`LP`(左括号)和 `RP`(右括号)。
- `double error(const string& s)`: 该函数用于报告一个错误,并返回一个默认值 1.0。
- `double expr(bool get)`: 该函数用于解析一个表达式,将其计算出来并返回结果。如果 `get` 为 `true`,则在解析表达式之前会先获取一个 token。
- `double term(bool get)`: 该函数用于解析一个项,将其计算出来并返回结果。如果 `get` 为 `true`,则在解析项之前会先获取一个 token。
- `double prim(bool get)`: 该函数用于解析一个基本单元,将其计算出来并返回结果。如果 `get` 为 `true`,则在解析基本单元之前会先获取一个 token。
- `int main()`: 该函数是程序的主函数,其中定义了变量表 `table`,并且通过循环不断获取用户输入的表达式并解析计算,直到遇到结束符为止。
- 在 `main()` 函数中,通过调用 `get_token()` 函数获取下一个 token,并根据不同的 token 类型执行不同的操作。如果是结束符,则跳出循环;如果是分号,则继续循环;否则,调用 `expr(false)` 函数计算表达式的值,并输出结果。
总体来说,这段代码的逻辑比较简单,但其中涉及了一些 C++ 的语法和库函数的使用,需要有一定的编程基础才能看懂。
阅读全文