将 Antlr 语法树转换为有用的对象

2024-02-10

我目前正在考虑如何最好地获取使用 Antlr 生成的 AST,并将其转换为可以在我的程序中使用的有用对象。

我语法的目的(除了学习之外)是创建一种可执行(运行时解释)语言。

例如,我将如何获取属性子树并实例化特定的属性类。例如。

以下代码用我的语言表示:

Print(message:"Hello stackoverflow")

将产生以下 AST:

我目前的想法是工厂类可以读取树,提取名称(message),然后输入(STRING) 价值(”Hello stackoverflow现在,知道了类型,我可以实例化正确的类(例如 StringAttribute 类)并传入所需的属性数据 -name and value.

相同的方法可用于定义工厂,提取定义名称(Print),实例化Print类,然后传入属性工厂生成的属性。

对于更复杂的程序,事情确实会变得更复杂:

Program(args:[1,2,3,4,5])
{
    If(isTrue:IsInArray(array:{Program.args} value:5))
    {
        Then {
            Print(message:"5 is in the array")
        } Else {
            Print(message:"More complex " + "message")
        }
    }
}

非常欢迎任何/所有帮助或想法。非常感谢。

我之前提出的相关问题(可能有用):

  1. 我如何制作一棵树 解析器 https://stackoverflow.com/questions/2061166/how-do-i-make-a-treeparser-in-antrl3/2061277#2061277
  2. 解决LL递归问题 https://stackoverflow.com/questions/2113703/antlr-left-recursive-problem/2117334#2117334
  3. Antrl3条件树重写 https://stackoverflow.com/questions/2129569/antrl3-conditional-tree-rewrites/2136770#2136770

我建议阅读第9章,培养高水平口译员, from 语言实现模式 http://www.pragprog.com/titles/tpdsl/language-implementation-patterns作者:特伦斯·帕尔

EDIT

好的,为了让您度过等待那本书的时间,您(至少)需要以下内容:

  • 全局内存空间;
  • 函数空间(每个函数空间还将有一个(本地)内存空间);

以及脑海中浮现的课程(在UML-ish style):

  • class Interpreter
    • 全局:内存空间
    • 函数:堆栈
    • ...

  • class MemorySpace
    • 变量:Map
    • ...

  • class Function
    • local:内存空间
    • 执行():无效
    • ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Antlr 语法树转换为有用的对象 的相关文章

  • Java:使用indexOf方法根据另一个数组对数组进行排序

    我想根据另一个数组 索引 的排序顺序迭代两个数组 A B 在本例中为 10 34 32 21 String A a b c d String B e f g h int indexes 10 34 32 21 为这里的坏例子道歉 我已经更新
  • 启动 Java 时使用 -d32 和 -d64

    我阅读了以下摘录JDK 常见问题解答 http www oracle com technetwork java hotspotfaq 138619 html 64bit layering 如何在 32 位和 64 位操作之间进行选择 默认是
  • JPA:运行时如何指定类对应的表名?

    注意 我对 Java 非常熟悉 但对 Hibernate 或 JPA 还不太熟悉 还没有 我想编写一个通过 JPA 与 DB2 400 数据库通信的应用程序 现在我可以获取表中的所有条目并将它们列出到 System out 使用 MyEcl
  • Java中构造函数中的长参数列表[重复]

    这个问题在这里已经有答案了 可能的重复 重构具有太多 6 个以上 参数的方法的最佳方法是什么 https stackoverflow com questions 439574 whats the best way to refactor a
  • 编写潜在并发问题的证明

    我正在阅读 Java 并发实践 并尝试编写一段代码来表明第 3 5 1 章中作为示例提供的类确实会引入问题 public class Holder public int n public Holder int n this n n publ
  • 访问 java jigsaw 模块中的资源文件[重复]

    这个问题在这里已经有答案了 我正在尝试从项目中的类访问 Eclipse 项目中的文件 我需要将该项目声明为 jigsaw 模块才能从其他项目访问它 但是通过这样做 我无法再访问项目中的 example png 等文件 这是我的项目结构 pr
  • 二维数组中的寻路

    假设我有这个二维数组地图 0 0 0 0 7 1 1 1 1 1 1 1 1 0 7 7 7 7 1 1 1 24 1 1 1 1 0 7 24 24 24 24 24 24 24 1 1 3 1 0 7 23 23 23 23 23 23
  • 运行Java程序时出错

    我正在尝试使用 netbeans 运行我的 java 程序 但收到此错误 有什么建议吗 Exception in thread AWT EventQueue 0 java lang NullPointerException at javax
  • 如何使用 apache commons cli 指定多个选项?

    我想要这样的东西 java programName jobs1 C 10 W 20 java programName job2 java programName job3 含内容 Option o1 new Option job2 some
  • Spring Boot,使用 EhCache 进行缓存

    我需要在我的应用程序中缓存一些数据 我正在考虑使用 Ehcache 我有几个问题 Ehcache需要另外一台服务器吗 我需要其他客户端来使用 Ehcache 吗 Ehcache 如何与多个实例配合使用 是否有可能使用 Ehcache 创建类
  • 关于 mongodb java 驱动程序的困惑[重复]

    这个问题在这里已经有答案了 我是 MongoDB 的初学者 我正在使用 JAVA 驱动程序来使用它 我有以下代码 MongoClient client new MongoClient DB d client getDB world DBCo
  • 带有 CONTAINS 查询的PreparedStatement

    我有一个查询需要连续运行 28000 次 所以我认为使用准备好的语句可能是一个聪明的主意 这是我的查询 String requestWithFirstName SELECT SE ELEMENT ID SE LASTNAME SE FIRS
  • 无法渲染非字符串的属性,toString 返回:null SPRING MVC 中的错误

    我正在尝试按照本教程为我的 spring mvc 项目创建一个通用错误处理程序 http www mkyong com spring mvc spring mvc exceptionhandler example http www mkyo
  • 在 init 之外在 java 中创建对象

    因此 对于我正在创建的游戏 我有一些扩展 GameDriver 的类 到目前为止 在所有其他类上我都能够扩展 GameDriver 然后在 GameDriver 中我可以执行以下操作 ArrayList
  • 更改 Logger 实例的全局设置

    我在用着java util logging Logger http download oracle com javase 1 4 2 docs api java util logging Logger html作为我的应用程序的日志引擎 每
  • Android 布局崩溃

    I use a XWalkView https crosswalk project org 加载网页和视频查看器 https github com Bilibili ijkplayer在我的应用程序中播放实时视频 我希望 IjkVideoV
  • 使用 System.currentTimeMillis() 每秒运行一次代码

    我试图使用 System currentTimeMillis 每秒运行一行代码 代码 while true long var System currentTimeMillis 1000 double var2 var 2 if var2 1
  • 确定方法调用顺序的接口设计模式

    我想创建一个具有多种方法的 Java 接口 但我希望界面的用户只能按照我定义的顺序或顺序调用方法 例如buyTicket 不应在此之前调用reserveTicket 问 有没有设计模式或任何关于如何做到这一点的提示 我考虑过 A 接口被包装
  • ByteBuddy 变基、合成类型和 OSGi

    我为 byte buddy 开发了以下拦截器 public class SecurityInterceptor RuntimeType public static Object intercept SuperCall Callable su
  • 在同一项目上使用 Eclipse 和 NetBeans

    Eclipse 是一个非常棒的编辑器 我更喜欢使用它 但是缺少 Eclipse 的 GUI 设计工具 另一方面 NetBeans 非常适合 GUI 设计 在同一项目中使用 NetBeans 进行 GUI 设计和 Eclipse 进行其他所有

随机推荐

  • Google Spreadsheet API v4 使用“ApiKey”在电子表格中“添加行”

    我正在尝试使用 Google Spreadsheet API v4 直接使用 ApiKey 在电子表格中 添加行 而不使用 OAuth 2 0 如果我使用 OAuth 2 0 它成功 添加行 但我的要求是使用 ApiKey 参考了这个网址
  • django-auth-ldap 身份验证失败

    我正在尝试使用Django Auth Ldap https pythonhosted org django auth ldap 在我的项目 Django 1 6 Python 2 7 中 但它不起作用 我的活动目录模式是 我已经通过安装 l
  • 将 Catalyst 应用程序部署到生产服务器的最佳实践是什么?

    将 Catalyst 应用程序部署到生产服务器的好方法是什么 目前 我只是在存储库的根目录中有一个 FastCGI 调度脚本 当我想要更新服务器代码时 我将分支推送到服务器 这很简单 但并不完美 如果代码在服务器计算机上的测试失败 例如由于
  • 在 cookie 中设置 Django REST Framework JWT

    我在用djangorestframework jwt https github com GetBlimp django rest framework jwt对用户进行身份验证 我已经覆盖了内置的JSONWebTokenAPIView也在响应
  • 如何使用数据表和服务器端处理进行自定义过滤

    我在用数据表 http datatables net在我的 Web 应用程序中显示表格数据 并将其配置为使用服务器端处理 http datatables net usage server side 即通过 AJAX 查询服务器以获取过滤后的
  • 如果 .Create() 无法实例化,它应该返回空对象、null 还是抛出异常?

    我希望能够使用这种代码实例化应用程序中的任何对象 SmartForm smartForm SmartForm Create id 23 Customer customer Customer Create id 222 我现在正在讨论如果该对
  • 如何让 tcpdump 写入文件并标准输出适当的数据? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我希望有tcpdump将原始数据包数据写入文件中 并在捕获数据包时将数据包分析显示到标准输出中 通过分析 我的意思是它通常显示的行 w
  • 如何消除特定页面的顺风预战

    里面有一个选项tailwind config cjs关闭预检 但我不想在整个项目中关闭它们 我需要为某些特定页面启用它们 有没有办法做到这一点 关闭预检 tailwind config cjs corePlugins preflight f
  • Pymongo $in 查询不起作用

    在 Pymongo 中看到一些奇怪的行为 in询问 查找满足以下查询的记录 speciesCollection find SPCOMNAME in paddlefish lake sturgeon 查询没有返回任何记录 如果我将其更改为 f
  • 如何使用javascript在IE中的表单中设置文本区域值

    如果是 Firefox 我可以使用它在表单 提交问题 中设置文本区域 selectedtext 值 但在 IE 中失败 document submitquestion selectedtext value txt 这应该有效
  • 通过 Excel 的 eDrawings API

    我正在尝试通过 Excel 使用 edrawings VBA api 我已经下载了 edrawings SDK 似乎 api 仅通过用户表单运行 我通过 Excel 为 SolidWorks 制作了一些 VBA 宏 但与 SolidWork
  • AWS S3 存储桶“404 未找到”

    目前我正在托管一个捆绑包Angular 2应用程序在AWS S3 bucket 所以它只包含 html and js files 绝对路径http example com 确实有效 但如果我切换到任何链接 例如http example co
  • 无法关闭 TCP_NODELAY

    我正在使用 Boost asio 发送 TCP 消息 我设置了 NO DELAY 选项 因为这是一个 实时 控制系统 我看到使用 Wireshark 在消息中设置了 PSH 标志 我对它的表现很满意 它正在按预期工作 出于兴趣 我决定关闭
  • 模拟输入:按键按下、按住和释放

    我试图模拟用户按下某个键 按住某个键一段特定的时间间隔 然后释放它 我尝试使用来实现这个SendKeys Send 但我不知道如何控制按键的持续时间 我不想一遍又一遍地发送相同的密钥 我想要一个按键按下和一个按键弹起事件 例如 我有这样的代
  • 在同一个 ios 项目中使用 2 个版本的 AFNetworking

    我有一个项目 我使用了 AFNetworking 2 0 不是可可豆荚 刚刚添加到项目中 然后 我实现了日历 MSCollectionViewCalendarLayout 它在 pod 中打包了一些依赖项 其中之一是 RestKit gt
  • 如何通过 aot 编译在 Angular 中提供备用 i18n 语言链接?

    我目前正在开发 Angular 应用程序的 i18n 我使用 AOT 编译 xlf 文件来创建预编译的应用程序 如下所述here https angular io docs ts latest cookbook i18n html 在构建中
  • jQuery $(document).ready 在 Iron/Chrome 中损坏

    我使用 jQuery 和 jFancyTiles 编写了一个小图像幻灯片 可以在此处看到 http www netzwerkag at http www netzwerkag at 它在 Firefox 和 IE 中按预期工作 但在 Iro
  • Google Chart:如何绘制条形图的垂直线

    我正在尝试添加一条垂直线 以便当元素超过该值时可以在视觉上有所区别 Thanks
  • DatePickerDialog标题背景颜色

    我已经为 DatePickerDialog 背景设置了样式 它在 Nexus 5 Marshmallow 上的显示有所不同 我使用的风格是
  • 将 Antlr 语法树转换为有用的对象

    我目前正在考虑如何最好地获取使用 Antlr 生成的 AST 并将其转换为可以在我的程序中使用的有用对象 我语法的目的 除了学习之外 是创建一种可执行 运行时解释 语言 例如 我将如何获取属性子树并实例化特定的属性类 例如 以下代码用我的语