Здравствуйте, vdimas, Вы писали:
F>>Но по голому факту: мэйнстрим фронты используют ужаснейший recursice descent.
V>Это просто декомпозиция грамматик.
V>Очевиднейший пример такой декомпозиции: лексер+парсер.
V>Лексер всегда работает по восходящей грамматике, а парсер может работать по любой — восходящей, нисходящей или гибридной (есть и такие алгоритмы, угу).
V>recursice descent в этом смысле — это декомпозиция грамматики на несколько НЕЗАВИСИМЫХ областей.
Слушай, не нельзя такой бред нести на публике. "recursice descent" — это алгоритм. Лексер работает по регулярной грамматике, которая тупо переписывается в ДКА. Никаких рекурсий в лексере нет! Там тупое чтение по автомату.
Где ты такую кашу в мозг заложил то?
V>Простой пример: нет смысла парсить вычисления формул в синтаксисе объявлении класса или заголовков методов в C#. А вот внутри тел методов — есть, но зато внутри тел методов нельзя объявлять другие классы, поэтому эта часть грамматики внутри тел методов НЕ нужна. Вот тебе и декомпозиция.
Как этой банальностью можно оправдать заявление о том, что "recursice descent" — это не алгоритм, а способ декомпозиции?
Что ты несешь?
Что касается парсинга классов внутри методов, то в С++ именно так и происходит, а выражения встречаются в разных инициализаторах полей и конструкторах, которые тоже на топлевеле.
И вообще зачем парсеру какая-то декомпозиия, когда правила явно ссылаются друг на друга? Если правило не сослалось на другое, то оно его и не использует.
"recursice descent" — это просто самый быстрый и простой для ручной реализации алгоритм парсинга для однозначных грамматик. Проблес с ним масса. Но кода ты пишешь парсер руками — это самый логичный выбор.