Как кодировать компилятор в C?

Я кодирую компилятор в C, и я прочитал все о компиляторах вКнига дракона, Но я нахожу это действительно трудным для реализации, и я понятия не имею, с чего начать. Даже когда речь идет о лексере, хотелось бы знать пошаговый метод на основе написания кода для написания компилятора на C !!

Что бы вы предложили мне сделать дальше? "

 Pete Kirkham31 окт. 2009 г., 12:49
я нахожу это очень трудно реализовать " - это было бы потому, что это трудно. Это'ближе к марафону, чем к прогулке в парке - даже с годами тренировок и таланта, этоВсе еще тяжелая работа.

Ответы на вопрос(2)

Вы могли бы посмотреть наAppel»Современная реализация компилятора в C.

Судя по всему, вам нужно решить, какой язык вы хотите скомпилировать: хотите, чтобы подмножество C говорило, или легко разбираемый язык, такой как Scheme, или просто язык арифметических выражений?

Выберите / спроектируйте язык, напишите на нем пару действительно небольших программ, напишите для него часть лексера / парсера, затем вернитесь, чтобы заставить работать части (возможно, интерпретировать для запуска - просто чтобы вы могли видеть, что он работает), а затем итерируйте куски, которые кажутся интересными, нарастают до полного языка.

Редактировать на основе предоставленных дополнительных данных "

я хочу сделать супер набор из c, например, реализовать различные преимущества Python, но держать его так же просто, как c "I"

я не уверен, что яЯ бы сделал это, написав все от руки, но если бы я это сделал ...

Я бы написал несколько программ на гибридном языке, которые я хочу закончить: так что если вы хотите C с Python, как списки, то, возможно,

void main()
{
    int[] x = {1,2,3,4,5};
    int[] y = {i*i for i in x where i % 2 == 0};
    for (int i in y) { printf("%d", i); }
}

[Массивы в стиле C, которые включают их количество, как указано выше, оставлены в качестве упражнения для читателя :-)!]

Затем получите абсолютно минимальную работающую C-программу, hello world или даже просто добавив несколько чисел статически (если бы это был hello world, я мог бы даже начать с специального кожуха printf, чтобы я нене нужно разбирать stdio.h - если тыНаправляясь к гибриду C-Python, вы можете сохранить его). Однажды ты мог сделать

void main() 
{
    int x = 0; 
    int y; 
    y = 5; 
    x + y;
}

Вы можете начать добавлять сложность: определения и вызовы произвольных функций, дополнительные операторы, возвращаемые значения, массивы, структуры данных, константы, указатели, ... пошаговое построение по пути к простейшим из примеров программ.

Преимущество, начиная с подмножества C, состоит в том, что у вас есть много C-компиляторов, на которые вы можете посмотреть за идеями, чтобы начать работу, например.TinyCC так что к тому времени, когда вы дойдете до сложностей добавления кусочков Python, выУ нас есть прочная база.

Это катание по многим деталям на длинной дороге. Удачи.

 Hick31 окт. 2009 г., 09:35
я хочу сделать супер-набор c, например, реализовать различные преимущества python, но сохранить его так же просто, как c. Мне очень понравился ваш последний параграф, и я хотел бы разработать компилятор таким образом, не могли бы вы немного рассказать об этом методе?
 Peter Wone31 окт. 2009 г., 09:43
Итак, вы хотите построить Jumbo Jet, только больше и лучше, используя только кусочки из базового набора Meccano?
 Hick31 окт. 2009 г., 10:04
Ага !! чтобы вы могли понять мою проблему, поэтому, пожалуйста, помогите мне

Большинство людей используют специализированные инструменты генерации парсеров и лексеров, такие как ANTLR или Yacc / Bison с Lex.

 Joe31 окт. 2009 г., 12:57
Нет инструментов? Полагаю, вы'мы будем вручную вводить байты в память, а не использоватькомпилятор» построить этот компилятор.
 Hick31 окт. 2009 г., 09:23
я хочу написать свой собственный лексер и парсер .. !! и не используйте какой-либо инструмент !!
 Niki31 окт. 2009 г., 10:59
По крайней мере, ANTLR производит более или менее читаемый код. Изучение сгенерированного лексера может дать вам хорошие идеи о том, как создать свой собственный.

Ваш ответ на вопрос