讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现简单的词法分析器_C++字符串处理实现简单公式解析【算法】

胖涛同学_6519

胖涛同学_6519

发布时间:2026-02-13 09:58:03

|

527人浏览过

|

来源于php中文网

原创

最省事办法是先用std::replace将运算符前后补空格,再用std::stringstream按空格分割token,对每个token用std::stod尝试转数字,失败则视为运算符(捕获std::invalid_argument)。

c++如何实现简单的词法分析器_c++字符串处理实现简单公式解析【算法】

怎么用 std::string 和 std::stringstream 拆出加减乘除和数字

直接切分公式字符串最省事的办法,不是手写状态机,而是靠空格分隔 + 类型试探。但前提是公式里**必须有空格**,比如 "3 + 4 * 2" 可以,"3+4*2" 就会整个被当做一个 token 处理失败。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 先用 std::replace 把所有运算符前后补上空格:"+" → " + ",再用 std::stringstream 按空格读取
  • 每个 token 用 std::stod 尝试转数字;失败就当作运算符处理(注意捕获 std::invalid_argument)
  • 别依赖 operator>> 直接读 double,它遇到 "+" 会静默失败并置 failbit,后续读取全乱

为什么手写字符扫描比正则更靠谱(尤其在 C++11/14 下)

C++ 标准库的 std::regex 在旧编译器上性能差、匹配行为不一致,甚至某些版本对空匹配处理异常——你写好一个 R"(\d+|\+|\-|\*|\/)",在 GCC 4.8 和 Clang 3.5 上结果可能不同。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 从头遍历 std::string::const_iterator,用 std::isdigit 判数字,用 switch 判运算符
  • 数字要连续读:遇到 '1' 后继续看下一个是不是数字,直到非数字为止,再用 std::stod 转整段
  • 跳过空白用 std::isspace,别只判断 ' ',否则制表符或换行会让解析中断

std::vector<:any></:any> 或 std::variant<double char></double> 存 token 哪个更稳

用 std::any 看似灵活,但运行时类型检查开销大,且提取值时必须用 std::any_cast,一旦类型错就抛异常;而 std::variant 编译期约束强,配合 std::visit 安全又清晰——但要求 C++17。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 如果项目锁死 C++11/14,老实用两个平行容器:std::vector<double> numbers</double> 和 std::vector<char> ops</char>,靠索引对齐
  • 若可用 C++17,优先选 std::variant<double char></double>,定义 token 类型:using Token = std::variant<double char></double>
  • 避免把括号也塞进同一 std::variant——它和运算符语义不同,后期做语法分析时容易混淆

遇到负号 "-5" 和减号 "3 - 5" 怎么区分

这是最常翻车的地方:单靠字符没法判断,必须结合上下文。开头的 '-' 或左邻是运算符/括号的 '-' 是负号;左邻是数字或右括号的才是减号。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 扫描时记前一个 token 类型:如果是 double、')' 或未开始(即位置 0),当前 '-' 是减号;否则是负号
  • 负号要和后面数字合并成一个 token,比如 "-5" 解析为 -5.0,而不是两个 token:'-' 和 5
  • 别在词法层尝试处理 "--5" 或 "+-3",这些属于语法错误,留给后续阶段报错

词法分析真正的难点不在拆字符,而在边界条件:空输入、连续运算符、科学计数法("1e-3")、十六进制前缀("0xFF")——这些不提前约定规则,光靠“简单”俩字撑不住。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6939

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6224

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3224

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1852

2025.10.17

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1437

2024.03.13

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

14606

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1725

2023.09.14

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn