编写没有语法文件的自定义 Xtext/ANTLR 词法分析器

2024-01-08

我正在为 CoffeeScript 编写一个 Eclipse/Xtext 插件,我意识到我可能需要手动为其编写一个词法分析器。 CoffeeScript 解析器还使用手写词法分析器 https://github.com/jashkenas/coffee-script/blob/master/src/lexer.coffee处理语法中的缩进和其他技巧。

Xtext 生成一个扩展的类org.eclipse.xtext.parser.antlr.Lexer这反过来又延伸了org.antlr.runtime.Lexer。所以我想我会延长它。我可以看到两种方法

  • 覆盖mTokens()。这是通过生成的代码来完成的,改变内部状态。
  • 覆盖nextToken()这似乎是一种自然的方法,但随后我必须跟踪内部状态。

我找不到任何示例如何在没有语法文件的情况下为 ANTLR 编写一个简单的词法分析器。所以最简单的答案是指向一个的指针。

一个答案Xtext:具有重要/语义空白的语言的语法 https://stackoverflow.com/questions/7167834/xtext-grammar-for-language-with-significant-semantic-whitespace指的是todotext http://code.google.com/a/eclipselabs.org/p/todotext/它通过更改底层输入流中的标记来处理缩进问题。我不想走那条路,因为处理咖啡脚本语法的其他技巧会很困难。

UPDATE:

与此同时,我意识到我的问题部分是 Xtext 特定的。


这就是我所做的——而且它有效。

public class MyLexer extends myprj.parser.antlr.internal.InternalMylangLexer {
  private SomeExternalLexer externalLexer;

  public Lexer(CharStream in) {
    super(in);
    externalLexer = new SomeExternalLexer(in);
  }

  @Override
  public Token nextToken() {
    Token token = null;
    ExternalToken extToken = null;
    try {
      extToken = externalLexer.nextToken();
      if (extToken == null) {
        token = CommonToken.INVALID_TOKEN;
      }
      else {
        token = mapExternalToken(extToken);
      }
    }
    catch (Exception e) {
      token = CommonToken.INVALID_TOKEN;
    }
    return token;
  }

  protected Token mapExternalToken(ExternalToken extToken) {
    // ...
  }
}

然后我有一个稍微定制的解析器,其中包含:

public class BetterParser extends MylangParser {
  @Override
  protected TokenSource createLexer(CharStream stream) {
    MyLexer lexer = new MyLexer(stream);
    return lexer;
  }
}

我也不得不改变我的MylangRuntimeModule.java包含这个方法

@Override
public Class<? extends org.eclipse.xtext.parser.IParser> bindIParser() {
     return myprj.parser.BetterParser.class ;
}

就是这样。

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

