Search code examples
treerascal

Rascal: Tree Representation in Repl


I understand the default tree representation in the Rascal repl has changed. Following the recipe for the EXP Combined example I get

rascal>import demo::lang::Exp::Combined::Manual::Parse;
ok
rascal>parseExp("2+3*4");
Exp: (Exp) `2+3*4`

whereas the documentation says

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"), ...

Is there a way to get back to this "raw" tree representation (that only language researches will want to see ;-), possibly with layout (indentation etc.) ?


Solution

  • You can get the underlying tree representation by using iprintln from the IO library:

    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>)
    ]
    ok