2016-11-04 3 views
1

Я работаю с грамматикой Java 8 и хочу найти вхождения вызова метода, а точнее it.hasNext(), когда it является Iterator.Interpolation in Concrete Syntax Matching

Это работает:

visit(unit) { 
    case (MethodInvocation)`it . <TypeArguments? ta> hasNext()`: { 
     println("found"); 
    } 
} 

В идеале я хотел бы, чтобы соответствовать с любым идентификатором, а не только it.

Таким образом, я попытался с помощью интерполяции строк, который компилирует, но не соответствует:

str iteratorId = "it"; 
visit(unit) { 
    case (MethodInvocation)`$iteratorId$ . <TypeArguments? ta> hasNext()`: { 
     println("achei"); 
    } 
} 

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

Возможно ли такое совпадение в негодяи? Если да, как это можно сделать?

ответ

1

Ответ конкретно зависит от грамматики, которую вы используете, который я не смотрел, но в целом в конкретных фрагментов синтаксиса это обозначение используется для заполнителей: <NonTerminal variableName>

Так ваш рисунок должен выглядеть следующим :

str iteratorId = "it"; 
visit(unit) { 
    case (MethodInvocation)`<MethodName name>.<TypeArguments? ta>hasNext()`: 
     if (iteratorId == "<name>") println("bingo!"); 
} 

То есть если предположить, что MethodName действительно нетерминал в вашей грамматике Java8 и частях правила синтаксиса для вызова методов.