请教廖神,是不是每一门语言实际上就是一个解释器?
Topic source这么表述有点太直白了,我的意思是:Java 语言实际上就是一个解释器,它的作用是把 Java 代码翻译成类似汇编语言那样的地址、栈结构等;汇编语言也是一个解释器,它再次把自己的代码解释给底层的机器。
如果我们仿照解释器模式,也能写出一个自己的语言,比如这样的自定义语法结构:
整数 a 等于 1;整数 b 等于 2;整数 c 等于 a 加 b;返回 c;
我的解释器如下:
class Explain { int translate(String language) { // 提取出句子 String[] sentences = language.split(";"); // 参数名-> 参数值 对应表 HashMap<String, Integer> args = new HashMap<>(); for (String sentence : sentences) { // 提取出每个句子中的单词 String[] words = sentence.split(" "); if (words.length == 4 && "整数".equals(words[0]) && "等于".equals(words[2])) { // 赋值操作 args.put(words[1], Integer.parseInt(words[3])); } else if (words.length == 6 && "整数".equals(words[0]) && "等于".equals(words[2]) && "加".equals(words[4])) { // 加法操作 args.put(words[1], args.get(words[3]) + args.get(words[5])); } else if (words.length == 2 && "返回".equals(words[0])) { // 获取返回值 return args.get(words[1]); } } return -1; }}
这个解释器很粗糙,但有了它,我们在客户端就可以用它来解释两个数的加法了:
String myLanguage = "整数 a 等于 1;整数 b 等于 2;整数 c 等于 a 加 b;返回 c;";int result = new Explain().translate(myLanguage);// 输出结果为 3System.out.println(result);
在这个例子中,只要我们把 Explain 类和调用它的代码都封装起来,只让客户编写 就相当于一门自己的语言了。虽然这门语言现在还很简陋,只能实现两个整数的加法。但 Explain 类实现了把我们自己的语法解释成 Java 语言的功能。
想请问廖神,这样属于解释器模式吗?
这个评论ye代码格式化太难搞了....再贴一份
String myLanguage = "整数 a 等于 1;整数 b 等于 2;整数 c 等于 a 加 b;返回 c;";int result = new Explain().translate(myLanguage);// 输出结果为 3System.out.println(result);
class Explain { int translate(String language) { // 提取出句子 String[] sentences = language.split(";"); // 参数名-> 参数值 对应表 HashMap<String, Integer> args = new HashMap<>(); for (String sentence : sentences) { // 提取出每个句子中的单词 String[] words = sentence.split(" "); if (words.length == 4 && "整数".equals(words[0]) && "等于".equals(words[2])) { // 赋值操作 args.put(words[1], Integer.parseInt(words[3])); } else if (words.length == 6 && "整数".equals(words[0]) && "等于".equals(words[2]) && "加".equals(words[4])) { // 加法操作 args.put(words[1], args.get(words[3]) + args.get(words[5])); } else if (words.length == 2 && "返回".equals(words[0])) { // 获取返回值 return args.get(words[1]); } } return -1; }}
- 1
发愤图强的大悟
看了很多解释器模式的文章,还是没有看懂解释器模式...
我理解的解释器模式是对语法的解释。比如在 Java 中,"int a = 1;" 这样一句代码,运行时就会给 JVM 解释,int 表示整数、a 是一个变量名,它的初始值是 1,这样理解对吗?(我知道实际上是 class 文件的逐行解释,忽略编译成 class 文件过程)
也就是说,是不是每一门语言实际上就是一个解释器?