Мне нужно написать парсер вручную. Невозможно выбрать между LL (*) и LR (возможно, попробуйте Эрли?). Должен ли я использовать восходящий синтаксический анализ, потому что грамматика для LL будет довольно сложной?Написание ручного парсера
ответ
Это зависит от грамматики, которую вы пытаетесь использовать. У LL есть некоторые проблемы с неопределенностью в грамматике (вам нужно сделать все оставлено без рекурсии).
Если вы не можете решить, перейдите к LR (1) или LALR. Может быть, даже GLR.
Простейший тип анализатора для записи вручную - это рекурсивный парсер спуска, который находится в семействе парсеров LL. большинство других типов парсера либо трудно писать вручную (LALR-парсеры, которые используют таблицы больших состояний), либо предназначены для синтаксического анализа сложных языков (таких как синтаксисы Эрли для анализа естественных языков).
wikipedia имеет хорошую информацию об анализе рекурсивного спуска.
Я бы пошел либо с помощью рекурсивного анализатора спуска, либо, может быть, с хвостовым рекурсивным парсером спуска (то есть LL) или с парсером с приоритетом оператора сверху вниз.
Семейство пар LR, будь то LR, LALR (k), LALR (1), GLR или что-то еще слишком «странное», чтобы держать вас в голове. Если вы попытаетесь написать один из них, вы, как правило, в конечном итоге внедряете генератор парсеров в любом случае, просто для того, чтобы оставаться в здравом уме.
О, бред. Я использую LALR с 1979 года без какой-либо необходимости реализовать собственный генератор парсера. – EJP
Это зависит от того, на каком языке вы пытаетесь разобрать. Без дополнительной информации о вашей заявке невозможно дать какое-либо разумное предложение. Вы также можете посмотреть «связанные» вопросы (прокрутите вниз и посмотрите вправо). Здесь много вопросов о разборе и много хорошего обсуждения. –
Зачем вам нужно * написать парсер вручную? В этом, как правило, нет большой ценности. –
Я не могу использовать yacc или другие парсеры, где мой парсер будет работать – mystdeim