有没有办法可以修改ParseTree及其伴随的TokenStream?

时间:2014-04-11 20:33:45

标签: java programming-languages antlr antlr4

我的问题是语言实现问题和ANTLR4 API问题。 我是否可以修改ParseTree及其伴随的TokenStream?

以下是该方案。我有一种定义数据流程序的简单语言。如果您有好奇心,可以在github上看到它。我用ANTLR4来解析和解析语言。我使用监听器来遍历解析树并评估代码。

我最近遇到的问题是我需要能够在运行时修改代码。我需要能够定义新对象并从中创建实例。请注意,我并不是指在语言中进行反思。我指的是像IDE这样的程序修改源代码的内部表示。

我已经开始定义一堆定义对象以创建AST,但我刚刚意识到这种方法需要我提出自己的解决方案来行走AST。我宁愿使用ANTLR的听众/访客,而不是重新发明轮子。

我面临的另一个问题是需要能够在任何时间点输出AST作为代码的当前状态(我将嵌入语言的工具需要能够保存。)我正在使用StringTemplate从我的定义对象生成代码。我想我应该能够让ST渲染解析树。

一般来说,我需要能够在运行时内完成lex,parse,evaluate,refactor,evaluate和generate。

我不想创建自己的定义对象,而是想知道最好的方法是修改ParseTree / TokenStreams?

3 个答案:

答案 0 :(得分:0)

我们目前无法安全地更改解析树。最好从旧版本中获取新版本。您还应该查看令牌流重写引擎thingie。 叔

答案 1 :(得分:0)

对你的问题的简短回答是肯定的,但正如你猜测的那样,这将是痛苦和脆弱的。

一个更可行的替代方案,除非您明确要求修改内部'源代码/解析树的表示,只是在(几乎)每次击键之间简单地重新解析修改后的源代码。只需将活动编辑器的当前内容作为String抓取,然后将其作为流提供给Lexer。

虽然这听起来像是一项昂贵的操作,但Antlr实际上非常快。 Eclipse特别适用于这种方法 - 我将它与许多DSL编辑器一起使用,对编辑器性能没有任何明显的影响。解析完全在后台线程上发生。编辑器问题只有在前台编辑线程中有足够的暂停时才会更新。 NetBeans应该是类似的。

答案 2 :(得分:0)

我检查了你的语言。它看起来很简单,我假设它是。

根据您的描述,我的工作原理是IDE将直接在树上运行。鉴于这是你需要的:

  1. 您的语言的解析器,用于将源代码转换为树。 ANTLR可以做到这一点,但您可能需要构建自己的树而不是依赖于提供的树。编写自己的解析器并不难。
  2. 树重写规则。树的一系列允许转换,确保它保持有效。这可以是在树上运行的API的形式。这http://www.program-transformation.org/Transform/TreeRewriting可能会有所帮助。
  3. 源代码生成。从树中重建源代码的能力。如果你需要保留注释和格式,那么(a)将它们包含在语法中(b)将生成的源代码与创作的代码合并。
  4. 最终结果是您可以对源代码或生成的树中的任何更改进行往返。 如果您认为这是一项很多工作,那就是。但是,它是许多其他旨在提供这些设施的工具的基础。拯救的恩典是你的语言很简单。