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

Правило моего "текста" неверно? Такс


person user3640434    schedule 16.05.2014    source источник


Ответы (1)


Никакое правило не является «неправильным» само по себе, правило — это то, чем оно является. Вопрос в том, делает ли он то, что вы хотите? Итак, что вы хотите, чтобы он делал? Что вы хотите принять с помощью вашего парсера и что вы хотите отклонить как синтаксическую ошибку?

Ваше правило text является праворекурсивным, поэтому потребуется много места в стеке синтаксического анализатора (вы поместите весь ввод в стек, а затем уменьшите его справа налево). Левая рекурсия была бы лучше, но если вам по какой-то причине нужно выполнять сокращения справа налево, рекурсия справа подойдет. В ваших действиях нет ничего, что могло бы потребовать сокращения справа налево, поскольку все, что они делают, — это конкатенация строк, которые являются ассоциативными.

Ваше правило text не позволяет NL следовать сразу за TEXT (или eof) - должно быть whitespace после line. Если это то, чего вы хотите, то все в порядке.

Если text соответствует пустой строке, это может привести к конфликтам, если text не является вашей начальной строкой (например, если у вас есть другое правило, такое как input: text line | input text line;).

person Chris Dodd    schedule 16.05.2014