c++ - 命令解析器的返回集

标签 c++ parsing command

我需要编写一个解析器来解析命令。 5 个这样的命令是:

"a=10"
"b=foo"
"c=10,10"
"clear d"
"c push_back 2"

在第一个示例中,set 是命令,a 是对象,10 是值。

你认为解析器应该为上面的每一行返回什么?

这是我的想法:

   "a=10" -> SET (COMMAND_ENUM), INT (VALUE_TYPE), "a", ("10")
   "b=foo" -> SET (COMMAND_ENUM), STRING (VALUE_TYPE), "b", ("foo")

这是一个好方法吗?这个问题的标准方法是什么?我应该 dispatch 吗?

我有一个函数可以检查与对象关联的类型。例如,上面的 aINT 类型,必须分配一个 INT 值,否则解析器应该返回或抛出某种错误.我还有一个转换函数,用于将值从字符串转换为所需的类型。如果无法进行转换,则抛出这些异常。如果解析器试图将值从字符串转换为所需的类型,那么通过 boost::variant 返回它们可能是个好主意。

最佳答案

你需要为你想要识别的命令语言至少想出一个半正式的语法,因为你已经留下了很多非常模糊的东西(例如在 b=foo 你希望 b 是一个变量名,而 foo 是一个字符串文字。你如何区分它们?如果字符序列在赋值的右侧,但如果它在左侧则为文字?或者单个字符代表标识符,但多个字符代表文字?)在 c=10,10 10,10 代表列表还是 vector ?写一个语法至少会迫使你去思考这些事情,它也至少会作为如何编写你的解析器的指南(最多是一些可以自动翻译成你的解析器的东西)。

通过思考语句应该如何表示为抽象语法树 (AST),您走在了正确的轨道上,但您需要后退一步,看看您想要什么具体语法。

关于c++ - 命令解析器的返回集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12491174/

相关文章:

c++ - C++中的常量映射初始化

c++ - fork 与父子通信

c++ - 如何在 C++ 中存储更多 "complex data"(映射、类、结构、指针)?

带有撇号的 Python XPath 解析标记

git - 如何从命令提示符打开 git 配置文件 - git shell?

linux - 如何在 bash 脚本中为命令输出着色?

C++17 std::variant 比动态多态慢吗?

C# 解析无名称的Json文件

java - 简单的 XML 反序列化

bash - 你怎么能一遍又一遍地在 bash 中运行命令直到成功?