Кто-нибудь знает, как написать прекомпилятор Flex, подобно тому, как MXML используется в процессе сборки? - PullRequest
0 голосов
/ 15 октября 2011

Это немного сумасшедший вопрос, но знает ли кто-нибудь, как написать дополнительный шаг компиляции в компилятор flex.Идея состояла бы в том, что компилятор MXML выбил бы код MXML в AS3, как и он, но у нас есть дополнительный шаг между кодом AS3 и байт-кодом.

Причина, по которой я спрашиваю, заключается в том, что это было бы отличным шагом для обработки таких вещей, как теги метаданных, для внесения изменений в код.Обычной практикой во многих средах является наличие тега [Inject] перед переменной.Т.е. [Inject] публичный var user: IUser.

Что было бы действительно круто, так это если тег инъекции можно было бы распознать, каким-то образом интерпретировать, а затем привязать к одиночному или тому подобному.Например, у вас может быть файл конфигурации, который определяет IUser как объект User.Компилятор интерпретирует это и заменит общедоступного пользователя [Inject]: IUser на общедоступного пользователя var: IUser = UserConfig.instance.user;

Это будет одна из многих вещей, которые будут возможны, если язнал, как сделать этот шаг.Мне просто интересно, узнает ли кто-нибудь, даже с чего начать, как это сделать.

Ответы [ 2 ]

0 голосов
/ 16 октября 2011

Компилятор с открытым исходным кодом, и в кодовой базе есть много примеров, показывающих, как компилятор изменяет абстрактное синтаксическое дерево (именно к этому разбирается исходный код) во время компиляции.

Я бы посоветовал взглянуть на расширения [Embed] или [SkinPart]. (Я обсуждал это раньше со ссылками на примеры здесь .)

Но будьте осторожны - это не для слабонервных. Если вы новичок в компиляторах и как они работают, я настоятельно рекомендую эту книгу по ANTLR , которая дает подробный обзор процесса синтаксического анализа исходного кода в AST и того, как они интерпретируются.

0 голосов
/ 15 октября 2011

Это широкий вопрос, но я могу придумать ответ для вашего конкретного случая.

Вам потребуется написать код, который принимает байт-код в качестве входных данных и выводит байт-код:

  • Найдите черту с вашими [Injected] метаданными.
  • Напишите некоторый байт-код, который вызывает UserConfig.instance.user
  • Вставьте этот байт-код в инициализатор класса для этого класса.

Для интеграции в процесс сборки вы добавляете новую Программу Builder (при условии, что вы используете Flash Builder), которая запускается после Flex .

Другой2 способа:

  • Анализировать ActionScript перед Flex.
  • Создать собственную ветку компилятора Flex.
...