我正在使用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>))
答案 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