0

我有一种新型小型编程语言的源代码;

 method M(n: int) returns (r: int)
  ensures r == n;
{
  var i := 0;
  while (i < n)
  {
    i := i + 1;
  }
  r := i;
}

我想使用 Java 读取此代码的源文件(只有一个没有任何依赖关系的文件),并为函数名称、输入参数、返回类型、关键字确保等创建 XML。

为了做到这一点,我需要分析给定的源代码,可能会创建一种树结构来查看分层视图。(至少我是这么想的)

是否有任何框架可以帮助我自定义关键字以分析此类材料并从中生成 XML,或者我应该逐行阅读此文件并尝试自己创建 XML 解析器。

我在这里的主要目的是以 XML 格式表示这段代码。为了生成一些 UML 类图。我的目标不是创建新的编译器或语言。(我的问题不够清楚,我希望这能让它更清楚)

4

5 回答 5

1

您可以使用解析器生成器ANTLR。该过程是将语言定义为由规则组成的语法。ANTLR 为此使用了 EBNF 形式。如果解析器可以派生规则,您可以在 Java 中指定要执行的操作,在您的情况下将一些 XML 标记写入流。

于 2013-10-25T20:27:03.047 回答
1

在您考虑生成 XML 文件之前,您所讨论的第一部分肯定是解析输入文档。现在,正则表达式不是该工作的好人选。而且手工制作的解析器很难想象,尤其是对于支持某种形式的运算符优先级的语言。

这里有三个很好的库,可以为您设计的任何语言开发解析器。但是,它们并不都是等价的,因此选择它们中的任何一个都应该以您正在设计的语言类型为指导。

使用其中任何一个,您将描述您的语言结构和关键字,然后在找到每个元素时运行代码。然后,您将添加代码来创建解析树(或者您可以让引擎为您生成解析树)。然后,您可以编写代码来处理该分析树,并可能编写访问者将其输出到 XML。

顺便说一句,如果您的语言的确切结构仍未定义,那么您实际上可以使用任何以前的“解析器生成器”工具。在这种情况下,如果您是 Eclipse 的实际用户,那么我可能会建议您先尝试 XText,因为它将生成一个 Eclipse 编辑器,具有自动完成支持、重构支持等。全部免费。

更新:XText 也可用于为您的语言生成图形编辑器,前提是它有意义。看看这里的例子:http: //vimeo.com/12824804

于 2013-10-25T20:27:42.517 回答
1

您的描述有点含糊,但听起来您正在寻找一个用于解析自定义语言并转换为另一种语言的库。您可以从ANTLR开始。此外,如果您从输入构建 Java 对象,您可能会考虑将JAX-B编组为 XML。

于 2013-10-25T20:26:10.713 回答
1

这不是一个微不足道的主题(如果你想做对的话)。您将需要完成编写编译器的大部分阶段(减去实际写出机器代码部分)。

请参阅此线程以获取大量信息以开始使用:Learning to write a compiler

制作编译器是一种非常有益的体验,但需要大量的工作。

创建解析树后,您就可以将其导出为 XML。但那部分会在很久以后出现。

于 2013-10-25T20:28:53.007 回答
0

假设只有每个方法的标题行是重要的,这里是一个完全不同的策略。

read a line from your input file
    if (line match regex /^ \s* method ([a-zA-Z][a-zA-Z0-9_]*)\(([^)]*)\) returns \(([^)]*)\) /x )
        // So the line is a method header. Extract arguments
        currentMethodName = group(1);
        currentArguments = group(2);
        currentReturnType = group(3);

        methods.add(new MethodDefinition(...));
    end if


for (method : methods) {
    // Generate XML for that method...
}

这种方法是否更适合您的期望和需求?

于 2013-10-25T21:14:18.567 回答