扩展 ANTLR3 AST

2023-12-02

使用 ANTLR2,您可以在语法定义文件中定义如下内容:

options
{
   language = "CSharp";
   namespace = "Extended.Tokens";
}

tokens {
   TOKEN<AST=Extended.Tokens.TokenNode>;
}

然后,您可以创建一个类:

public class TokenNode: antlr.BaseAST
{
    ...
}

如果可以使用这样的东西(将类创建委托给 AST 工厂而不是我手动进行树复制),有什么想法吗?它不仅仅通过简单的语法定义从旧格式复制到新格式来工作,我尝试在他们的网站和示例中搜索类似的内容。有什么提示吗?

EDIT

我不是想创建自定义标记,而是创建自定义“节点解析器”。

为了“执行”一棵树,你有两种选择(据我所知):

  1. 创建一个“树访问者”并处理值,或者
  2. 通过“几乎复制”语法定义来创建树解析器。

在 v2 的情况下,我可以将树节点装饰为我想要的任何方法,然后在解析器运行后通过从根节点调用“执行”之类的方法来调用它们。


我对C#了解很少,但与Java目标应该没有太大区别。

您可以通过设置来创建并让 ANTLR 使用自定义树ASTLabelType in the options { ... }节(一个XTree在这种情况下):

T.g

grammar T;

options {
  output=AST;
  ASTLabelType=XTree;
}

tokens {
  ROOT;
}

@parser::header {
  package demo;
  import demo.*;
}

@lexer::header {
  package demo;
  import demo.*;
}

parse
  :  Any* EOF -> ^(ROOT Any*)
  ;

Any
  :  .
  ;

然后,您创建一个自定义类,该类扩展了CommonTree:

演示/XTree.java

package demo;

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;

public class XTree extends CommonTree {

  public XTree(Token t) {
    super(t);
  }

  public void x() {
    System.out.println("XTree.text=" + super.getText() + ", children=" + super.getChildCount());
  }
}

当你创建你的实例时TParser,您必须创建并设置自定义TreeAdaptor这会创建你的实例XTree:

演示/Main.java

package demo;

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;

public class Main {

  public static void main(String[] args) throws Exception {
    String source = "ABC";
    TLexer lexer = new TLexer(new ANTLRStringStream(source));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    parser.setTreeAdaptor(new CommonTreeAdaptor(){
      @Override
      public Object create(Token t) {
        return new XTree(t);
      }
    }); 
    XTree root = (XTree)parser.parse().getTree();
    root.x();
  }
}

运行演示:

