Использовать шаблон для привязки к параметрам конструктора при посещении узлов в Rascal

Я пытаюсь сделать визит сверху вниз по алгебраическому типу данных. Когда я нахожу узел определенного типа, я также хотел бы привязать к узлам этого конкретного узла, например,

data Script=script(list[Stmt] body | ...
data Stmt  =exprstmt(Expr expr)| ...
data Expr  =assign(Expr left, Expr right) | var(str name)| scalar(Type aType)|... ;


Script myScript=someScript(srcFile);
top-down visit(myScript)
{
    case (Expr e:assign(left,right), left:=var(_), right :=scalar(_) )
    {
        str varName=left.name;
        Type myType=right.aType;
    }
}

Так что я пытаюсь сделать в операторе case поиск определенного типа узла: то есть типа assign (var (), scalar ()), выполнив пару сопоставлений с образцом. Мое намерение состоит в том, чтобы связать переменные left и right с var () и scalar () соответственно в то же время, когда я нахожу определенный тип узла. Я надеялся НЕ делать вложенную инструкцию 'case', чтобы получить информацию о подузлах. Может быть, это возможно, но я не уверен.

1 ответ

Решение

Вы можете просто вложить шаблоны, вот так:

top-down visit(myScript) {
    case e:assign(l:var(varName),r:scalar(aType)) :
      // do something useful
      println("<varName> : <aType>");
}

я верю left а также right могут быть зарезервированы ключевые слова, поэтому я использовал l а также r вместо.

Или проще (потому что вам не нужны имена для вложенных шаблонов:

top-down visit(myScript) {
    case assign(var(varName),scalar(aType)) :
      // do something useful
      println("<varName> : <aType>");
}
Другие вопросы по тегам