使用parsertree时出现奇怪的错误

时间:2016-11-01 12:54:45

标签: rascal

我正在使用java15语法解析代码。

我注意到,在解析整个类时,如果类文件以空行结束,则会给出错误。我在解析之前写了一些代码来删除这些空行,但是有更复杂的结构吗?或者我错过了什么?

相关:当我尝试解析单个方法时:只要我将某些内容更改为荣誉{ }的位置(例如,在单独的行上),我就会收到错误。

|std:///ParseTree.rsc|(14967,5,<455,80>,<455,85>): ParseError(|java+class:///smallsql/database/language/Language_it|(10537,0,<152,0>,<152,0>)) at parse(|std:///ParseTree.rsc|(14967,5,<455,80>,<455,85>)) at $root$(|prompt:///|(0,7,<1,0>,<1,7>)) at *** somewhere ***(|std:///ParseTree.rsc|(14967,5,<455,80>,<455,85>)) at parse(|std:///ParseTree.rsc|(14967,5,<455,80>,<455,85>)) at $root$(|prompt:///|(0,7,<1,0>,<1,7>))

1 个答案:

答案 0 :(得分:0)

我猜你正在使用这样的代码进行解析:

  • parse(#CompilationUnit, file)
  • [CompilationUnit] file

但是:CompilationUnit不会以layout表示法开头或结尾。

要解决这个问题,你应该声明一个语法的起始非终端:

start syntax CompilationUnit = ... ;
layout L = [\t\n\r\ ]*; // it's necessary to have L be nullable

这将(内部和隐藏)为您生成一个新的产品,如下所示:

syntax start[CompilationUnit] = L CompilationUnit top L;

这样,您就可以解析一个可能以布局结尾的整个文件:

  • parse(#start[CompilationUnit], file)
  • [start[CompilationUnit]] file

要提取CompilationUnit,top字段会派上用场:

  • CompilationUnit u = parse(#CompilationUnit, file).top