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

时间:2018-10-04 15:50:01

标签: c++ interpreter

所以我有一个要解释的.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他们正在谈论使用地图,我也应该尝试吗?如果可以的话,您可以提供一个简单的示例,因为我不太了解这种方法。

2 个答案:

答案 0 :(得分:0)

正确的答案将取决于许多因素,但是在您的文章两行之间阅读时,我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;
}

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

答案 1 :(得分:0)

  

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

当找到某个字符串时,您想更改控制流。 一个开关说“基于此变量值选择一个命令”。您也可以使用if / else。

  

问:如果可以的话,您可以提供一个简单的示例,因为我不太了解这种方法。

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

这是switch from an EXCELLON to GCODE converter的示例。

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

您还可以从g-code parser开始,然后对其进行修改以处理excellon格式。