Разбор текста с помощью Byacc
Higuys, я хочу, чтобы синтаксический анализ текста с помощью Byacc. Текст сделан четко пробелами и новой строкой. Что вы думаете об этих правилах для разбора одного текста?
text: /* empty string */ {$$ = "";}
|TEXT {$$ = $1;}
|TEXT whitespace text {$$ = $1 + $2 + $3;}
|TEXT line whitespace text {$$ = $1 + $2 + $4;}
Токен TEXT находится в файле Jflex и представляет собой одно слово. Два других правила, пробел и строка не работают:
line : NL { $$ = System.lineSeparator(); }
| line NL { $$ = $1 + System.lineSeparator(); }
whitespace: WHITESPACE {$$ = " ";}
|whitespace WHITESPACE {$$ = $1 + " ";}
Правильно ли мое "текстовое" правило? Thaks
1 ответ
Ни одно правило не является "неправильным" само по себе, правило является тем, чем оно является. Вопрос в том, делает ли он то, что вы хотите? Так что вы хотите, чтобы это было сделано? Что вы хотите принять со своим парсером и что вы хотите отклонить как синтаксическую ошибку?
Ваш text
Правило рекурсивно справа, поэтому потребует много места в стеке синтаксического анализатора (вы поместите весь ввод в стек, а затем уменьшите его справа налево). Левая рекурсия будет лучше, но если вам по какой-то причине нужно делать сокращения справа налево, правая рекурсия подойдет. В ваших действиях нет ничего, что могло бы потребовать сокращения справа налево, поскольку все, что они делают - это конкатенации строк, которые являются ассоциативными.
Ваш text
правило не позволяет NL
немедленно следовать TEXT
(или eof) - должно быть whitespace
после line
, Если это то, что вы хотите, то это нормально.
имеющий text
совпадение с пустой строкой, скорее всего, приведет к конфликтам, если text
не ваша стартовая строка (например, если у вас есть другое правило, например input: text line | input text line;
).