【问题标题】:How to generate a parser generator using Xtext?如何使用 Xtext 生成解析器生成器?
【发布时间】:2019-01-21 11:48:35
【问题描述】:

我计划在 Xtext 之上实现一种元语言。换句话说,我正在使用 Xtext 语法来定义我自己的元语言。然后可以使用这种元语言来定义一种语言(使用我定义的语法)。使用定义的语言,用户可以创建模型。

因此,我想使用 Xtext/Xtend 作为解析器生成器的生成器。这将使我能够添加任意数量的元级别。我的理解是,Xtext 本身是使用 Xtext 定义的,所以这应该是可能的?

问题是我不知道如何解决这个问题,因为我不是 Xtext 或解析器生成器框架方面的专家。欢迎任何解决方案/方法/提示。

更新(更多细节和动机)

Xtext 可以用来生成任何东西,所以我可以编写一个基于 Xtext 的生成器来生成解析器。这可以通过指定我的元语言的语法来完成,使用 Xtext 为该语法生成​​解析器,这样我就可以访问代表用我的元语言编写的模型的 AST。但是,从现在开始,我将独自一人对 AST 做任何我想做的事情,例如生成解析器(因为 AST 代表用户定义语言的语法)。但是由于 Xtext 具有生成解析器的特定能力,我正在考虑重用这个功能,而不是实现我自己的基于语法的 AST 的解析器生成器。

我的动机是希望定义自己的 DSL 语法语言(作为 Xtext 的替代品),同时仍然能够使用 Xtext 项目提供的基础设施。

【问题讨论】:

  • 不确定我是否可以关注你。在 Xtext 中,您可以编写生成器。你可以在那里做任何你想做的事。如果生成的代码本身是解析器。然后你有一个解析器生成器。我的问题是:这种方法有什么好处?
  • 请查看我的更新,希望我能更清楚地描述我的问题和动机。如果还有什么具体的不清楚,我会补充。
  • 您的语法与 Xtext 语法语言有何不同
  • 我想添加一些便利功能,例如简化符号表生成(这是我在所有 DSL 中都需要的功能之一,因此在此级别包含此功能会很整洁)
  • 我不确定,但不会扩展 Xtext 或只是为工作流编写一些片段来做同样的事情

标签: xtext parser-generator


【解决方案1】:

我得出了以下解决方案: 使用我的语法语言编写的语法将由 Xtext 解析。接下来,将生成的 AST 转换为 Xtext 语法语言 AST,它可以用作现有解析器生成器的输入。

一般来说,给定一些语法语言 l1,用这种语言编写的模型将被解析,生成的 AST 将被转换为用于指定 l1 的语法语言 l2 的 AST。重复此步骤,直到我们有一个表示 Xtext 语法语言模型的 AST,该模型将用于生成新的解析器。

自然地,任何与新语法语言的定义一起添加的信息都会在每个转换步骤中丢失。因此,围绕语法语言开发的基础架构有责任创建某种功能,使这些信息可用于使用语法语言开发的高级语言。

【讨论】:

    【解决方案2】:

    有关其他方法,请参阅:

    WWW.XTRAN-LLC.com/xtran.html#parse-gen

    简而言之,我厌倦了为 XTRAN 创建解析器,我们的专家系统的规则语言操纵计算机语言、数据和文本,因此我创建了一个解析引擎,它在解析时直接执行 EBNF(而不是创建解析代码,例如 Lexx/YACC 和 ANTLR)。由于 XTRAN 还必须将其内部表示/AST(在其被操作之后)中表示的代码内容呈现为源代码文本,因此我创建了一个相应的呈现引擎,该引擎在呈现时执行(一种更简单的形式)EBNF。

    【讨论】:

    • 这听起来像是一个有趣的方法,但我真的不明白这会给我解决问题带来什么好处。也许你可以详细说明。
    • 我建议您像我一样跳出框框思考。还可以看看 SNOBOL,它是 1970 年代以来的一种文本解析语言,它可以很容易地为各种语言构建解析器。那时我在 SNOBOL 中做了一些非常酷的事情。
    • 我不介意开箱即用,我只是不知道 XTRAN 方法对我有什么帮助。我也会看看 SNOBOL。然而,我的初衷是想知道我脑海中的概念是否可以使用 Xtext 来实现。这个概念是否最可行是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多