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