diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f28b7ce225b9762ff859901f821377817d8d9423..0c6a6d9aa65272656282d7f0f42e19d40aa25fd3 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -22,11 +22,13 @@ + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index b54dff9b404186f081940ae09bb10d03e5f11164..9265d3bb2190c89d7e989a41ec3f29fbf8bb579f 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -15,6 +15,8 @@ + + diff --git a/.idea/misc.xml b/.idea/misc.xml index d093d144b979299946e94b04b6da5f953a065759..e471b02ee6886ff64384dec4bc0f78edecb861f7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -21,6 +21,7 @@ diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b63946d5b31084bbb7dda418ceb3d75eb686373 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 70b05fcf5aeada9cb3c66ff26b8c98cf9a720d6f..a8f22d0dd7daf2012c845327da3359de412d535f 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,36 @@ value ::= integer * 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。上例中的 plus , minus 都是非终结符表达式 * 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。 * 客户端(Client):主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。 +## 总结 优缺点呢 +**1) 解释器优点** +- 易于改变和扩展文法 + + 因为在解释器模式中使用类来表示语言的文法规则的,因此就可以通过继承等机制改变或者扩展文法.每一个文法规则都可以表示为一个类,因此我们可以快速的实现一个迷你的语言 + +- 实现文法比较容易 + + 在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂 + +- 增加新的解释表达式比较方便 + + 如果用户需要增加新的解释表达式,只需要对应增加一个新的表达式类就可以了.原有的表达式类不需要修改,符合开闭原则 + +**2) 解释器缺点** + +- 对于复杂文法难以维护 + + 在解释器中一条规则至少要定义一个类,因此一个语言中如果有太多的文法规则,就会使类的个数急剧增加,当值系统的维护难以管理. + +- 执行效率低 + + 在解释器模式中大量的使用了循环和递归调用,所有复杂的句子执行起来,整个过程也是非常的繁琐 + +**3) 使用场景** + +- 当语言的文法比较简单,并且执行效率不是关键问题. +- 当问题重复出现,且可以用一种简单的语言来进行表达 +- 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象的语法树的时候 1. 使用 Readme.md 来支持不同的语言, Readme\_en.md: 支持英文, Readme\_zh.md: 支持中文 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) diff --git a/byv-interpreter-patttern-21/.gitignore b/byv-interpreter-patttern-21/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5ff6309b7199129c1afe4f4ec1906e640bec48c6 --- /dev/null +++ b/byv-interpreter-patttern-21/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/byv-interpreter-patttern-21/pom.xml b/byv-interpreter-patttern-21/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..250c0300f613faf090f1bf8dfeb067053eafcfc3 --- /dev/null +++ b/byv-interpreter-patttern-21/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.example + byv-interpreter-patttern-21 + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + org.projectlombok + lombok + 1.18.28 + compile + + + org.dom4j + dom4j + 2.1.3 + + + jaxen + jaxen + 1.1.6 + + + log4j + log4j + 1.2.12 + + + org.slf4j + slf4j-api + 1.7.36 + + + com.alibaba + fastjson + 1.2.62 + + + junit + junit + 4.12 + compile + + + + + \ No newline at end of file diff --git a/byv-interpreter-patttern-21/src/main/java/com/boyunv/interpreter/example01/Client.java b/byv-interpreter-patttern-21/src/main/java/com/boyunv/interpreter/example01/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..b392009902abb9ddb3d1681a9fc1af74ed347092 --- /dev/null +++ b/byv-interpreter-patttern-21/src/main/java/com/boyunv/interpreter/example01/Client.java @@ -0,0 +1,18 @@ +package com.boyunv.interpreter.example01; +/* + *@description + * + *@author boyunv + *@create 2023/9/10 8:32 + *@version 1.0 + */ + +public class Client { + + public static void main(String[] args) { + ExpressionInterpreter interpreter = new ExpressionInterpreter(); + long result = interpreter.interpreter("9 5 7 3 - + *"); + System.out.println("9 5 7 3 - + * 结果是:"+result); + + } +} diff --git a/byv-interpreter-patttern-21/src/main/java/com/boyunv/interpreter/example01/ExpressionInterpreter.java b/byv-interpreter-patttern-21/src/main/java/com/boyunv/interpreter/example01/ExpressionInterpreter.java new file mode 100644 index 0000000000000000000000000000000000000000..ed3bd8d17233ad7b1b6b0bd30a10dc611a1a4b3f --- /dev/null +++ b/byv-interpreter-patttern-21/src/main/java/com/boyunv/interpreter/example01/ExpressionInterpreter.java @@ -0,0 +1,66 @@ +package com.boyunv.interpreter.example01; +/* + *@description + * 表达式解释器 + *@author boyunv + *@create 2023/9/10 8:12 + *@version 1.0 + */ + +import java.util.Deque; +import java.util.LinkedList; + +public class ExpressionInterpreter { + + //双向队列,可以从队列两端增加或者删除元素 + private Deque numbers=new LinkedList(); + + + //接受表达式进行解析 + public long interpreter(String expression){ + //9 5 7 3 - + * + String[] element = expression.split(" "); + int length=element.length; + //获取表达式中数字 + for(int i=0;i< (length+1)/2;++i){ + //像集合的尾部去添加元素 + numbers.addLast(Long.parseLong(element[i])); + + } + + //获取表达式中符号,去进行计算 + for (int i = (length+1)/2; i numbers=new LinkedList<>(); + public long interpret(String expression){ + String[] elements = expression.split(" "); + int length = elements.length; + for (int i = 0; i < (length+1)/2; ++i) { + numbers.addLast(new NumberExpression(elements[i])); + + } + + for (int i = (length+1)/2; i + + com.boyunv.strategy.example03.MT1101HandlerStrategy + \ No newline at end of file