Comments 8
Лексический анализатор и теория компиляторов, не?
Помню когда-то давно актуальной была "книга дракона" про компиляторы и если берешься городить свой колхоз не читая ее, то били больно кандеябром по башке, пока не поумнеешь.
Лет 20 прошло, теперь есть llvm, писать все с нуля нет необходимости. Нужен новый язык? Делай фронтенд к llvm по получай компиляцию своего языка на миллион платформ. Нужна поддержка новой платформы? Делай бакенд llvm и получай миллион языков, которые компилируются под твою платформу.
Но если все-таки хочется написать с нуля, есть что более новое, или книга дракона все еще стандарт?
LLVM разобранный текст в машинный код превращает хорошо. А разбирать текст — где слово, где строка, где комментарий — всё равно самому. Статья про это.
Остальное пишу сам, потому что хочу увидеть своими глазами, как из текста получаются байты.
«Дракон» жив, но сейчас чаще советуют «Crafting Interpreters» Нистрома (бесплатно онлайн) и «Engineering a Compiler» Купера и Торцона.
А разбирать текст — где слово, где строка, где комментарий — всё равно самому.
А для этого, в идеале, надо написать ABNF-грамматику своего языка. Ну а по ней уже можно построить конечный автомат лексера, который переведёт .string "http://x" в лексемы <KEYWORD, DATA_STRING>, <STRING, "http://x">, <EOL>.
Так и вышло, только в обратном порядке: автомат в статье написан руками, а грамматики к нему нет. Согласен, что правильно наоборот — с записанной грамматикой дыра с "http://x" была бы видна на бумаге, а не после сборки. Для ассемблера в сотню строк я её пропустил, и вот результат.
Это у вас никоим образом не конечный автомат. КА (FSM) - это система, читающая вход строго последовательно по одному символу и переходящая по состояниям в зависимости от текущего состояния и полученного символа. Там не должно быть никаких match, split, strip и т.п.
Формально да, это рукописный сканер, а не автомат: заглядываю на два символа вперёд, а конец блочного комментария ищу через find, а не по состояниям. Но match, split и strip в tokens() нет. Проход посимвольный, слева направо, состояние сидит в циклах. Они в read_lines и _render: это мост к старому ассемблеру, который пока не умеет есть токены.
Положил http:// в строку, и ассемблер молча собрал 0 байт