编写没有语法文件的自定义 Xtext/ANTLR 词法分析器 的相关文章

  • 我们什么时候使用ANTLR

    谁能指导我在 ASP Net C 项目中使用 ANTLR dll 的目的 我刚刚注意到antlr 运行时 Antlr3 运行时 Antlr3 实用程序某些项目中引用的程序集 如果能引用一些现实世界的例子或者任何指向网页的链接都会有用 那就太
  • 我如何解释这个输入?

    我目前使用 ANTLR 在 Java 中实现了一种可用的 简单的语言 我想做的是将其嵌入纯文本中 与 PHP 类似 例如 Lorem ipsum dolor sit amet Phasellus volutpat dignissim sap
  • ANTLR4 中预期存在无关输入“-”

    你能告诉我可能是什么问题吗 值得期待的是
  • ANTLR如何在输入结束时检测垃圾数据

    当使用 ANTLR 编写的语法时 解析器可以正确识别输入流中的数据 但如果我在输入末尾有一些垃圾文本 不应该由语法解析 解析器不会抱怨 我想这种行为是可以的 我的意思是解析器完成了它的工作并解析了我所说的它应该解析的任何内容 但是有什么技巧
  • 如何使用ANTLR生成的语法文件?

    我认为这是一个愚蠢的问题 但我刚刚开始使用 ANTLR 我将他们教程中的 SimpleCalc 语法放在一起 并以 C 作为目标语言生成它 我得到了 SimpleCalcParser c h 和 SimpleCalcLexer c h 作为
  • 将简单的 Antlr 语法转换为 Xtext

    我想将一个非常简单的Antlr语法转换为Xtext 所以没有句法谓词 https stackoverflow com questions 5728659 translate antlr grammar into xtext grammar
  • 可视化使用 ANTLR 创建的 AST(在 .Net 环境中)

    为了一个我喜欢的项目 我开始摆弄 ANTLR 在学习了一些教程之后 我现在尝试为我自己的语言创建语法并生成 AST 现在我主要在 ANTLRWorks 中闲逛 但现在我已经验证了解析树似乎没问题 我想 迭代地 因为我仍在学习 仍然需要对最终
  • xtext 中的终端/数据类型/解析器规则

    我正在使用 xtext 2 4 我想做的是类似 SQL 的语法 让我困惑的是我不确定哪些东西应该被视为终端 数据类型 解析器规则 到目前为止我的语法相关MyTerm is Model terms MyTerm MyTerm constant
  • 将 Antlr 语法树转换为有用的对象

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

    我想在 Python 中使用 ANTLR 构建一个 Java 解析器 我从 ANTLR 存储库下载了语法 Lexer https github com antlr grammars v4 blob master java java Java
  • ClassNotFoundException:org.eclipse.xtext.junit_2.4.3.v201309030823 找不到 junit.framework.TestCase

    我对这个错误感到困惑 java lang NoClassDefFoundError junit framework TestCase at java lang ClassLoader defineClass1 Native Method a
  • 在线验证antlr语法[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道是否存在某种用于antlr语法的在线测试环境 我可以在其中针对某些输入字符串验证和测试给定的语
  • ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符

    我正在开发一个相当标准的编译器项目 我选择 ANTLR 作为解析器生成器 在将现有语法从 v2 更新到 v3 时 我注意到 ANTLRWorks ANTLR 的官方 IDE 无法正确显示文件中的任何扩展 ASCII 字符 即使使用 Note
  • 将 Xtext 与 StringTemplate 代码生成器链接

    在我当前的项目中 我试图链接用 xtext 编写的 DSL 规范和用 StringTemplate 编写的代码生成器 例如 我的 DSL 规范的语法如下 我通过 xText 提供的优秀编辑器工具输入此信息 structs TempStruc
  • C# 有(直接)flex/yacc 端口吗?或者人们在 C# 中使用什么词法分析器/解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然
  • 我应该在哪里划清词法分析器和解析器之间的界限?

    我正在为 IMAP 协议编写一个词法分析器 用于教育目的 但我很困惑应该在词法分析器和解析器之间划清界限 以 IMAP 服务器响应为例 FLAGS Answered Deleted 该响应的正式语法定义如下 mailbox data FLA
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • (更好的方法)使用 Eclipse 和 XText 获取项目中的文件

    我正在编写一个 XText 编辑器 并进行一些语义突出显示 我正在解析的部分语言引用了文件 这些文件应该存在于项目中 我想根据这些文件是否位于正确的位置来突出显示 目前 我有一个非常丑陋的解决方案 但我确信有更好的方法 public voi
  • 用于(联合国)结构化文本文档的词法分析器/解析器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有很多脚本解析器和词法分析器 即结构化计算机语言 但我正在寻找一个可以将 几乎 非结构化文本文档分成更

随机推荐

  • 如果字段是实例成员,则回调处理程序会出现异常

    希望有人帮助我解决这个问题 If CallbackHandler proxy是静态的 那么一切正常 using System using System ServiceModel namespace ConsoleApplication5 D
  • Boost heap 设置用户定义的比较函数

    最近 我发现 Boost Heap 在我的项目中非常有用 但我找不到任何示例代码来显示如何设置任意比较函数 include boost heap fibonacci heap hpp using boost heap fibonacci h
  • 如何使用 SOA 架构实现松耦合

    我最近做了很多关于 SOA 和 ESB 等的研究 我现在正在工作中重新设计一些遗留系统 并希望使用比目前更多的 SOA 架构来构建它 我们在大约 5 个网站中使用这些服务 而我们的遗留系统目前面临的最大问题之一是 几乎每次我们进行错误修复或
  • 如何在具有相同端口但具有不同主机头的 IIS 服务器中托管多个站点并公开访问它

    我正在尝试在 IIS 服务器中托管多个网站 我可以使用不同的端口托管它 但我不想为不同的网站使用不同的端口 我也尝试使用主机标头 但我只能在本地访问这些标头 我想公开 外部访问这些标头 我怎样才能做到这一点 我还配置了 DNS 但我无法公开
  • 如何在 ASP.NET Web 应用程序中打开 SectionGroup?

    我有一个小型 ASP NET Web 应用程序托管在集成测试中 在 NUnit 中执行 我的产品代码通常可以从 web config 或 app config 文件中找到配置数据 但由于某种原因 在托管 ASP NET 时 我似乎得到了一个
  • flex-box:先收缩再包裹

    我有一个包含多个列的布局 其中一些是固定的 另一些则根据需要进行拉伸 因此 我使用弹性盒 此外 我想要并且需要使用 flex wrap 结构是这样的 div class row style display flex div class co
  • Xcode 7.3 缺少私有框架

    我最近将 Xcode 升级到了 7 3 版本 当我编译现有项目时 我收到此错误消息 directory not found for option F Applications Xcode app Contents Developer Pla
  • 基于类的视图“没有属性.as_view()”错误

    我正在跟进本教程 http code tutsplus com tutorials beginners guide to the django rest framework cms 19786 尝试为我的API制作一个Products ta
  • 为什么 grep 如此慢并且使用 -w (--word-regexp) 标志占用大量内存?

    我在一个文件和一个数据文件 大小约为 3 2Gb 中有一个 id 列表 我想提取数据文件中包含 id 的行以及下一行 我做了以下事情 grep A1 Ff file ids file data grep v gt output data 这
  • 加密 app.config 文件

    我有一个 app config 文件 需要与我的应用程序一起分发 它是由于我添加的对 ASMX Web 服务的服务引用而创建的 如果这个文件被修改 查看 这并不是什么大问题 但我仍然希望确保它的安全 我已经检查了配置的哈希值并确保其有效 但
  • PHP 还是 Python 进行图像处理?

    我正在编写一个图像处理应用程序 我只是想知道哪种编程语言最适合 Python 或 PHP 这个过程是基于系统的 而不是基于网络的 所以我只是想Python是否可以提供更多帮助 让我知道你的想法 Python 有类似的东西SciPy http
  • WebView的LOAD_NO_CACHE设置仍然将文件保存到磁盘吗?

    尽管使用webview getSettings setCacheMode WebSettings LOAD NO CACHE 时 WebView 仍然将 MB 的文件保存到缓存中 有没有办法真正禁用缓存 Thanks 似乎没有什么可以完全禁
  • 如何直接将ASP.NET MVC1升级到MVC3?

    我有一个 ASP NET MVC1 项目 想将其直接升级到 MVC3 我假设有两条路 直接从1升级到3 升级到 2 然后第二次升级到 3 最常走的路是哪条 如果您正在使用ASP NET项目升级工具 http aspnet codeplex
  • 从 PostgreSQL 函数生成 HTML

    谁能帮我这个 我有一个任务是编写一个函数 它将根据 PostgreSQL plpgsql 语言 中给定的表名生成 HTML 表 我已经写了这个 但它离我的需要还很远 它会为我给出的列生成一个表 目前只有一个 但我只需要给表一个名称 创建或替
  • Vue:在 div 单击时,转到数据中定义的 url

    我在数组中有这种对象 name name1 url http url 1 tld name name2 url http url 2 tld 单击 div 时 我想要将 window location href 指向url 但我似乎无法从数
  • 如何以编程方式将代理添加到 NSURLSession

    查看文档NSURLSession and NSURLSessionConfiguration 我的印象是我应该使用如下所示的字典来配置它 Create a dictionary to describe the proxy NSDiction
  • 后台线程 Core Data 对象属性更改不会反映在 UI 上

    假设我想添加一个新项目PlaylistCoreData 的实体并将其放入后台线程并将其推回到主线程 然后将其反映在 tableView 上 好吧 该代码在没有后台线程实现的情况下工作正常 但是当我应用下面的背景代码时 之后createPla
  • 两个不同平台上的类文件大小是否存在差异?

    假设我有一个包含大量代码的 java 文件 如果我在不同的平台上构建这个文件 就像windows和solaris一样 两个类文件是否有可能具有可识别的不同大小 如果是 原因是什么 如果您使用不同版本的编译器或不同的设置 特别是关于包含哪些调
  • 撰写:将文本包装在行布局中,而不是将同级文本推出

    我正在尝试 Jetpack Compose 但 Row 的行为让我感到困惑 我在图标按钮旁边有一个文本 我希望图标按钮锚定到最小宽度为 48dp 的一侧 并让文本环绕它 像这样 但文本不会换行 它会占用行中的所有空间 Composable
  • 编写没有语法文件的自定义 Xtext/ANTLR 词法分析器

    我正在为 CoffeeScript 编写一个 Eclipse Xtext 插件 我意识到我可能需要手动为其编写一个词法分析器 CoffeeScript 解析器还使用手写词法分析器 https github com jashkenas cof