从表达式中删除不必要的布局符号

问题描述 投票:1回答:1

我正在尝试在无赖中实现这一目标:

select   a from     myTable; => select a from myTable

基本上,我只想删除不必要的表达式布局以及注释,以便获得最小的表达式形式。

如何在Rascal中实现目标?

rascal
1个回答
0
投票
  1. 您可以用访问=>将其自身替换为特定的分析树节点,然后将其替换为子节点。在下面的示例中,仅替换+周围的空格,然后
  2. 您可以通过访问树并在Layout非终结符上进行匹配来一次性替换所有Layout(语法可以使用不同的名称)。在下面的示例中,您还可以看到它是如何完成的。
module NormalizeLayout

import demo::lang::Pico::Syntax;
import ParseTree;
import IO;

// a stub space
private Layout space = appl(prod(layouts("Layout"), [], {}), [char(32)]);

void example() {
   t = parse(#start[Program], 
     "begin
     '  declare 
     '    a : natural;
     '
     '    a := 1 +
     '         1
     'end");

   t = visit (t) {

   // this one sets the spaces only of a very specific rule, namely + expressions:
      case (Expression) `<Expression l> + <Expression r>` 
        => (Expression) `<Expression l> + <Expression r>`

   // as an alternative here we match all layout in the entire program and replace it     
     case Layout _ => space
   }

   println(t); //  begin declare a : natural ; a := 1 + 1 end 
}

[主要困难在于获得针对空间的示例解析树,因为(NT)[NT]表示法不支持直接从布局非终端进行解析。因此,在此示例中,我跳到了通用级别,并为Layouts发明了一个解析树(请参阅ParseTree模块以了解在Rascal中如何在后台定义解析树)。

获得这种示例树的另一种(类型安全)技巧是从这样的示例中获得一棵:

private Layout space() {
  visit ((Expression) `1 + 1`) {
    case Layout x : return x;
  }

  fail;
}
© www.soinside.com 2019 - 2024. All rights reserved.