Парсер Java CFG, поддерживающий неоднозначности - PullRequest
1 голос
/ 03 января 2011

Я ищу парсер CFG, реализованный на Java. Дело в том, что я пытаюсь разобрать естественный язык. И мне нужны всевозможные разбора деревьев (двусмысленности) не только одного из них. Я уже исследовал многие анализаторы НЛП, такие как анализатор Стэнфорда. Но они в основном требуют статистические данные (древовидный банк, которого у меня нет), и довольно сложно и плохо документировано адаптировать их к новому языку. Я нашел несколько генераторов синтаксического анализатора, таких как ANTRL или JFlex, но я не уверен, что они могут справиться с неопределенностью. Так какой генератор парсера или библиотека Java лучше для меня? Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 03 января 2011

Вы хотите парсер, который использует алгоритм Эрли.Я не использовал ни одну из этих двух библиотек, но PEN и PEP , по-видимому, реализуют этот алгоритм в Java.

1 голос
/ 04 января 2011

Взгляните на соответствующее обсуждение здесь . В своем последнем комментарии в этом обсуждении я объясняю, что вы можете заставить любой генератор синтаксического анализа генерировать все деревья синтаксического анализа путем клонирования дерева синтаксического анализа, полученного до того, как произойдет сбой деривации.

Если ваша грамматика:

G -> ...

Вы бы увеличить как это:

G' -> G {semantic:deal-with-complete-parse-tree} <NOT-VALID-TOKEN>.

Механизм синтаксического анализа в конечном итоге не работает на всех деривациях, но ваша программа также будет иметь:

  • Сохранены клоны всех деревьев.
  • Разобраться с семантикой каждого из деревьев, как они были найдены.

И ANTLR, и JavaCC преуспели, когда я преподавал. Я предпочел ANTLR из-за его лексического анализа BNF и его гораздо менее запутанной истории, видения, у и лицензирования.

1 голос
/ 04 января 2011

Другой вариант - Bison , который реализует GLR . GLR - это алгоритм синтаксического анализа типа LR, который поддерживает неоднозначные грамматики. Bison также генерирует Java-код, в дополнение к C ++.

...