c++ - 为文件格式编写解释器(C++ Arduino)
问题描述
所以我有一个要解释的 .txt 文件(Excellon)。
示例文件:
M48
FMAT,2
ICI,OFF
METRIC,TZ,000.000
T1C1.016
%
G90
M71
T1
X36551Y-569519
X17780Y-589280
当我扫描文件时,我将语句(例如 METRIC)分开并将其保存在一个字符串中。在此之后,我想根据这个字符串的值执行代码。
在语句检测上执行命令的最佳实践是什么。
if(String == "METRIC")
{
execute code;
}
else if (String == "M48")
{
execute code;
}
etc.
或者是这样的:
switch(String)
{
case: "M48"
execute code;
break;
case: "METRIC"
execute code;
break;
etc.
}
或者这两种方法都是错误的,我应该使用不同的方法吗?
我发现了这个:Switch or if statements in writing an interpreter in java they are talking about using a map 我也应该试试这个吗?如果是这样,您能否提供一个简单的示例,因为我不太了解这种方法。
解决方案
正确的答案将取决于许多因素,但阅读您的文章的字里行间,我 98% 确定您想要的是一个简单的枚举标记器:
enum class Token {
AAA,
BBB,
CCC
};
// Trivially implementable as a if() {} else if {} sequence,
// or as a trie search if you want to get fancy.
Token token_from_string(const std::string& str);
// and in the code.
Token tok = token_from_string(String);
switch(tok) {
case Token::AAA:
break;
case Token::BBB:
break;
case Token::CCC:
break;
}
然后,一个好的做法是在字符串从流中出来后立即对其进行标记,然后对标记本身进行操作。
推荐阅读
- python - Python 子类未正确继承 cython 基类方法
- python - django表单下拉字段中的占位符
- amazon-web-services - 在运行 AWS Athena 查询时,查询显示返回零记录
- android - OSMdroid:如何从本地 sqlite 存档渲染离线地图
- amazon-web-services - Amazon Route 53 别名记录/区域文件不起作用 - 外部域注册商
- java - Java 流将字符串拆分并收集到 Map
- python - 从 MYSQL 中提取日期之间的数据到 pandas
- java - @SQLResultSetMapping 列未找到问题
- python - 附加到仅引用一个键的 dict 值内的列表
- javascript - 如何使背景轮播图片变小