правильно ли я описал вызов функции?
От: Аноним  
Дата: 10.02.12 07:01
Оценка:
[Ast(call, lRound, param, param2, rRound)] call is expr = ident '(' expr? ("," expr)* ')'
и как подключать к ней обработчик

2. никак не выходит отладить макрос парсера
Re: правильно ли я описал вызов функции?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 15:42
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А> [Ast(call, lRound, param, param2, rRound)] call is expr = ident '(' expr? ("," expr)* ')'


Не очень. Лучше было бы описать его так:
[Ast(call, lRound, params, rRound)] call is expr = ident '(' (expr ("," expr)*)? ')'

При этом params будет кортежем (завернутым в optuon[T]) состоящим из двух полей одно типа expr, а второе типа list[NToken * expr] (где NToken будет содержать местоположение для запятых-разделителей).

Но лучше воспользоваться фичей появившейся в последних версиях компилятора. Тогда описание будет таким:
[Ast(call, lRound, params, rRound)] call is expr = ident '(' (expr; ",")* ')'

а в params окажется list[expr].

А>и как подключать к ней обработчик


А вот обработчик к нему (к правилу) подключать уже особого смысл нет, так как АСТ будет и так автоматически сформирован.
Если очень хочется произвести некоторую дополнительную обработку, то можно добавить обработчик с именем правила, принимающий один параметр с типом expr.call. Например, так сделано для правила UsingImportDeclaration:
[Ast(UsingLit, NsOrTypeName, Semicolon)]
UsingImportDeclaration    is NamespaceMember = "using"s QualifiedIdentifier ";"s;

Так как по директиве using нам нужно грузить внешние грамматики, то мы добавили для него вот такой обработчик:
  UsingImportDeclaration(usingImport : NamespaceMember.UsingImportDeclaration) : void
  {
    mutable grammarDescriptor;
    
    when (_grammarDescriptors.TryGetValue(usingImport.NsOrTypeName.Path, out grammarDescriptor))
      Parser.AddGrammar(grammarDescriptor);
  }


Но это довольно уникальный случай. Обычно обработчика не требуется.

Обработчик нужен, если не описывать AST. При этом достаточно просто скомпилировать проект с грамматикой, открыть окно Output и найти соответствующее сообщение об ошибке. В нем будет описана требуемая сигнатура. Далее остается скопипастить ее в тело класса и дать имена параметрам.

А>2. никак не выходит отладить макрос парсера


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