Здравствуйте, VladD2, Вы писали:
VD>Слушай, я вот смотрю на то как ты теоретизируешь и не пойму, а почему бы просто не попробовать? Темболее, что сейчас с интеграцией это стало так просто!
А я не совсем теоретизирую. Я уже сделал макрос lexer, который выполняет указанное в прошлом посте преобразование. И вроде студия показывает, во что разворачивается макрос — именно в то, что я изначально запланировал. Только пока не разборался с макросами уровня сборки, потому протестировать не было возможности.
VD>В общем, вместо того чтобы рассуждать вместе с тобой, я просто попробовал сам...
VD>И вот что у меня получилось.
VD>
[skip]
VD>Далее оставалось поглядеть в окне Locals отладчике чему равно значение параметра expr.
VD>В нем находился вызов PExpr.MacroCall в последнем параметре которого было значение SyntaxElement.RawToken, которое в свою очередь, содержало список токенов конструкции "lexer". Вот что я увидел в отладчике:
VD>VD>- expr {lexer { aaaa ::= bbb * | ccc + ; bbb ::= xxx * ; } } => Nemerle.Compiler.Parsetree.PExpr {Nemerle.Compiler.Parsetree.PExpr.MacroCall}
VD>+ name {lexer} Nemerle.Compiler.Parsetree.Name
VD>+ ns NamespaceTree.Node: '"MacroLibrary2.lexer"' Nemerle.Compiler.NamespaceTree.Node
VD>- parms Length = 1: "[{\n aaaa ::= bbb * | ccc + ;\n bbb ::= xxx * ;\n } ]" => Nemerle.Core.list<Nemerle.Compiler.Parsetree.SyntaxElement>
VD> - [0] {{ aaaa ::= bbb * | ccc + ; bbb ::= xxx * ; } } => Nemerle.Compiler.Parsetree.SyntaxElement {Nemerle.Compiler.Parsetree.SyntaxElement.RawToken}
VD> + [Nemerle.Compiler.Parsetree.SyntaxElement.RawToken] {{ aaaa ::= bbb * | ccc + ; bbb ::= xxx * ; } } => Nemerle.Compiler.Parsetree.SyntaxElement.RawToken
VD>
VD>Так что все что тебе нужно легко достижимо.
VD>Тебе только остается разобрать содержимое переданных в макрос Dnf выражений, распарсить грамматику и создать нуный код.
Вот только как такое разобрать? Я вот вместо такого ужаса генерю другой ужас — нагромождение кортежей. ИМХО, это всё кривовато получается. Во-первых, мы добавляем лишней работы парсеру (что в случае с Интеграцией м.б. критично). Во-вторых, никто не запрещает поместить lexer вне атрибута BNF, что не есть хорошо.
... << RSDN@Home 1.2.0 alpha rev. 672>>