我正在为 ANTLR 中的 C 语言的一小部分编写一个词法分析器/解析器,它将在 Java 环境中运行。我是语言语法领域的新手,在许多 ANTLR 教程中,他们创建了一个 AST - 抽象语法树,我是否被迫创建一个,为什么?

有帮助吗?

解决方案 2

我找到了 这个答案 问题在jGuru写的特伦斯帕尔,谁创造了这些代码.我复制了这一解释,从该网站链接 在这里,:

仅仅简单,所谓的语法针的翻译可以做到的与行动内的分析程序。这些种类的翻译只能吐出结构,功能的信息已经看到在这一点上的分析。树的分析程序能让你走中间体形式和操纵,树,逐渐演变,它在几个翻译阶段到最后形式,可以很容易打印的退出作为新的翻译。

想象一下,一个简单的翻译问题在这里你想要打印出html网页,其标题是"有n项目",其中n是数量的标识你现在输入流。Ids必须打印之后的标题是这样的:

<html>
<head>
<title>There are 3 items</title>
</head>
<body>
<ol>
<li>Dog</li>
<li>Cat</li>
<li>Velociraptor</li>
</body>
</html>

从输入

Dog
Cat
Velociraptor

这么简单的操作你的语法怎么可能你的计算标题?你不能没有阅读的整个输入。好了,现在我们知道我们需要一个中间形式。最好是从一个AST我已经找到,因为它记录输入结构。在这种情况下,它只是一个列表,但它表明我的观点。

好了,现在你知道一棵树是一件好事为什么,但简单的翻译。给AST,你怎么得到输出它吗?想想简单的表达的树木。一种方法是使树中的节点的特定类似PlusNode,IntegerNode等。然后你只要求各个节点打印出来。用于输入,3+4你能有树:

+ | 3 -- 4

和类

class PlusNode extends CommonAST {
  public String toString() {
    AST left = getFirstChild();
    AST right = left.getNextSibling();
    return left + " + " + right;
  }
}

class IntNode extends CommonAST {
  public String toString() {
    return getText();
  }
}

给出一个表达树,你可以把它翻译后的文本的t.toString().所以,怎么了?看来工作不错,对吧?它出现的工作以及在这种情况下,因为这很简单,但我认为,即使是对于这个简单的例子,树语法都更有可读性和正式的描述恰恰是你编码在PlusNode.toString().

expr returns [String r]
{
    String left=null, right=null;
}

: #("+" left=expr right=expr) {r=left + " + " + right;}
| i:INT                       {r=i.getText();}
;

注意,特定类别("异构AST")的做法实际上编码的完整递归下降parser for#(+INT INT)通过手在toString().为解析发电机伙计们,这应该让你感到害怕。;)

主要弱点的异构AST的方法是,它无法方便地访问方面的信息。在递归下降parser,你的上下文是很容易地访问,因为它可以通过在作为一个参数。你也知道精确的规则可以援引其他规则(例如,是这种表情一段时间条件,或者如果条件吗?) 通过看法。该PlusNode类上存在的分离,孤立的世界里,它不知道他们会调用它的toString()方法。更糟糕的是,编程员就无法告诉在这方面,它将通过调用的阅读它。

在摘要,增加行动到你的输入析工作非常简单的翻译,其中:

  1. 为输出结构是相同的输入顺序
  2. 所有结构可以从生成的信息分析点,当你需要吐出来

除此之外,你会需要一个中间形式--AST是最好的形式通常。使用语的结构来描述AST类似于使用的语法分析输入文本。正式说明在一个特定领域的高级语言喜欢这些代码好过手工编码的分析程序.行动内的一个树语法有非常明确的上下文并能方便地获取信息传递援引rlues.翻译,操纵树的多通翻译也更容易使用树语法。

其他提示

创建具有ANTLR的AST被并入语法。你没有做到这一点,但它是更复杂的要求,一个很好的工具。这是对构建树,你可以使用教程

基本上,ANTLR当源是越来越解析,则有几种选择。你可以在你的语法使用重写规则生成代码或AST。一个 AST 基本上是一个在源的内存中表示。从那里,有很多可以做。

有很多东西需要ANTLR。如果你还没有准备好,我会建议得到

我认为创建 谷草转氨酶 是可选的。这 抽象语法树 对于后续处理(例如解析程序的语义分析)很有用。

只有您可以决定是否需要创建一个。如果您的唯一目标是语法验证,那么您不需要生成一个。在 javacc (类似于ANTLR)有一个 公用事业 被称为 锦江树 允许生成 AST。所以我想这在 ANTLR 中也是可选的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top