Здравствуйте, VladD2, Вы писали:
K>> Судя по примеру Oyster'а, это делается через GlobalEnv. Но не является ли это хаком?
VD>Нет. Но можно и через тайпбилдер.
А тайпбилдера не предусмотрено. Это же макроатрибут уровня сборки.
K>> Как на это среагирует Интеграция? И если всё нормально, то каким образом можно корректно получить GlovalEnv из макро-атрибута уровня сборки?
VD>С интеграцией есть только одна особенность. Она парсит код методов по требованию. То есть если ты попыташся добавить класс внутри метода, то:
VD>1. Это не произойдет до тех пор пока программист не откроет файл содержащий этот метод.
Это плохо. А если я хочу как-то поработать с классом из другого места?
K>>Кстати, сейчас пытаюсь сделать так. Делаю два макроса: макро-атрибут BNF, и макрос lexer. Во-первых, будет ли макрос lexer разворачиваться внутри атрибута?
VD>Э... не совсем понял вопрос.
Как мы уже выяснили, макрос имеет синтаксис, несколько отличный от Nemerle, так что без лексемных макросов не обойтись. Но лексемные макросы предусмотрены только на уровне выражений. А я хочу юзать их на уровне макроатрибута, используя обходной путь, описанный ниже. Вот и спрашивается, прежде чем передать PExpr макроатрибуту, будет ли компилятор обрабатывать макросы внутри него?
K>> Во-вторых, сейчас lexer просто разворачивается в списко кортежей, каждый из которых просто описывает лексему bnf. Планируется, что макрос BNF будет разбирать этот список, преобразовывать в поток лексем и т.д. Но, ИМХО, это криво. Неужели нет возможности всё это проделать непосредственно?
VD>Тоже не понял.
VD>Попытайся описать то что ты хочешь более детально.
OK. Пусть имеется что-то вроде:
[assembly:BNF(
lexer
{
Identifier ::= Letter (Letter | Digit)*;
subst Letter ::= "a".."z" | "A".."Z";
...
}
)]
Макрос lexer развернётся (я этого ожидаю) во что-то вроде:
{
("id", "Identifier", "filename.n", 0, 0, 0, 0); //вместо нулей будет location лексемы
("assign", "::=", "filename.n", 0, 0, 0, 0);
("id", "Letter", ...);
("leftparen", "(", ...);
...
}
А потом макрос BNF возьмёт это выражение, проанализирует его и сформирует поток лексем. Далее поток лексем направляется парсеру, формируется AST, по AST генерится спосок регэкспов и т.д.
... << RSDN@Home 1.2.0 alpha rev. 672>>