当前位置: 首页 > news >正文

0300-Nand-表示代码

环境

  • Time 2023-07-09
  • Java 17

前言

说明

参考:

  • https://craftinginterpreters.com/contents.html
  • https://github.com/GuoYaxiang/craftinginterpreters_zh
  • https://space.bilibili.com/44550904

目标

使用 Java 语言脚本来自动生成代码树。

GenerateAst


import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;public class GenerateAst {public static void main(String[] args) throws IOException {// 根据实际情况,修改成对应的代码路径// String outputDir = "C:\\workspace\\demo\\src\\main\\java\\com\\example\\lox";defineAst(outputDir, "Expr", Arrays.asList("Binary   : Expr left, Token operator, Expr right","Grouping : Expr expression","Literal  : Object value","Unary    : Token operator, Expr right"));}private static void defineAst(String outputDir, String baseName, List<String> types)throws IOException {String path = outputDir + "/" + baseName + ".java";PrintWriter writer = new PrintWriter(path, StandardCharsets.UTF_8);writer.println("package com.example.lox;");writer.println();writer.println("import java.util.List;");writer.println();writer.println("abstract class " + baseName + " {");defineVisitor(writer, baseName, types);for (String type : types) {String className = type.split(":")[0].trim();String fields = type.split(":")[1].trim();defineType(writer, baseName, className, fields);}// The base accept() method.writer.println();writer.println("  abstract <R> R accept(Visitor<R> visitor);");writer.println("}");writer.close();}private static void defineVisitor(PrintWriter writer, String baseName, List<String> types) {writer.println("  interface Visitor<R> {");for (String type : types) {String typeName = type.split(":")[0].trim();writer.println("    R visit" + typeName + baseName + "(" +typeName + " " + baseName.toLowerCase() + ");");}writer.println("  }");}private static void defineType(PrintWriter writer, String baseName,String className, String fieldList) {writer.println("  static class " + className + " extends " +baseName + " {");// Constructor.writer.println("    " + className + "(" + fieldList + ") {");// Store parameters in fields.String[] fields = fieldList.split(", ");for (String field : fields) {String name = field.split(" ")[1];writer.println("      this." + name + " = " + name + ";");}writer.println("    }");// Visitor pattern.writer.println();writer.println("    @Override");writer.println("    <R> R accept(Visitor<R> visitor) {");writer.println("      return visitor.visit" +className + baseName + "(this);");writer.println("    }");// Fields.writer.println();for (String field : fields) {writer.println("    final " + field + ";");}writer.println("  }");}
}

Expr

package com.example.lox;abstract class Expr {abstract <R> R accept(Visitor<R> visitor);interface Visitor<R> {R visitBinaryExpr(Binary expr);R visitGroupingExpr(Grouping expr);R visitLiteralExpr(Literal expr);R visitUnaryExpr(Unary expr);}static class Binary extends Expr {final Expr left;final Token operator;final Expr right;Binary(Expr left, Token operator, Expr right) {this.left = left;this.operator = operator;this.right = right;}@Override<R> R accept(Visitor<R> visitor) {return visitor.visitBinaryExpr(this);}}static class Grouping extends Expr {final Expr expression;Grouping(Expr expression) {this.expression = expression;}@Override<R> R accept(Visitor<R> visitor) {return visitor.visitGroupingExpr(this);}}static class Literal extends Expr {final Object value;Literal(Object value) {this.value = value;}@Override<R> R accept(Visitor<R> visitor) {return visitor.visitLiteralExpr(this);}}static class Unary extends Expr {final Token operator;final Expr right;Unary(Token operator, Expr right) {this.operator = operator;this.right = right;}@Override<R> R accept(Visitor<R> visitor) {return visitor.visitUnaryExpr(this);}}
}

AstPrinter

package com.example.lox;class AstPrinter implements Expr.Visitor<String> {public static void main(String[] args) {Expr expression = new Expr.Binary(new Expr.Unary(new Token(TokenType.MINUS, "-", null, 1),new Expr.Literal(123)),new Token(TokenType.STAR, "*", null, 1),new Expr.Grouping(new Expr.Literal(45.67)));System.out.println(new AstPrinter().print(expression));}String print(Expr expr) {return expr.accept(this);}@Overridepublic String visitBinaryExpr(Expr.Binary expr) {return parenthesize(expr.operator.lexeme,expr.left, expr.right);}@Overridepublic String visitGroupingExpr(Expr.Grouping expr) {return parenthesize("group", expr.expression);}@Overridepublic String visitLiteralExpr(Expr.Literal expr) {if (expr.value == null) return "nil";return expr.value.toString();}@Overridepublic String visitUnaryExpr(Expr.Unary expr) {return parenthesize(expr.operator.lexeme, expr.right);}private String parenthesize(String name, Expr... exprs) {StringBuilder builder = new StringBuilder();builder.append("(").append(name);for (Expr expr : exprs) {builder.append(" ");builder.append(expr.accept(this));}builder.append(")");return builder.toString();}
}

总结

实现了一个代码生成器,验证了代码生成器的功能。

附录

http://www.jsqmd.com/news/26785/

相关文章:

  • Python逻辑运算 _ 今年过节能收礼吗
  • ENGG5301 Information Theory 2025 Midterm Exam P3:Causal Encoding
  • 0291-Nand-实现基础逻辑门(一)
  • NASM下载和安装教程(附安装包)
  • 0292-Nand-实现基础逻辑门(二)
  • 单点登录SSO是怎么实现的?
  • 赋能智慧货运:视频汇聚平台EasyCVR打造货运汽车安全互联网视频监控与管理方案
  • 2025年上海房产继承律师权威推荐榜单:继承律师/离婚律师/婚姻律师事务所精选
  • 【SPIE出版、往届已EI检索】第二届遥感技术与图像处理国际学术会议(RSTIP 2025)
  • autotiny下载_v3.0.0.2
  • 2025 年井盖篦子最新推荐榜,技术实力与市场口碑深度解析铸铁套/树围/球墨铸铁单/溢流井/雨水井盖篦子公司推荐
  • Python嵌套_多条件判断 _ 对象今天会生气吗 II
  • 解析视频融合平台EasyCVR的分析平台技术如何成为“全域视频管理中台”
  • flink-连mongo db
  • uni-app x联系我们,地图显示,拨打电话
  • 统计接口耗时的6种常见方法
  • CSP近五年总结及2025预测及经验总结
  • 2025年线上英语培训机构权威推荐榜单:成人英语培训/英语口语教育/英语外教一对一源头机构精选
  • 常用脚本文件
  • 深入解析:GitPuk入门教程:安装及使用指南,一文轻松上手
  • 一种从未想过的网络流限制方式
  • 介绍一个我新开的仓库 `VictoriaLogs_AVX2`: 在官方 VictoriaLogs 的基础上打补丁来实现 avx2 指令集优化
  • 2025年叠元宝机器厂家权威推荐榜单:自动元宝机/金银元宝机 /全自动元宝机源头厂家精选
  • 完整教程:Linux启动流程与字符设备驱动详解 - 从bootloader到驱动开发
  • 学术会议会议合集 | 电子信息工程、计算机技术、文学、人文发展、数字经济等EI会议合集
  • 推出其新一代高性能Sub-GHz射频收发芯片-DP4330A
  • 基于mediapipe深度学习和限定半径最近邻分类树算法的人体摔倒检测系统python源码
  • Python条件语句 _ 对象今天会生气吗
  • Ai元人文:自主构建更丰富多彩
  • 2025 年弯管机生产厂家最新推荐榜,技术实力与市场口碑深度解析且高性能与可靠性兼具四轴/双轴/双层膜弯管机公司推荐