我有一种新的小编程语言的源代码;
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类图。我的目标不是创建新的编译器或语言。 (我的问题不够明确,我希望这更清楚)
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以使用解析器生成器ANTLR。 该过程是将语言定义为由规则组成的语法。 ANTLR使用EBNF表单。如果解析器可以派生规则,您可以在Java中指定要执行的操作,在您的情况下将一些XML标记写入流中。
答案 2 :(得分:1)
在考虑生成XML文件之前,执行所讨论的内容的第一部分肯定是解析输入文档。现在,正则表达式不适合这项工作。并且手工制作的解析器很难设想,特别是对于支持某种形式的运算符先验的语言。
这里有三个很好的库,可以为您设计的任何语言开发解析器。但是,它们并不完全相同,所以选择它们中的任何一个都应该以你正在设计的语言为指导。
使用其中任何一个,您将描述您的语言结构和关键字,然后在找到每个元素时运行代码。然后,您将添加代码以创建解析树(或者您可以让引擎为您生成一个)。然后,您可以编写代码来处理该解析树,并可能将访问者输出到XML。
顺便说一句,如果您的语言的确切结构仍然未定义,那么您实际上可能使用任何以前的“解析器生成器”工具。在这种情况下,如果您是Eclipse的实际用户,那么我可能会建议您首先尝试XText,因为它将生成Eclipse编辑器,具有自动完成支持,重构支持等等。全部免费。
更新:XText也可用于为您的语言生成图形编辑器,前提是它有意义。在这里查看示例:http://vimeo.com/12824804。
答案 3 :(得分:1)
这不是一个微不足道的主题(如果你想做得对)。您将需要完成编写编译器的大部分阶段(减去实际写出的机器代码部分)。
有关入门的大量信息,请参阅此主题:Learning to write a compiler
制作编译器是一种非常有益的体验,但它需要做很多工作。
创建解析树后,您将能够将其导出为XML。但是那部分将在很晚之后出现。
答案 4 :(得分: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...
}
这种方法更适合您的期望和需求吗?