我正在尝试在无赖中实现这一目标:
select a from myTable; => select a from myTable
基本上,我只想删除不必要的表达式布局以及注释,以便获得最小的表达式形式。
如何在Rascal中实现目标?
=>
将其自身替换为特定的分析树节点,然后将其替换为子节点。在下面的示例中,仅替换+
周围的空格,然后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;
}