【问题标题】:Rascal fetch methods without comments无注释的流氓获取方法
【发布时间】:2016-12-06 22:34:22
【问题描述】:

我正在寻找一种在解析过程中避免 cmets 的方法。这是我的问题。

首先我从 M3 模型中获取所有方法,如下所示:

public set[loc] getMethodLocations(M3 model){
  locations = { <x,y> | <x,y> <- model@containment,
  x.scheme=="java+class",
  y.scheme=="java+method" ||
  y.scheme=="java+constructor" };
  set[loc] methodLocations = { a | a <- range(locations) };
  return methodLocations;
}

然后我想遍历获取的位置,如下所示:

set[loc] AllMethodsAsLoc = getMethodLocations(model);

for( methodAsLoc <- AllMethodsAsLoc ) {
  MethodDec m = parse(#MethodDec, methodAsLoc);
};

我的问题是,当获取的方法在该位置有 cmets 时,解析似乎失败并出现 ParseError。如何在获取时不包含 cmets,或者如何在解析过程中忽略 cmets?

我是这方面的新手,所以请原谅我的无知。

感谢任何帮助。

罗伯

【问题讨论】:

    标签: parsing comments rascal


    【解决方案1】:

    很好的问题。因为MethodDec 不是“开始”非终端,它在实际MethodDec 前后不接受空格或cmets。所以要么我们应该以某种方式修剪空白,要么我们可以创建一个新的非终端,可以接受布局。

    恕我直言,后一种解决方案更好:

    start syntax MyTop = MethodDec method;
    
    start[MyTop] theTop = parse(start[MyTop], methodAsLoc);
    MyTop t = theTop.top
    MethodDec dec = t.method;
    
    // or more directly
    dec = parse(start[MyTop], methodAsLoc).top.method;
    

    【讨论】:

    • 谢谢你。这正是我需要的解决方案。太棒了。
    • 供以后阅读和/或使用它的人使用。请记住,此解决方案仅适用于方法。代码示例还获取构造函数,因此我还需要添加以下内容以处理构造函数:syntax MyMethod = MethodDec | ConstrDec;' and the solution to the problem by @jurgenv: start 语法 MyTop = MyMethod 方法;` 声明变量并将其与解析一起使用,如下所示:MyMethod m = parse(#start[MyTop], method).top.method;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多