java -cp antlr-3.2.jar org.antlr.Tool T.g -o demo/
javac -cp antlr-3.2.jar demo/*.java
java -cp .:antlr-3.2.jar demo.Main

将打印:

XTree.text=ROOT, children=3

有关更多信息,请参阅:http://www.antlr.org/wiki/display/ANTLR3/Tree+construction

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

扩展 ANTLR3 AST 的相关文章

  • 在Python中生成字典树中的所有叶到根路径

    我有一个 非标准 形式的字典树 如下所示 tree 0 A B C D E F 叶节点被定义为字典键值对 其中值是空字典 我想将所有叶到根路径提取为列表列表 如下所示 paths C B A 0 E D 0 F D 0 如果有帮助的话 也可
  • 静止搜索性能

    这是一个双重问题 我组装了一个简单的国际象棋引擎 它执行 Alpha Beta 搜索 最后执行静止搜索 静止搜索正在影响性能 问题是 这是可以接受的性能影响吗 如果不是 那么应该采取什么措施来解决这个问题 下图给出了性能影响 请注意 这些统
  • C++ 中的动态树

    我想制作一棵树 每个节点都可以有一些子节点 但我不知道它们的数量 树必须在小内存中使用 无额外数据 以每个节点的恒定时间进行编码 我认为我将创建具有值和子属性 值是 int 子属性是堆栈 的类 Tree 以及指向该树中每个节点的指针数组 我
  • 即使不匹配,ANTLR 词法分析器规则也会消耗字符吗?

    我有一个 antlr 词法分析器规则的奇怪副作用 并且我创建了一个 几乎 最小的工作示例来演示它 在这个例子中我想匹配字符串 0 1 例如 但是当我调试语法时 到达解析器的令牌流仅包含 1 第一个整数 无论 它包含多少位数字 总是会被消耗
  • 如何使用纯 CSS 在 HTML 中获取一棵树

    我正在尝试遵循这个tutorial http odyniec net articles turning lists into trees 这是my code https github com gurjeet CSSTree so far 本
  • ANTLR 4 - 树模式匹配

    我试图理解 ANTLR 4 中的解析树匹配 所以为此 我有以下java代码 package sampleCodes public class fruits public static void main String args int a
  • 在Python中动态评估简单的布尔逻辑

    我有一些动态生成的布尔逻辑表达式 例如 A 或 B 和 C 或 D A 或 A 和 B A 空 计算结果为 True 占位符被替换为布尔值 我是不是该 将此信息转换为 Python 表达式 例如True or True or False a
  • rpart - 查找修剪树的 cp 值将返回的叶子数量

    我有一个要求 需要根据分类变量 具有超过 5 个类别值 与连续变量的关联将其分为 5 组 为了实现这一目标 我正在使用rpart with annova 方法 例如我的分类变量是type有代码1 2 3 4 5 6 7 8 9 10 11
  • 单击节点时打开分支?

    我被困住了jsTree http www jstree com 这里 到目前为止 它有效 我可以使用 图标浏览和展开节点 并在单击节点时打开页面 但我仍然希望它在有人单击节点时展开所有直接节点 我环视了至少两个小时 但什么也没找到 官方网站
  • B 树和 2-3-4 树之间的区别

    B 树和 2 3 4 树有什么区别 另外 你如何找到每个的最大和最小高度 链接到维基百科 http en wikipedia org wiki 2 3 4 tree and引用 2 3 4 树是 4 阶 B 树 A 2 3 4 is a B
  • python 2.7中没有名为antlr4的模块

    我想将 ANTLR4 与 Python 2 7 一起使用 为此我执行了以下操作 我安装了这个包antlr4 4 6 1在 Arch Linux 上sudo pacman S antlr4 我写了一个MyGrammar g4文件并成功生成了词
  • 基本树概念:定义祖先

    祖先的定义是什么 更具体地说 E 会是 H 的祖先吗 或者更简单地说 F C A 是 H 的祖先 也许甚至是G 我只是想澄清这个简单的概念 E 不是 H 的祖先 它是uncle因为它是一个siblingF 的parent of H F C
  • Antlr4 语言翻译 - 将模板逻辑与访问者类分开?

    我正在考虑实用地将大量相对简单的 TSQL 代码转换为 Groovy 代码 肯定有很多原因 但驱动因素只是想看看是否可以完成 并在此过程中了解编译器 语法 等 Antlr4 似乎是解决这个问题的理想工具 Java 是一个优点 标记化 解析
  • 命令提示符中树的输出

    我希望能够使用 tree F A gt desktop file txt 命令仅输出文本文件 目前 它输出每个文件扩展名 有谁知道有一个简单的方法可以做到这一点 Tree仅接受几个命令行参数 c gt Tree Graphically di
  • QTableView 仅显示使用 QAbstractItemModel 实现的树模型的叶子

    假设我有一个树结构 树叶在bold 抱歉这些点 A A1 A2 B B1 B11 B2 C 存储在 QAbstractItemModel 中 具有设置的父 子关系 如何在 QTableView 中仅显示树叶 基本思想是实现一个 QSortF
  • 为什么在算法中使用子树大小来选择二叉树中的随机节点?

    我偶然发现了从二叉树中选择随机节点的算法的几种实现 它们都使用子树大小属性 但是 我不明白为什么知道子树大小有帮助 这是实现A https stackoverflow com a 32011526 and B https www geeks
  • 使用 ANTLR 解析时忽略输入的某些部分

    我正在尝试通过 ANTLR ANTLRWorks 3 5 2 解析语言 目标是输入完整的输入 但 Antlr 给出语法中定义部分的解析树并忽略其余输入 例如这是我的语法 grammar asap project begin PROJECT
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m

随机推荐

  • 错误:该位置没有任何可重复的内容

    我有一个文本文件 其中包含俚语及其用真正的英语替代的列表 我使用 作为分割点将此文本文件转换为字典 并且在转换后打印字典时一切似乎都正常 但是 源自此行的错误 slangs re re compile join slang dict key
  • 对两个给定日期之间的集合日期字段进行排序

    我想根据两天之间的日期字段对列表进行排序 比如从现在到接下来的三天 排序列表应从现在开始和接下来的 3 天按升序排列 之后的所有先前和未来日期按升序排列 e g List
  • 如何在多个 EJB 之间共享 Java 缓存系统 (JCS) 资源

    我使用 JCS 来存储 ldap 搜索结果 该结果应由多个 EJB 共享 我创建了一个单例类来仅初始化 JCS 一次 但由于 EJB 的类加载器 它已使用自己的副本初始化了多次 所以搜索资源不共享 你们如何解决需要在多个 bean 之间共享
  • 如何让应用程序在后台保持唤醒状态

    我编写了一个应用程序 该应用程序连接到蓝牙设备并在汽车 在后台 和导航 或其他东西 在前台使用 但在 Android 7 也可能是 6 上 应用程序会在一段时间后进入睡眠状态 当我尝试从相机拍照时 睡眠模式 立即生效 我的应用程序现在正在睡
  • 从基类方法调用基类重写函数

    public class A public void f1 String str System out println A f1 String this f1 1 str public void f1 int i String str Sy
  • 检测精灵套件中的碰撞

    我正在尝试使用精灵套件制作一个简单的游戏 基本思想是 有一名玩家可以跳跃以避免阻挡 但我有一个问题 我不知道如何做到当玩家击中方块时玩家消失并且血液动画开始 首先 我不明白我在苹果网站上找到的这段代码的作用 static const uin
  • 一个 docker 用户可以向另一个用户隐藏数据吗?

    Alice 和 Bob 都是同一主机上 docker 组的成员 Alice 想要在 Docker 容器中运行一些长时间运行的计算 然后将结果复制到她的主文件夹中 Bob 非常爱管闲事 Alice 不希望他能够读取她的计算所使用的数据 系统管
  • Leaflet js:如何在地图上绘制任何标记结束时获取纬度和经度

    我得到了一个接近的代码 但我不确定 因为我是第一次使用 Leaflet js 我的意图是 假设 Leaflet js 正在显示地图或非地理数据 并且我有一个与 Leaflet js 相关的工具栏 工具栏有许多标记 如圆形 多边形 方形等 当
  • 我正在尝试获取所有发表超过 3 篇作品的作者的列表 - DBpedia Sparql

    我正在尝试获取已完成 3 项或以上工作的所有作者的列表 在 DBpedia 中 我的示例可以运行在 http dbpedia org sparql 基本代码 select count work as totalWork author Whe
  • magento订单列表查询

    我想选择 Magento 中所有订单的列表 这是我目前正在处理的另一个 PHP 应用程序中显示来自 magento 的所有订单列表所必需的 也有人可以使用 Magento 约定给我写代码 例如Mage 我使用 Magento 1 4 2 版
  • 在 Shiny 中同步两个 Highchart - 输入更改时不调用 JS

    相关于上一篇文章我提出 我想在 R Shiny 中的一个单独但同步的 Highcharter 图中调用单击事件时 在两个方向上更新一个 Highcharter 图中的点以更改颜色 我能够在 R Shiny 中同步两个 Highcharter
  • 使用 python 替换特定行中的字符串

    我正在编写一个 python 脚本来替换具有特定扩展名 seq 的目录中每个文本文件中的字符串 替换的字符串只能来自每个文件的第二行 输出是一个新的子目录 称为 clean 其文件名与原始文件相同 但带有 clean 后缀 输出文件包含与原
  • 强制 CEFSharp 下载而不显示对话框

    我有一个带有 CEFSharp 的 WPF 应用程序 它是一个 Web 浏览器 当我单击下载链接时 它会显示一个对话框并询问我要将文件保存在哪里 如何强制 Web 浏览器下载任何文件而不显示对话框 我想创建一些像谷歌浏览器这样的东西 因此
  • Python 中昂贵对象的智能缓存

    我有一个按顺序排列的图像目录 通常 我的代码将使用图像的连续子集 例如图像 5 10 中的数据 访问这些图像的简单选项是 使用在需要时加载图像并读取我的数据 例如像素值 的方法创建一个包装对象 这几乎没有内存开销 但速度会很慢 因为每次都需
  • 当我尝试保存新记录或更新现有记录时,EF 返回 0000-0000-0000-xxx 作为 Guid?

    我在我的 C 项目中使用 EF4 我面临的问题是 当我尝试保存记录时 出现主键违规 并且 PK 值为 0000 0000 0000 xxx 据我猜测 EF 无法识别 IsIdentity 标志并生成 guid 值 在我的表的 SQL Ser
  • OpenCV 中的 const Mat 引用有意义吗?

    在下面的函数中 foo const Mat img img可以在函数中进行更改 甚至编译器不会发出警告 为什么 是不是意味着const Mat参考没有任何意义 这是因为 Mat 包含指向实际图像数据的指针 const 仅适用于 Mat 对象
  • JavaFX安装

    我是 Java 新手 目前正在阅读文本并学习 我已经在我的系统中安装了JDK opt目录 在 Kubuntu 上工作 我还安装了 openjfx opt 由于我使用了终端 每当我想编译或运行涉及 JavaFX 模块的内容时 我都会使用 ja
  • 如何获取“TYPE_3BYTE_BGR”图像的 RGB 值?

    我有一张图片TYPE 3BYTE BGR我想把它转换成TYPE INT RGB 尽管我已经搜索过 但我还没有找到执行此操作的方法 我想逐像素转换图像 然而 似乎BufferedImage getRGB i j 不起作用 如何获取 type
  • Verilog HDL 循环语句错误:具有非常量循环条件的循环必须终止

    我对 Verilog 完全陌生 对于我在大学学习的课程 我必须很快了解它的很多内容 我正在摆弄我的 Altera DE2 板和 quartis2 并了解其细节 我正在尝试制作一个通过开关打开和关闭的计数器 到目前为止 计数器根据按键进行计数
  • 扩展 ANTLR3 AST

    使用 ANTLR2 您可以在语法定义文件中定义如下内容 options language CSharp namespace Extended Tokens tokens TOKEN