Ответ 1
Узнайте о регулярных выражениях, грамматиках и хорошем генераторе парсера.
Даже если вы в конечном итоге реализуете свой собственный парсер, это фундаментальные концепции для реализации любого языка программирования.
Недавно я собирался искать идеи о том, что я смогу построить, используя C этим летом, и я наткнулся на это сообщение: Интересный проект для изучения C?
Внедрение языка программирования. Эта не должно быть ужасно трудно - я сделал язык, который не должен быть названный - но это заставит вас учиться много важных частей C. Если вы не хотите писать лексер и/или парсер самостоятельно, вы можете использовать lex/flex и yacc/bison, но если вы планируете что вы можете начать с несколько меньший проект.
Я как бы заинтриговал реализацию ответа на языковой язык программирования, и мне интересно, как мне это начать? Я прошел через всю книгу K & R, и я тоже сделал некоторые упражнения. У меня также есть немного опыта работы на С++ и Java, если это имеет значение. Какие-нибудь советы? Спасибо!
Узнайте о регулярных выражениях, грамматиках и хорошем генераторе парсера.
Даже если вы в конечном итоге реализуете свой собственный парсер, это фундаментальные концепции для реализации любого языка программирования.
Начните с очень простого (игрушечного) языка; позже вы можете создать более сложный синтаксис.
Вы можете написать интерпретатор для синтаксического анализа строк, например,
integer x
integer y
set x, 2
set y, 5
add x, y // x = x + y
print x
и немедленно оцените каждую строку. Если вы сохраните строки в векторе, было бы легко реализовать циклы с помощью команды goto
.
Пример Другой мир (марочная игра)
Script:
Я бы начал с простой программы калькулятора, которая может читать такие вещи, как:
5 + 10 * 3
и напечатайте ответ. Затем вы можете продвигать его, чтобы добавить переменные, управлять потоком, даже функциями.
Могу ли я просто сказать, что я видел много людей, задающих такие вопросы, как "Как создать язык программирования?" или "Как сложно сделать язык программирования", и большинство ответов просто говорят им, что вам нужно пройти годы университета и читать книги длиной 1000 страниц. Я здесь, чтобы рассказать всем, что вы можете опубликовать эти ответы, но это не помогает им в их путешествии, чтобы сделать язык программирования. Мне 16 лет, я занимаюсь программированием почти 2 года, и я пишу языки программирования. Довольно продвинутые объектно-ориентированные, но я не читал ни одной книги, я не делал 8-летнего университета. Чтобы заставить людей начать, вот простой язык программирования, написанный на С#:
string code = "print Hello World";
foreach (string a in code.Split('\n'))
{
if (a.StartsWith("print "))
{
Console.WriteLine(a.Substring(6));
}
}
любой, кто знает базовый С#, должен уметь это понимать. Вы не можете начинать создавать языки программирования, не имея опыта программирования. Удостоверьтесь, что вы изучаете язык программирования и удостоверяетесь, что знаете об этом много, а затем просто начинайте писать простые кусочки кода, например, я опубликовал, а с экспериментами и практикой вы начнете писать некоторые сложные языки программирования без время:)
Ну, я думаю, что что-то вроде этого действительно сложно сделать, но это был бы отличный проект для домашних животных. У вас должны быть понятия парсеров, лексеров, управления потоком, парадигмы (императивный, функциональный, OO) и многое другое.
Многие говорят, что Книга Дракона - одна из лучших книг для этого. Может быть, вы можете взглянуть на это:)
Удачи!
вы можете прочитать несколько хорошо написанных работ Никлауса Вирта:
хотя эти статьи в основном написаны в Паскале, открытые концепции легко перевести на C.
Я создал простой язык-парсер в Java некоторое время назад, в основном оценил математические выражения, заменил константы и переменные и предоставил некоторую обратную связь по ошибкам синтаксиса/типа.
Самый простой способ, которым я нашел такое, - сделать дерево разбора. Это можно сделать легко, используя два стека, стек оператора и стек результатов. После этого вы можете просто проанализировать его рекурсивно с помощью DFS, возможно, используйте шаблон , если вы решите реализовать его на объектно-ориентированном языке.
Об этом можно многое сказать, и если вы хотите, чтобы я мог объяснить их более подробно, я не сделал этого, потому что думал, что вы захотите попробовать реализовать вышеупомянутое, но если вы это сделаете, просто сообщите мне, и мы сможем поговорить.
Схема из Scratch - это хорошая серия сообщений в блоге о внедрении схемы в C. Код очень читабельен, и каждая версия основывается на предыдущем, что легко отслеживается.
Вот первый взнос: v0.1 - Целые числа.
Другой вариант - создать язык, не глядя ни на что другое. Выясните, что вы можете сделать легко, и оттуда. Например, вы можете разобрать выражения в списке токенов, разделяя их пробелами и использовать префиксную нотацию (с которой достаточно просто справиться). Такого рода вещи - огромное удовольствие, и вы можете многому научиться экспериментировать.
Если вы говорите по-французски, вы можете быть заинтересованы в одном из курсов моих коллег (свободно доступны) http://matthieuamiguet.ch/scientifique/enseignement/langages-et-compilateurs, хотя он использует Python для объяснения концепций построения и компиляции языка.
Английский PDF из PyCon 2010 http://matthieuamiguet.ch/assets/files/scientifique/publis/TeachingCompilersWithPython_Paper.pdf
Мне, возможно, придется поговорить с ним о переводе его информации на английский язык 8)
Один старый учебник по компиляции этот. Хотя это в Паскале, это очень хороший источник информации. Если вы хотите что-то более недавнее, вы должны взглянуть на ANTLR.
Чтобы все было просто, я рекомендую внедрить простой постфиксный язык. FORTH или основная часть PostScript - отличный выбор.
Прочитайте сообщения в сборниках compenpils usenet, они доступны через группы Google. В нем много дискуссий, связанных с построением языка, построением компилятора, lex/yacc, грамматиками и т.п. Разумеется, вам нужно будет хорошо знакомство с такими классиками, как книга драконов, книга тигра из многих книг по компиляторам и хорошие книги по алгоритмам и структурам данных.
Оригинальный компилятор C получает новую жизнь. Большая часть его переписывается, а его кодовая база достаточно мала, чтобы ее можно было читать и понимать в летние каникулы. Рассмотрите возможность чтения кода вместе с документами, которые были использованы для написания кода этого или любого рабочего компилятора, и я уверен, что вы получите представление о том, с чего начать и т.д.
Пусть кто-то сделает грязную работу для вас, а именно лексер и парсер. Используйте кубок, yacc или bison для обработки синтаксиса. Это позволит вам сосредоточиться на более важных решениях для языкового дизайна. Существуют даже примеры парсеров для многих языков, которые вы можете использовать в качестве шаблона для своих.