2016-05-24 3 views
1

Итак, я хотел бы получить доступ к аннотациям узла, когда я нахожу его. Приведем пример:Rascal AST для доступа к аннотации доступа

visit (myAST) { 
    case someNode(str name): { 
    // How do I now access the @src annotation of someNode here? 
    } 
}; 

Я уже пробовал следующие, но это не работает:

visit (myAST) { 
    case someNode(str name): { 
    parents = getTraversalContext(); 

    iprintln(parents[0]); // This print shows someNode with the @src annotation. 
    iprintln(parents[0]@src); // This gives the error: get-annotation not supported on value at... 
    } 
}; 

Что я делаю неправильно здесь? Является ли мой подход неправильным?

+1

Второе решение будет работать, если вы сопоставляете 'parents [0]' с типом, для которого объявлена ​​аннотация или против 'node'. Это связано с тем, что функция 'getAnnotation' определена только для' node', а не для 'value'. Тем не менее, решение Paul должно быть предпочтительнее использования 'getTraversalContext' – jurgenv

ответ

2

Хороший вопрос, лучший способ сделать это, чтобы ввести переменную, скажем, в шаблоне sn и использовать это, чтобы принести аннотацию

visit (myAST) { 
    case sn:someNode(str name): { 
    // Access the @src annotation of someNode here by [email protected] 
    } 
}; 

В качестве примечания: вы используете функцию getTraversalContext но Я настоятельно рекомендую вам избежать этого, поскольку он является экспериментальным и, скорее всего, изменится в будущем. Приняли: мы должны были отметить это как таковое.

+0

Perfect! Работает как шарм. – Nicasso

 Смежные вопросы

  • Нет связанных вопросов^_^