Использовать шаблон для привязки к параметрам конструктора при посещении узлов в 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>");
}