文件格式的编写解释器(C++ Arduino)

write interpreter for file format (C++ Arduino)

本文关键字:C++ Arduino 解释器 格式 文件      更新时间:2023-10-16

所以我有一个.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或者如果用java编写解释器的语句,他们正在谈论使用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;
}

然后,一个好的做法是在字符串从流中出来后立即对其进行标记化,然后对令牌本身进行操作。

问:在语句检测时执行命令的最佳实践是什么?

您希望在找到特定字符串时更改控制流。 开关显示"根据此变量值选择命令之一"。你也可以使用 if/else。

问:如果是这样,你能提供一个简单的例子,因为我不太了解这种方法。

Excellon文件格式与CNC g代码相差不远。

这是从赛隆切换到GCODE转换器的示例。

诀窍是修改输出方法 generateFile,不使用 fprint 生成 G 代码文件,而是调用您的命令(可能是移动、提升、等待等(。

您也可以从g代码解析器开始,并对其进行修改以处理excellon格式。