1.03 使用Flex将输入的计算表达式识别为token流,然后输入

/*
用于将输入的计算表达式识别为token流,然后输入
*/


/*
前5个匹配模式,使用了双引号,flex将使用引号内的文本而不会将其解释为正则表达式。
*/
%%
"+"         { printf("PLUS\n"); } // 当匹配上了+,将打印PLUS
"-"         { printf("MINUS\n"); }
"*"         { printf("TIMES\n"); }
"/"         { printf("DIVIDE\n"); }
"|"         { printf("ABS\n"); }
[0-9]+      { printf("NUMBER %s\n", yytext); } // yytext变量总是指向本次匹配的输入文本字符串
\n          { printf("NEWLINE\n"); }
[ \t]       {}
.           { printf("Mystery character %s\n", yytext); } // yytext变量总是指向本次匹配的输入文本字符串
%%

源码请参考

在C++中,要处理加法表达式计算结果,我们可以创建一个解析器来解析用户输入字符串,然后通过一系列操作来计算表达式的值。这里我们将使用栈数据结构来辅助计算。首先,我们需要包含必要的头文件,并定义一个函数来处理加法运算: ```cpp #include <iostream> #include <stack> #include <cctype> // 定义一个类来存储数字和操作符 class Token { public: enum Type { NUMBER, PLUS }; explicit Token(char c) : value(c), type(NUMBER) {} Token(int n) : value(n), type(NUMBER) {} char getValue() const { return value; } Type getType() const { return type; } private: union { char value; int number; }; Type type; }; // 解析并计算加法表达式的函数 int calculateExpression(std::string expression) { std::stack<Token> tokens; for (char c : expression) { if (isdigit(c)) { // 处理数字 int num = 0; while (isdigit(c)) { num = num * 10 + (c - '0'); ++c; } tokens.push(Token(num)); } else if (c == '+') { // 处理加号 tokens.push(Token('+')); } } int result = 0; while (!tokens.empty()) { Token current = tokens.top(); tokens.pop(); if (current.getType() == Token::PLUS) { // 处理加法 int next_num = tokens.empty() ? 0 : tokens.top().number; result += next_num; tokens.pop(); // 移除加号 } else { // 处理数字 result += current.number; } } return result; } int main() { std::string input; std::cout << "请输入一个加法表达式(例如: 3+4):" << std::endl; std::getline(std::cin, input); try { int result = calculateExpression(input); std::cout << "计算结果: " << result << std::endl; } catch (...) { std::cerr << "无效的表达式,请输入有效的加法表达式。" << std::endl; } return 0; } ``` 这个程序首先读取用户输入字符串,然后逐字符处理,如果是数字就将其转换为Token类型的数字,遇到加号则推入栈中。最后,我们遍历栈,根据加号进行加法计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值