Если вы говорите по-французски, вас может заинтересовать один из курсов моих коллег (в свободном доступе) http://matthieuamiguet.ch/scientifique/enseignement/langages-et-compilateurs, хотя он использует Python для объяснения концепций построения и компиляции языка.
Английский PDF с PyCon 2010 http://matthieuamiguet.ch/assets/files/scientifique/publis/TeachingCompilersWithPython_Paper.pdf
Возможно, мне придется поговорить с ним о переводе его информации на английский 8)
Прочтите сообщения в группе новостей usenet comp.compilers, она доступна через группы Google. В нем много обсуждений, связанных с построением языка, сборкой компилятора, lex / yacc, грамматиками и т.п. Конечно, вы должны быть хорошо знакомы с классикой, такой как книга дракона, книга тигра среди многих книг по компиляторам и хорошие книги по алгоритмам и структурам данных.
Оригинальный компилятор C получает новую жизнь. Большая часть его переписывается, а его кодовая база достаточно мала, чтобы ее можно было прочитать и понять во время летних каникул. Рассмотрите возможность чтения кода вместе с документами, которые использовались для написания кода этого или любого работающего компилятора, и я уверен, что вы получите представление о том, с чего начать и т. Д.
Для простоты я рекомендую реализовать простой язык постфиксов. FORTH или основная часть PostScript были бы отличным выбором.
Одно из старых руководств по компилятору - , это . Хотя он написан на Паскале, это очень хороший источник информации. Если вам нужно что-то более свежее, вам следует взглянуть на ANTLR .
Вы можете прочитать несколько хорошо написанных статей Никлауса Вирта:
хотя эти работы в основном написаны на языке Pascal, раскрытые в них концепции легко перевести на язык C.
Ну, я думаю, что нечто подобное действительно трудно сделать, но это был бы отличный домашний проект. Вы должны иметь представления о парсерах, лексерах, управлении потоком, парадигмах (императивной, функциональной, ОО) и многих других вещах.
Многие говорят, что Dragon Book - одна из лучших книг для этого. Возможно, вы можете взглянуть на нее :)
Удачи!
Некоторое время назад я сделал простой парсер языка на Java, в основном он оценивал математические выражения, заменял константы и переменные и давал обратную связь по синтаксическим/типовым ошибкам.
Самый простой способ, который я нашел, чтобы сделать такую вещь, это создать дерево разбора. Это можно легко сделать, используя два стека, стек операторов и стек результатов. После этого вы можете просто рекурсивно разобрать его с помощью DFS, возможно, используя шаблон посетителя, если вы решите реализовать это на объектно-ориентированном языке.
Есть много чего сказать об этих вещах, и если вы хотите, я могу объяснить их более подробно, я не стал этого делать, потому что думал, что вы захотите попробовать реализовать все вышеперечисленное самостоятельно, но если вы захотите, сообщите мне, и мы сможем поговорить.
Начните с очень простого (игрушечного) языка; позже вы сможете создать более сложный синтаксис.
Вы можете написать интерпретатор для разбора строк типа
integer x
integer y
set x, 2
set y, 5
add x, y // x = x + y
print x
и оценивать каждую строку немедленно. Если хранить строки в векторе, то легко реализовать циклы с помощью команды goto
.
Пример, Another World (винтажная игра)
.
Script editor:
Я бы начал с простой программы настольного калькулятора, которая может читать такие вещи, как:
5 + 10 * 3
, и печатать ответ. Затем вы можете продвигать его, добавляя переменные, поток управления и даже функции.
Другая альтернатива - построить язык, не обращая внимания ни на что другое. Выясните, что вы можете делать легко, и двигайтесь от этого. Например, вы можете разбирать выражения в список лексем, разделяя их пробелами, и использовать префиксную нотацию (с которой довольно просто работать). Подобные вещи доставляют огромное удовольствие, и вы можете многому научиться, экспериментируя.
Scheme from Scratch - это хорошая серия постов в блоге о реализации Scheme на C. Код очень читабелен, и каждая версия развивает предыдущую таким образом, что легко следовать.
Вот первая часть: v0.1 - Integers.
Узнайте о регулярных выражениях, грамматиках и хорошем генераторе парсеров.
Даже если вы в конечном итоге реализуете свой собственный синтаксический анализатор, это фундаментальные концепции для реализации любого языка программирования.
Пусть кто-то другой сделает за вас грязную работу, а именно лексер и синтаксический анализатор. Используйте cup, yacc или bison для обработки синтаксиса. Это позволит вам сосредоточиться на более важных решениях по проектированию языка. Существуют даже примеры определений парсеров для многих языков, которые вы можете использовать в качестве шаблона для своего.