Что использовалось при разработке транспайлеров Python → 11l и 11l → C++

alextretyak

Administrator
Staff member
#1
1. Лексический анализатор.
Ничего не использовал. Руководствовался при его разработке только логикой, а также базовыми понятиями (т.е. информацией о том, что лексический анализатор разбивает исходный код на лексемы/токены). Ну ещё [при составлении списка категорий/классов токенов] я немного подсмотрел в документацию к Python.
Вариант использовать какой-либо генератор лексического анализатора я сразу отбросил, так как "блоковыделение" в 11l настолько непохоже на другие языки программирования, что эту логику закодировать вручную гораздо проще, чем использовать генератор.
[Также хочу отметить, что, не смотря на то, что во многих книгах по разработке компиляторов, упоминается возможность построить лексический анализатор на регулярных выражениях, лично я вообще не понимаю как это сделать в сколь-либо серьёзном анализаторе.]

2. Синтаксический анализатор.
Когда искал ‘rust operator precedence’ в Google, вышел на статью Top-down Operator Precedence Parsing in Rust.
Перешёл по ссылке в первом комментарии и увидел:
Pratt’s technique for handling operator precedence and infix expressions is so simple and effective it’s a mystery why almost no one knows about it.
Полез в Википедию и оттуда вышел на статью Simple Top-Down Parsing in Python.
Затем я перевёл Python-код из этой статьи в C++ (в частности, избавился от декоратора @method). А затем этот код на C++ я перевёл [обратно] в Python.
Таким образом, мой парсер/‘синтаксический анализатор’ полностью опирается лишь на технику Pratt'а, и никакой грамматики языка я не составлял.
P. S. Выражаю благодарность Дугласу Крокфорду за популяризацию этой техники (именно на его статье Top Down Operator Precedence была основана статья Simple Top-Down Parsing in Python).
Его слова о Pratt parser-е:
21:34 I think this is one of the
21:35 most beautiful elegant things I've ever seen.
... this is the single
34:58 most brilliant function I've ever seen
35:01 in my whole career in this Pratt has
35:05 taken all of the theory of parsing and
35:07 all of its complexity and reduced it to
35:09 a simple loop
 
Last edited:
Top