命令分析器的返回集

Return Set for a Command Parser

本文关键字:返回 分析器 命令      更新时间:2023-10-16

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

这是一个好方法吗?解决这个问题的标准方法是什么?我应该改派吗?

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

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

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