ANTLR @header、@parser、superClass 选项和基本文件 io (Java)

2024-03-18

我想将解析器操作与基本文件 io (Java) 一起使用,例如。 G。 ANTLR 语法中的 PrintWriter。我必须使用 superClass 选项还是可以使用 @header?在这两种情况下,我如何声明 PrintWriter 对象以及如何处理异常?


选项superClass=...是用来让你的Parser扩展自定义类。所以,我不认为这就是你所追求的。

里面的一切@header部分将放置在您的开头Parser班级。这用于导入类:

@header {
  import java.io.PrintWriter;
}

注意@header {...}是缩写@parser::header {...}。您还可以定义:@lexer::header {...}为你的词法分析器。

还有里面@member {...} (or: @parser::member {...}, @lexer::member {...})部分,您可以添加可在以下任一内部使用的实例变量和方法:Parser or Lexer:

@header {
  import java.io.PrintWriter;
}

@members {
  PrintWriter writer;
}

一个语法的小演示,其解析器会将解析后的数字写入特定的写入器:

grammar T;

@header {
  import java.io.PrintWriter;
}

@members {
  PrintWriter writer;

  public TParser(TokenStream input, String fileName) {
    super(input);
    try {
      writer = new PrintWriter(fileName);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

parse
  :  numbers EOF
  ;

numbers
  :  (NUM {
            writer.println("parsed: " + $NUM.text);
            writer.flush();
          }
     )+
  ;

NUM : '0'..'9'+;
WS  : ' ' {skip();};

可以用以下方法进行测试:

import java.io.File;
import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    String source = "42 500000000 666";
    TLexer lexer = new TLexer(new ANTLRStringStream(source));
    TParser parser = new TParser(new CommonTokenStream(lexer), "log.txt");
    parser.parse();
  }
}

如果运行上面的类,会生成一个名为log.txt已创建包含:

parsed: 42
parsed: 500000000
parsed: 666

请注意,所有这些都有严格的顺序@... and options {...}等实例:

  1. grammar定义
  2. options块(无@ sign!)
  3. tokens块(无@ sign!)
  4. @header block
  5. @members block
grammar T;

options {
  // options here
}

tokens {
  // imaginary tokens here
}

@header  { 
  // ... 
}

@members { 
  // ... 
}

EDIT

ANTLRStarter 写道:

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

ANTLR @header、@parser、superClass 选项和基本文件 io (Java) 的相关文章

随机推荐

  • 在 iOS 10 中添加本地通知 - Swift 3

    所以我一直在尝试向新的 UNUserNotificationCenter 添加通知 但我似乎没有得到它 我的视图控制器有一个操作 IBAction func sendPressed sender AnyObject let content
  • 如何获取设备令牌

    安装完成后 我需要获取 deviceToken 以用于其他目的 这是我到目前为止所开发的 Parse initialize this qqd423WEfwWEF32FewferT434fs323rfRT g7Rre4g7gsGRwgGw45
  • 忽略特定列表排序器的排序

    我可以忽略 jquery 表排序插件中特定列的排序吗 因此 基本上 当页面加载时 我不希望在 搜索 列上进行任何排序 因为它包含图像并自行进行一些 JavaScript 处理 这会大大减慢我的排序速度 这是我的代码
  • window.parent.location.href 或 window.top.location 哪一种更好

    我正在一个项目中工作 在特定情况下我必须在错误页面上重定向 为此 我创建了 Error aspx 页面 现在我正在使用 window top location href Error aspx 并生成http localhost app we
  • 当没有行时 RecordNotFound 返回 false

    我有问题这个图书馆 https godoc org github com jinzhu gorm DB RecordNotFound因为即使给定的输入不在数据库中 该函数也会返回 false 而实际上它应该返回 true type User
  • 写入 TcpClient 和 NetworkStream

    我对如何在 net 中使用 tcp 流有点困惑 现在 当我想写40字节时 我将其写入内存流 然后调用ToArray 并将内存流写入网络流 刷新 在服务器端 我使用 Read buf 0 len 并检查长度是否完全符合我的预期 我这样做是不是
  • MYSQL:如何创建一个触发器来根据不同表中的值计算字段值?

    In table A我有田地CENA 价格 cena za kus 每件价格 mnozstvi 数量 In table B我有田地DPH vat 我想添加一个更新 插入之前触发器 它将计算PRICE字段 像这样 price price pe
  • 如何从 HSSFWorkbook 对象获取输入流

    我希望我的 Web 应用程序用户将一些数据下载为 Excel 文件 我有下一个函数在响应对象中发送输入流 public static void sendFile InputStream is HttpServletResponse resp
  • 如何在 jQuery/Javascript 中编写 switch 语句来测试元素是否具有特定类?

    这是我正在使用的 if else 语句的结构 myclass a click function if this hasClass class1 do something else if this hasClass class2 do som
  • ASP.NET MVC 模型绑定器。使用对象数组参数调用控制器

    我想要 MVC 控制器的以下签名 public ActionResult Create Persons p 有可能有这样的东西吗 编辑 假设我想通过提交由特殊符号分隔的名称列表来获取人员对象数组 例如我提交一个表格
  • 使用 C# 从字符串路径构建文件夹/文件树[重复]

    这个问题在这里已经有答案了 我需要解决一个涉及从字符串路径构建树的问题 以下是模型 public class Folder public string Name get set public List
  • Hibernate 4.0.1 至 4.3.5:无法建立 JDBC 连接

    我有一个使用 Hibernate 4 0 1 与 derby 数据库交互的项目 效果很好 这是一个示例程序 它仅连接到数据库并且不执行任何操作 import org hibernate Session import org hibernat
  • 委托给私有部分

    有时 C 的隐私概念让我感到困惑 class Foo struct Bar Bar p public Bar operator gt const return p struct Foo Bar void baz std cout lt lt
  • 是否可以用 angular2 注入接口?

    我想知道 Angular2 中是否有正确的方法来注入接口 参见下文 我认为这与界面上缺少 Injectable 装饰器有关 但似乎这是不允许的 Regards 当 CoursesServiceInterface 作为接口实现时 TypeSc
  • 如何避免控制台窗口包含包含 os.system 调用的 .pyw 文件?

    如果我将代码文件另存为 pyw 没有出现控制台窗口 这就是我想要的 但如果代码包含对os system 我仍然看到一个讨厌的控制台窗口 我认为这是由调用引起的os system 有没有办法从我的内部执行其他文件 pyw脚本根本不升起控制台窗
  • scala 日志记录函数名称

    在我的日志条目中 我想记录调用 log 方法的函数名称 这是为了能够自动按函数名称过滤日志条目 这可能吗 有任何图书馆吗 对现有库有任何扩展吗 换句话说 是否可以在运行时提取执行上下文当前正在执行的scala函数的名称 第二个问题 我知道这
  • CImg 库在旋转时创建扭曲的图像

    我想使用 CImg 库 http cimg sourceforge net http cimg sourceforge net 以任意角度旋转图像 图像由 Qt 读取 不应执行旋转 QImage img sample with alpha
  • Unix 查找:多种文件类型

    我想对多种文件类型运行 find name 例如 find name h cpp 这可能吗 find name h o name cpp 要在以下位置找到此信息man页面 类型man find并通过键入搜索运算符 OPERATORS并按回车
  • Apache James Spring 发行版未启动

    尝试一下阿帕奇 詹姆斯 https james apache org 目前的邮件服务器 我下载后当前二进制发行版 3 4 0 https www apache org dyn closer lua james server 3 4 0 ja
  • ANTLR @header、@parser、superClass 选项和基本文件 io (Java)

    我想将解析器操作与基本文件 io Java 一起使用 例如 G ANTLR 语法中的 PrintWriter 我必须使用 superClass 选项还是可以使用 header 在这两种情况下 我如何声明 PrintWriter 对象以及如何