В комментариях вы говорите, что предложенный вами язык (я назову его Ext-C, для Extended C) - это DSL, предназначенный для узкой аудитории (вы, ваши студенты), тогда вам потребуется:
- Написать код для анализа Ext-C, распознавая, какие части являются чистыми C, а какие - Ext-C.
- Напишите генератор кода C, который представляет перевод Ext-C на C.
- Соберите его в препроцессор, который читает исходные файлы Ext-C и записывает исходные файлы C.
- Напишите сценарий компилятора (или программу), который обрабатывает синтаксический анализ аргументов и запуска препроцессора Ext-C для файлов Ext-C перед запуском компилятора C для остальной части перевода.
Взгляните на Cfront как на один из возможных источников идей.
Взгляните на IBM Informix ESQL / C (предоставляется бесплатно от IBM как часть IBM Informix ClientSDK или CSDK); есть скрипт 'esql', который управляет компиляцией, и препроцессор 'esqlc', который фактически анализирует исходный код ESQL / C и генерирует соответствующий код C. Программисты запускают скрипт esql для компиляции программ ESQL / C; они не запускают программу esqlc вручную, если у них нет необычно извращенной и мазохистской серии.
Обратите внимание, что одной из самых сложных частей любого DSL является интеграция с отладчиком. Вы можете сделать так, чтобы ваш препроцессор генерировал директивы '#line
', которые иногда помогают, а иногда и мешают. (В моем арсенале сценариев есть один, который комментирует директивы #line
; я использую его, когда мне нужно отладить промежуточный код C, но все же удается вернуться к исходному исходному коду.) Вы можете увидеть, как lex и yacc (и варианты) также обрабатывают это в своем выводе. Рекомендуется также, чтобы препроцессор очищал промежуточный файл по умолчанию (при успешной компиляции), но предоставлял опцию, чтобы промежуточный файл оставался доступным для проверки. Обратите внимание, что если ваш препроцессор не гарантирует, что весь вывод является действительным C - поскольку он просто копирует части ввода в вывод, не проверяя его, как это делает компилятор C, - то вам нужно убедиться, что пользователи (программисты) могут определить, где исходная ошибка есть в исходном файле, даже если ошибка обнаружена компилятором C, а не компилятором Ext-C.
Язык программирования IBM Informix 4GL является полным языком, который полностью анализируется его основным компилятором, который затем (несколько упрощенно) генерирует код на Си. Существует скрипт c4gl
для управления компиляцией и компоновкой, а также препроцессор / компилятор i4glc1
(и, поскольку я слишком упрощал, i4glc2
, i4glc3
и i4glc4
тоже). Если сгенерированный код C не удается скомпилировать, это указывает на ошибку в компиляторе I4GL - это не ошибка пользователя.