Re[4]: Вопрос по макросам
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 27.04.07 08:54
Оценка:
Здравствуйте, 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.