Как домашний проект, я хотел бы попытаться реализовать базовый язык моего собственного дизайна, который можно использовать в качестве языка веб-сценариев. Запуск программы на C ++ в виде Apache CGI тривиален, поэтому настоящая работа заключается в том, как разобрать входной файл, содержащий некодовый (разметка HTML / CSS) и серверный код.
В моем курсе по компиляции для студентов мы использовали Flex и Bison для создания сканера и анализатора для простого языка. Нам дали копию грамматики и написали анализатор, который переводил простой язык в простую сборку для виртуальной машины. Гибкий сканер токенизирует входные данные и передает токены анализатору Bison.
Разница между этим и тем, что я хотел бы сделать, заключается в том, что, подобно PHP, этот язык может иметь простую разметку HTML и язык сценариев с вкраплениями, как показано ниже:
<p>Hello,
<? echo "World ?>
</p>
Неправильно ли я предположил, что было бы эффективно проанализировать входной файл следующим образом:
- Сканирование ввода до тех пор, пока не будет найден начальный тег скрипта ('
- Второй сканер токенизирует секцию серверного скрипта входного файла (из открытого тега: '') и передает токен парсеру, который не должен знать о разметке в файле.
- Элемент управления возвращается к первому сканеру, который продолжает этот общий шаблон.
По сути, первый сканер различает только разметку (которая возвращается непосредственно в браузер без изменений) и код, который передается второму сканеру, который, в свою очередь, маркирует код и передает токены в анализатор.
Если это , а не сплошной шаблон проектирования, как языки, такие как PHP, эффективно справляются со сканированием ввода и парсинга кода?