Войти
ФлеймФорумОбщее

Создание своего языка (программательного).

Страницы: 1 2 Следующая »
#0
13:45, 8 сен 2015

Курю доки по llvm, в частности серию статей о создании простого языка Kaleidoscope.
Первую и вторую главу просмотрел по диагонали - общая информация, непосредственно не касающаяся llvm - лексический и синтаксический анализ, генерация AST.
А вот с третьей главы интересней - демонстрируется генерация кода с помощью llvm api.
В общем, после прочтения серии статей можно сделать такой вывод о последовательности действий:
лексический анализ -> синтаксический анализ (генерация AST) -> обход AST и генерация кода.
Теперь смотрим в сторону C/C++. Во время построения AST мы встречаем такой код:
a * b;

Не зная типов эту последовательность разобрать невозможно - если a и b имеют тип int, то это выражение. обозначающее "умножить a на b".
Если a - это имя типа, то эту последовательность нужно понимать как объявление переменной с именем b и имеющей тип "указатель на a".
Оно и понятно - грамматика контекстно-зависимая, такие дела. Непонятно другое - как с этим бороться?
Можно собирать информацию о типах во время генерации AST, сверяясь с этой инфой при дальнейшем построении.
Но хотелось бы работу с типами оставить на момент обхода дерева, а этап генерации чтоб произвел корректное дерево.

#1
14:46, 8 сен 2015

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

#2
14:51, 8 сен 2015

Tiendil
> Тогда делай грамматику,
> не зависимую от контекста.
Не получится - нужна обратная совместимость с C.

#3
15:54, 8 сен 2015

Olaf85
http://blog.reverberate.org/2013/08/parsing-c-is-literally-undecidable.html

#4
15:59, 8 сен 2015

FordPerfect
> http://blog.reverberate.org/2013/08/parsing-c-is-literally-undecidable.html
Т.е. научно доказано, что С++ говно?

#5
15:59, 8 сен 2015

FordPerfect
Хотел об этом сказать, но я так понимаю автору нужна совместимость не с С++, а с обычным С, где такого нет.

#6
16:36, 8 сен 2015

Нахрен совместимость.

9К720
> Т.е. научно доказано, что С++ говно?
Только сейчас узнал?

Только что Студия мне подсветила... парные скобки?

bool operator < (CellPtr r) { return cell->value > r.cell->value; }

#7
16:39, 8 сен 2015

TarasB
> Только что Студия мне подсветила... парные скобки?
И как только язык у некоторых поворачивается называть студию гордым «блокнот с подсветкой».

#8
16:42, 8 сен 2015

TarasB
Че ты врешь-то: где bool и return подсвеченные?

#9
16:43, 8 сен 2015

TarasB
> Только сейчас узнал?
То что С++ говно я знал и раньше, само собой. Но считал что это эмпирической теорией. Не знал что это доказано с научной точки зрения, формально.

#10
17:12, 8 сен 2015

TarasB
> Нахрен совместимость.
А как же гигабайты написаного кода?
upd: не мной, имею ввиду совместимость с кучей существующих библиотек)

#11
18:35, 8 сен 2015

Olaf85
>Но хотелось бы работу с типами оставить на момент обхода дерева, а этап генерации чтоб произвел корректное дерево.
Ээ обычно все это непотребство разбивают на такие этапы:
1. Лексический анализ - ищем ключевые слова, строки, константы, операторы, избавляемся от комментариев, пробелов и прочего мусора.
2. Синтаксический анализ - о да детка, тут мы разбираем грамматику нашего яп и строим синтаксическое дерево.
3. Семантический анализ - вот тут мы и проверяем корректность типов данных.

Сам я дальше синтаксического анализа не добрался, на нем и заглох )

#12
18:39, 8 сен 2015

Olaf85
Для совместимость с библиотеками совместимость на уровне синтаксиса
1. не нужна (если интерфейс сишный).
2. не поможет (если интерфейс с++, т.е. с классами).

#13
19:11, 8 сен 2015

nes
Попробуем твоим подходом разобрать строку
a * b;
Синтаксический Лексический анализатор выдаст что то типа:
IDENTIFIER(a) OPERATOR(*) IDENTIFIER(b) SEPARATOR(;)
Отлично. Теперь как нам это парсить? Допустим, для каждого нетерминального символа у нас есть свой класс.
Для объявления это будет Declaration, для выражения - Expression. Экземпляр какого из этих классов нам создать, чтоб добавить его к дереву?
kipar
Пункт 1. Нужна чтоб не описывать в своем говноязыке интерфейс к существующим библиотекам.
Хотя ты предложил неплохой вариант - обеспечить возможность линковки к статическим и динамическим библиотекам, а кому нужно, тот пусть прототипы и константы из либы сам пишет.
Нужно над этим подумать..
Свобода от сишного говна..
Хм..

#14
19:13, 8 сен 2015

Olaf85
> Синтаксический анализатор выдаст что то типа:
а не лексический?

Страницы: 1 2 Следующая »
ФлеймФорумОбщее

Тема в архиве.