[Ast(call, lRound, param, param2, rRound)] call is expr = ident '(' expr? ("," expr)* ')'
и как подключать к ней обработчик
2. никак не выходит отладить макрос парсера
Здравствуйте, Аноним, Вы писали:
А> [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. никак не выходит отладить макрос парсера
А что конкретно хочется отлаживать?