0300-Nand-表示代码

news/2025/10/31 22:57:43/文章来源:https://www.cnblogs.com/jiangbo4444/p/19177783

环境

  • 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.mzph.cn/news/951038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python逻辑运算 _ 今年过节能收礼吗

Python逻辑运算 _ 今年过节能收礼吗house_work_count = int(input("house_work_count:"))red_envelope_count = int(input("red_envelope_count:"))shopping_count = int(input("shopping_co…

ENGG5301 Information Theory 2025 Midterm Exam P3:Causal Encoding

题目为回忆版,解答是 GPT-5 写的。 考试时 (1) 问就想偏了,考后看到 GPT-5 的答案很气,不等式想不到直接 (1)(2)(3) 连跪,搞的 (4)(5) 问也没做。 从初中就开始烂完的不等式水平又发力了,但这课确实没啥心思去刷教…

0291-Nand-实现基础逻辑门(一)

环境Time 2023-07-06前言 说明 参考:https://www.nand2tetris.org/ 目标 通过最基础的 Nand(与非门)实现 Not、And、Or、Xor、Mux、DMux 几个基础门。 Not /*** Not gate:* out = not in*/ /** Sets out = in Nand …

NASM下载和安装教程(附安装包)

NASM 全称 Netwide Assembler,诞生于 1996 年,是一款面向 x86 与 x86-64 架构的开源汇编语言编译器。NASM 把纯文本的汇编指令翻译成可执行二进制、目标文件或固件镜像,支持 16/32/64 位三种运行模式,输出格式覆盖…

0292-Nand-实现基础逻辑门(二)

环境Time 2023-07-06前言 说明 参考:https://www.nand2tetris.org/ 目标 接上一节,通过基础的逻辑门实现 Not16、And16、Or16、Mux16 四个基础门。 Not16 /*** 16-bit Not:* for i=0..15: out[i] = not in[i]*/ /** …

单点登录SSO是怎么实现的?

单点登录SSO是怎么实现的?1,先解释什么是单点登录:单点登录的英文名叫做:Single Sign On(简称SSO) 2,介绍自己项目中涉及到的单点登录(即使没涉及过,也可以说实现的思路) 3,介绍单点登录的解决方案,以JWT为…

赋能智慧货运:视频汇聚平台EasyCVR打造货运汽车安全互联网视频监控与管理方案

一、背景介绍 随着互联网发展,货运中介平台大量涌现,行业纠纷也随之增多。尽管当前平台APP具备录音和定位功能,但货物交易流程的全方位监控仍无法实现。主流跟踪定位服务大部分聚焦货物轨迹与车辆定位,尚未实现货物…

2025年上海房产继承律师权威推荐榜单:继承律师/离婚律师/婚姻律师事务所精选

本文基于执业经验、专业能力、成功案例及业界口碑等核心维度,为您推荐上海地区房产继承领域的三位优秀律师,为面临遗产规划或继承难题的家庭提供参考。 行业背景与需求分析 近年来,房产继承法律需求呈现持续增长态势…

【SPIE出版、往届已EI检索】第二届遥感技术与图像处理国际学术会议(RSTIP 2025)

#SPIE 出版-ISSN:0277-786X# #高录用稳检索-快至见刊后1个月EI、Scopus检索# 第二届遥感技术与图像处理国际学术会议(RSTIP 2025) 2025 2nd International Conference on Remote Sensing Technology and Image Proce…

autotiny下载_v3.0.0.2

超级自动化软件 释放双手 实现自由by风吹呀儿吹 autotiny_3.0.0.2下载

2025 年井盖篦子最新推荐榜,技术实力与市场口碑深度解析铸铁套/树围/球墨铸铁单/溢流井/雨水井盖篦子公司推荐

引言 为精准筛选井盖篦子领域优质服务商,本次推荐榜由市政工程协会联合建筑材料检测中心共同发起测评,参考《GB/T 23858-2009 检查井盖》最新修订标准,采用 “三维九项” 测评体系。测评从技术维度(材质强度、防腐…

Python嵌套_多条件判断 _ 对象今天会生气吗 II

Python嵌套_多条件判断 _ 对象今天会生气吗 II#BMI = 体重 / (身高 ** 2)user_weight = float(input("请输入您的体重(单位:kg):"))user_height = float(input("请输入您的身高(单位:m):"…

解析视频融合平台EasyCVR的分析平台技术如何成为“全域视频管理中台”

解析视频融合平台EasyCVR的分析平台技术如何成为“全域视频管理中台”在数字化转型浪潮中,企业面临的视频监控挑战已从“看得见”升级为“看得懂、能联动、易管理”。然而,多品牌设备并存、多种视频协议交织、数据与…

flink-连mongo db

1、mongo db 需要创建相关的权限(否则flink任务会跑失败,因为etl设置了相关的属性)

2025年10月logo/VI设计专业公司权威推荐排行榜:探索年最佳设计服务

logo设计行业正随着数字化转型和品牌意识提升而迅猛发展,预计到2025年,全球品牌设计市场规模将增长15%,企业对专业logo设计的需求日益旺盛。本文基于行业数据和用户反馈,整理了logo设计推荐榜前十名公司,为寻求高…

uni-app x联系我们,地图显示,拨打电话

一、概述 上一篇文章,已经实现了商品列表数据,上下拉动,动态加载。 接下来,实现联系我们,地图显示,拨打电话,效果如下:二、联系我们 修改 pages/contact/contact.uvue文件,增加view 完整代码如下:<templa…

统计接口耗时的6种常见方法

前言 今天,我想和大家聊聊一个看似简单、却在实际项目中经常被忽略的话题:统计接口耗时。 有些小伙伴在工作中,可能经常遇到这样的场景:线上接口突然变慢,用户抱怨连连,你却一头雾水,不知道问题出在哪里。 或者…

CSP近五年总结及2025预测及经验总结

CSP-S近五年题目总结,以及CSP2025预测考点近四年算法出现频率(按频率排序,且按每年是否出现统计)动态规划 dp —— \(100\%(\frac{5}{5})\) 贪心 —— \(100\%(\frac{5}{5})\) 搜索 —— \(60\%(\frac{3}{5})\) 图…

2025年线上英语培训机构权威推荐榜单:成人英语培训/英语口语教育/英语外教一对一源头机构精选

随着全球化进程加速和线上教育技术成熟,线上英语培训已成为职场人士、学生及语言学习者提升英语能力的重要途径。本文基于教学体系、师资力量、技术支持和市场口碑等核心维度,为您推荐线上英语培训领域的三家优秀机构…

常用脚本文件

常用脚本文件adb install@echo off mode con cols=108 lines=5adb wait-for-device adb install -r -t -g -d %1installApk.bat 同步系统时间@echo off mode con cols=108 lines=5color f2adb root adb shell adbd123…