红色的框框代表一棵树,而绿色和黄色框框则表示该树的两棵子树,当然 5 * 4 当然也可以框起来作为绿色框的子树。
这个时候,聪明的小伙伴们看到这些树有没有什么发现,比如每棵树表示什么?
1)规则定义我们可以发现每棵树似乎都表示着一个算数运算
转换需要建立在一定的规则基础上
我们需要先定义下规则,如果遇到一个运算,我们就以 BinaryExpression 来表示,而 运算 中的结构自然就包含着 字符 和 运算符 ,比如 5 * 4 这是一个运算,我们将整体标识为一个 BinaryExpression。
而这个运算中存在三个元素,分别是:5, 4, *。那么其中 5 和 4 我们就可以称之为 字符, *可以称之为 运算符。由此我们可以再定一个规则,字符 的类型我们可以用 Identifier 来标识,运算符 的类型我们就以 operator 来表示。
到这步我们就已经简单地定义好了一个 规则,接下来我们要做的事情就是利用我们的规则将上述树形结构扁平化
2)小试牛刀我们先拿上述例子来做操作,首先这是一个表达式,我们利用 BinaryExpression 进行标识
BinaryExpression
type: BinaryExpression
从运算中我们 以运算符 可以拆分为左右两部分,也就是 5 和 4,我们继续进行标识
left: Identifier
type: Identifier
value: 5
right: Identifier
type: Identifier
valuer: 4
定义好两部分后我们该如何将两部分链接起来呢?那就得用到我们的运算符了 *,我们先利用规则定义好运算符的表示
operator: *
然后将两部分链接起来
BinaryExpression
type: BinaryExpression
left: Identifier
type: Identifier
value: 5
operator: *
right: Identifier
type: Identifier
valuer: 4
3)成品展示
很好,到这里我们就完成了第一块里程碑了!
4)趁热打铁上面我们才完成了一小部分的规则转换定义,接下来我们继续将树形结构进行转换:
到这里我们已经从树形结构图转到了我们定义的层级结构了,但我们可以发现,以上的层级结构图依然是不够完整的
目前为止我们才定义了上述表达式中左边的部分,还缺少右边的定义,这个时候就需要大家来帮个忙, 帮我补充一下右边的部分,结构体已经在下述文本中贴出,大家可以复制到自己的文本编辑器中进行填空补充,将__ 内容替换补充即可
right: __
type: __
left: __
type: __
value: __
operator: __
right: __
type: __
value: __
接下来就到了公布答案的环节了!
right: BinaryExpression
type: BinaryExpression
left: Identifier
type: Identifier
value: 3
operator: *
right: Identifire
type: Identifier
value: 6
大家可以进行比对下答案是否正确,然后我们将两部分内容进行组装