打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
解释器模式第二篇 形成语法树

语法建模

作为解释器模式的标准做法,定义了语言的语法之后的步骤就是为每种语言要素准备一个类。对于四则运算的例子,其类结构如下:

类图稍微大了一些,下面以几条规则为例进行说明。

1. 泛化关系

示例:[5]PrimaryExpr::=NumericLiteral|ParenthesizedExpr| FunctionCall

式[5]的含义为基本表达式PrimaryExpr可以是数值型字面值NumerLiteral、带括号表达式ParemthesizedExpr、函数调用中的某一种。转化成类关系就是泛化关系。所有适用PrimaryExpr的地方都可以使用NumericLiteral、ParenthesizedExpr、FunctionCall中的一种来代替。

2.组合关系

[2]AdditiveExpr::=MultiplicativeExpr(('+' | '-') MultiplicativeExpr )*

当AdditiveExpr由多个MultiplicativeExpr构成时,二者之间的关系又可以看作是组合关系。

当只有一个MultiplicativeExpr的时候,式[2]可以退化为:

AdditiveExpr::=MultiplicativeExpr

这种情况可以认为二者之间是简单的泛化关系。

3.简单组合关系

[7]ParenthesizedExpr::='(' Expr ')'

式[7]可以看作1对1的简单组合关系。

形成语法树

回头看一下前一篇文章中的表达式:

100.0 * sin(29 + (23 * 6)) + sqrt(cos(34 * 5))

这个表达式转换成语法树如下:

分析过程是沿着类图由上而下进行,直至找到适合的类型为止。例如最初的分析从AdditiveExpr开始,它的下级节点应该是多个MultiplicativeExpr,但是右侧不符合MultiplicativeExpr的条件,因此沿着类图向下搜索直至找到符合条件的FuncitonCall为止。如此周而复始就可以得到整个语法树。


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

有任何疑问,欢迎留言提问或讨论。

向对象设计,面向对象编程,面向对象思考!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
解释器模式第三篇 结构和协作
自定义语言的实现
解释器模式(interpreter)解析例子
第17章 行为型模式
软件设计模式修炼 -- 解释器模式
C#设计模式学习笔记:(23)解释器模式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服