尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

0300-Nand-表示代码

0300-Nand-表示代码
📅 发布时间:2026/6/19 15:43:27

环境

  • 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();}
}

总结

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

附录

相关新闻

  • Python逻辑运算 _ 今年过节能收礼吗
  • ENGG5301 Information Theory 2025 Midterm Exam P3:Causal Encoding
  • flink-连mongo db

最新新闻

  • 深度解析macOS滚动事件拦截:构建专业级定制插件的完整指南
  • 常州多年黄金回收攻略,三十年实体经营,收的顶本地口碑有保障 - 奢侈品回收测评
  • 01_系统架构设计
  • 如何免费实现专业级直播抠像:obs-backgroundremoval插件完全指南
  • 新手必看!抖音保存视频到相册的详细步骤技巧 - 工具软件使用方法推荐
  • LaTeX长表格排版进阶:如何用longtable宏包实现跨页表格的精细控制?

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号