【发布时间】:2021-03-25 11:54:16
【问题描述】:
我目前正在研究一种语言解释器,更具体地说,是研究该语言的数据模型,我的数据模型应该能够理解表达式并解释它们,例如:“cos(a + 4)”应该被解释为变量 a 中的值的余弦加 4,我将保留这个示例来解释我的工作原理。
我选择将表达式解释分解为多个步骤:
- 从表达式创建令牌列表,例如:
cos(a + 4)变为[ "cos", "(", "a", "+", "4" ] - 将数学运算符转换为函数,例如:
[ "cos", "(", "a", "+", "4" ]变为[ "cos", "(", "sum", "(", "a", ",", "4", ")" , ")" ] - 使用以下规则从此标记列表创建解析树:如果打开括号,则向下,如果关闭括号,则向上,如果逗号,则向右,否则将当前标记写入当前节点,例如:
[ "cos", "(", "sum", "(", "a", ",", "4", ")", ")" ]变成了这棵树:
cos
\
sum
/ \
a 4
- 使用解释树的递归函数
一切正常,但我希望我的代码能够得到很好的测试,我想知道我应该如何分离程序的类。
现在我将这个逻辑分为 2 个类,一个解析器执行前 3 个步骤,一个解释器执行最后一个步骤。
我是否应该将我的解析器分解为一个分词器、一个 operatorConverter 和一个 treeBuilder,以便将每个功能很好地分开并独立测试每个类,而不是让一个具有 3 个独立函数的解析器类作为解析器进行测试?
【问题讨论】:
标签: c++ unit-testing