Разбор текста с помощью 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;).

Другие вопросы по тегам