В текущей версии макросов при описании синтаксиса можно использовать только строковые литералы (которые превращаются в ключевые слова или токены скобок), и имена параметров макроса (идентификаторы) которые всегда имеют тип PExpr или arrya[PExpr].
Отличительной особенностью новых макросов (которые должны появиться в Nemerle 2.0) будет то, что при описании синтаксиса можно будет использовать правила грамматики объявляемые другими макросами.
Таким образом при описании синтаксиса будет необходимо указывать имена других макросов. Например, в следующем фрагменте:
macro class Xml
{
macro tagOpen(lt, _, id, attrs, gt, _) : XmlAst.TagOpen
syntax: '<' s identifier attr* '>' s
{
TagOpen(lt.StartPos, gt.EndPos, id.Value, attrs.Map(x => x.Value :> Attr))
}
macro attr(id, _, _, value) : XmlAst
syntax: identifier '=' s attrValue;
{
Attr(id.StartPos, value.EndPos, id, value)
}
}
identifier, attr, attrValue и s — это имена других синтаксических макросов (правил).
Для того чтобы к результатам работы этих макросов можно было обратиться в коде конкретного макроса им нужно дать имена. При этом не всегда возможно использовать в качестве имен имена правил, так как:
1. Правила могу встречаться в описании синтаксиса более одно раза.
2. Правила могут использоваться в подправилах (например, "attr*" в примере выше).
3. Иногда необходимо обращаться к литералам (например, чтобы считать их местоположение). А у них имен нет в принципе.
По сему есть две схемы задания имен конкретным подправилам. Первая схема приводилась мной ранее — это схема в которой имена задаются позиционным способом:
macro tagOpen(lt, _, id, attrs, gt, _) : XmlAst.TagOpen
syntax: '<' s identifier attr* '>' s
Для тех кто не понял я привожу имя и чему оно соответствует:
Имя Подправило
lt '<'
_ s
id identifier
attrs attr*
gt '>'
_ s
Вторым вариантом задания имени является задание его прямо внутри грамматики:
macro tagOpen : XmlAst.TagOpen
syntax: '<' as lt s identifier as id attr* as attrs '>' as gt s
Плюс этого подхода заключается в том, что нет нужны задавать имена для не нужных элементов грамматики и в том, что имена идут сразу за подправилами, так что их проще идентифицировать.
Минус состоит в том, что в этом варианте грамматика начинает содержать не относящиеся к делу вещи (имена), что делает ее хуже читаемой.
Собственно вопрос заключается в том какой вариант выбрать?
Если есть свои варианты, то их тоже можно озвучивать.