pavia писал(а):
Согласно теории язык должен быть LR(N). Лучше LR(1). Типичным примером такого компилятора является Borland Pascal. В нём нет AST.
"Смешались в кучу кони, люди" (с). Этот ужас свидетельствует о вашей низкой теоретической подготовке. Вы применяете кучу умных слов, притягиваете за уши ханойские башни и кенгуру, чтобы создать видимость наукообразности. Пожалуйста, так не делайте.
1. В первой фразе вы "внезапно" смешали в кучу синтаксис языка и грамматику.
Язык не бывает ни LR(N) ни каким-то другим. Принято говорить, что
синтаксис языка
допускает грамматику LR(N). Разные грамматики могут порождать один и тот же язык, соответственно, один и тот же язык можно выразить при помощи разных грамматик, многое зависит от вашего умения составлять такую грамматику для заданного языка.
2. Для
любого детерминированного контекстно свободного языка существует LR(N) грамматика.
3. Далее, каждая LR(N)-грамматика может быть автоматически преобразована в LR(1) грамматику. Таким образом, если ваш язык детерминированный контекстно свободный (а таких большинство), то вы обязательно можете создать для него LR(1)-парсер. Из сложных для разбора языков мне известны, пожалуй, только два - FORTRAN (незначащие пробелы не позволяют провести лексический анализ в отрыве от синтаксического) и PL/1 (классический случай контекстно-зависимого языка, т.к. в нём нет зарезервированных слов, –
смысл лексемы зависит от её контекста). Следовательно, пользуясь вашей терминологией, любой контекстно свободный язык является LR(1) языком.
4. Затем вы также "внезапно" смешали понятия языка и компилятора. С точки зрения компиляторостроения современные инструменты позволяют легко реализовать любую КСГ. Более того,
вообще нет необходимости составлять LR(1) или LR(N) грамматику, достаточно описать синтаксис языка в формате BNF и генератор типа YACC/Bison самостоятельно сгенерирует вам нужный парсер. Также, как правильно заметил Nable, синтаксический анализ - достаточно простая задача, в современном компиляторе занимает o-малое от времени работы компилятора и от его сложности. Основное - это оптимизация.
5. Простите, а причём здесь AST??? "Летели два крокодила - один зелёный, другой на север". AST может являться продуктом
любой грамматики, а может и не являться, если не захотите. Смысл AST заключается не в том, чтобы его избежать, а в том, что он представляет собой удобное промежуточное представление для выполнения ряда задач, связанных с определением
семантики программы, которые не могут быть выполнены в рамках синтаксического разбора. Например, для проверки и выведения типов, определения областей видимости и использования.
SII писал(а):
Не в курсе, случаем, как с этим делом у Це++? (т.е. насколько далеко вперёд надо смотреть)
У C++ с этим делом всё нормально. Он является классическим контекстно-свободным языком, как и почти все остальные языки. Есть некоторые проблемы с
лексическим анализом, так как C/C++ утратили свойство
регулярности с появлением так называемых "сырых строковых литералов" (raw string literals), но такие литералы - общая тенденция современных языков, C/C++ здесь не уникальны.