【问题标题】:Return Set for a Command Parser命令解析器的返回集
【发布时间】:2012-09-11 13:16:35
【问题描述】:

我需要编写一个解析器来解析命令。 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")

这是一个好方法吗?这个问题的标准方法是什么?我应该派人代替吗?

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

【问题讨论】:

    标签: c++ parsing command


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我认为返回 AST 的解析器比实现基于事件的解析器发出 boost::signals 更好。这是因为每次创建解析器实例时,我都需要为解析器添加所有侦听器。你同意吗?
    • 不太熟悉 Boost,但通常使用解析器操作代码构建 AST 通常比使用它立即执行操作更好,除非您正在解析一种非常简单的语言。
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多