我知道Rascal repl中的默认树表示已经改变了。遵循我得到的EXP Combined example的秘诀
rascal>import demo::lang::Exp::Combined::Manual::Parse;
ok
rascal>parseExp("2+3*4");
Exp: (Exp) `2+3*4`而文档上说
rascal>import demo::lang::Exp::Combined::Manual::Parse;
ok
rascal>parseExp("2+3");
Tree: `2+3`
Tree: appl(prod(sort("Exp"),[sort("Exp"),layouts("Whitespace"), ...有没有办法回到这种“原始”的树表示(只有语言研究人员才会想看到;-),可能是通过布局(缩进等)?
发布于 2020-02-08 23:23:09
您可以通过使用IO库中的iprintln来获取底层树表示:
rascal>import demo::lang::Exp::Combined::Manual::Parse;
ok
rascal>import IO;
ok
rascal>iprintln(parseExp("2+3*4"))
appl(
prod(
sort("Exp"),
[
sort("Exp"),
layouts("Whitespace"),
lit("+"),
layouts("Whitespace"),
sort("Exp")
],
{assoc(left())}),
[appl(
prod(
sort("Exp"),
[lex("IntegerLiteral")],
{}),
[appl(
prod(
lex("IntegerLiteral"),
[iter(\char-class([range(48,57)]))],
{}),
[appl(
regular(iter(\char-class([range(48,57)]))),
[char(50)])[
@loc=|unknown:///|(0,1,<1,0>,<1,1>)
]])[
@loc=|unknown:///|(0,1,<1,0>,<1,1>)
]])[
@loc=|unknown:///|(0,1,<1,0>,<1,1>)
],appl(
prod(
layouts("Whitespace"),
[\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))],
{}),
[appl(
regular(\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))),
[])[
@loc=|unknown:///|(1,0,<1,1>,<1,1>)
]])[
@loc=|unknown:///|(1,0,<1,1>,<1,1>)
],appl(
prod(
lit("+"),
[\char-class([range(43,43)])],
{}),
[char(43)]),appl(
prod(
layouts("Whitespace"),
[\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))],
{}),
[appl(
regular(\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))),
[])[
@loc=|unknown:///|(2,0,<1,2>,<1,2>)
]])[
@loc=|unknown:///|(2,0,<1,2>,<1,2>)
],appl(
prod(
sort("Exp"),
[
sort("Exp"),
layouts("Whitespace"),
lit("*"),
layouts("Whitespace"),
sort("Exp")
],
{assoc(left())}),
[appl(
prod(
sort("Exp"),
[lex("IntegerLiteral")],
{}),
[appl(
prod(
lex("IntegerLiteral"),
[iter(\char-class([range(48,57)]))],
{}),
[appl(
regular(iter(\char-class([range(48,57)]))),
[char(51)])[
@loc=|unknown:///|(2,1,<1,2>,<1,3>)
]])[
@loc=|unknown:///|(2,1,<1,2>,<1,3>)
]])[
@loc=|unknown:///|(2,1,<1,2>,<1,3>)
],appl(
prod(
layouts("Whitespace"),
[\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))],
{}),
[appl(
regular(\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))),
[])[
@loc=|unknown:///|(3,0,<1,3>,<1,3>)
]])[
@loc=|unknown:///|(3,0,<1,3>,<1,3>)
],appl(
prod(
lit("*"),
[\char-class([range(42,42)])],
{}),
[char(42)]),appl(
prod(
layouts("Whitespace"),
[\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))],
{}),
[appl(
regular(\iter-star(\char-class([
range(9,10),
range(13,13),
range(32,32)
]))),
[])[
@loc=|unknown:///|(4,0,<1,4>,<1,4>)
]])[
@loc=|unknown:///|(4,0,<1,4>,<1,4>)
],appl(
prod(
sort("Exp"),
[lex("IntegerLiteral")],
{}),
[appl(
prod(
lex("IntegerLiteral"),
[iter(\char-class([range(48,57)]))],
{}),
[appl(
regular(iter(\char-class([range(48,57)]))),
[char(52)])[
@loc=|unknown:///|(4,1,<1,4>,<1,5>)
]])[
@loc=|unknown:///|(4,1,<1,4>,<1,5>)
]])[
@loc=|unknown:///|(4,1,<1,4>,<1,5>)
]])[
@loc=|unknown:///|(2,3,<1,2>,<1,5>)
]])[
@loc=|unknown:///|(0,5,<1,0>,<1,5>)
]
okhttps://stackoverflow.com/questions/60128008
复制相似问题