Вопрос по синтаксису макросов для v2
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.06.10 16:08
Оценка:
В текущей версии макросов при описании синтаксиса можно использовать только строковые литералы (которые превращаются в ключевые слова или токены скобок), и имена параметров макроса (идентификаторы) которые всегда имеют тип 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

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

Минус состоит в том, что в этом варианте грамматика начинает содержать не относящиеся к делу вещи (имена), что делает ее хуже читаемой.

Собственно вопрос заключается в том какой вариант выбрать?
Если есть свои варианты, то их тоже можно озвучивать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.