Создание парсера на языке Python из источника JavaCC? - PullRequest
1 голос
/ 17 сентября 2010

Я имею в виду ??? в названии, потому что я не совсем уверен. Позвольте мне объяснить ситуацию.

Я не студент информатики и никогда не учился на курсах по компиляции. До сих пор я думал, что авторы компиляторов или студенты, которые прошли курс по компиляторам, являются выдающимися, потому что им приходилось писать компонент Parser компилятора на любом языке, на котором они пишут компилятор. Это не легкая работа, верно?

Я имею дело с проблемой поиска информации. Мой желаемый язык программирования - Python.

Parser Nature: http://ir.iit.edu/~dagr/frDocs/fr940104.0.txt - образец корпуса. Этот файл содержит около 50 документов с некоторой разметкой в ​​стиле XML. (Вы можете увидеть это в приведенной выше ссылке). Мне нужно записать другие некоторые другие значения, такие как <DOCNO> FR940104-2-00001 </DOCNO> & <PARENT> FR940104-2-00001 </PARENT>, и мне нужно только проиндексировать часть документа <TEXT> </TEXT>, содержащую несколько различных тегов, которые мне нужно сократить, и множество комментариев <!-- -->, которые должны игнорироваться и некоторые &hyph; &space; &amp; символьные объекты. Я не знаю, почему в corpus есть такие вещи, когда он знает, что он не предназначен ни для просмотра браузером, ни для правильного XML-документа.

Я подумал об использовании любого синтаксического анализатора Python XML и извлечения нужного текста. Но после небольшого поиска я нашел Исходный код анализатора JavaCC (Parser.jj) для того же корпуса, который я использую здесь . Быстрый просмотр JavaCC , за которым следует Компилятор-компилятор , показал, что, в конце концов, авторы компилятора не так хороши, как я думал. Они используют компилятор-компилятор для генерации кода парсера на желаемом языке. Вики говорят, что ввод в компилятор-компилятор - это ввод грамматики (обычно в BNF). Вот где я потерялся.

  1. Является ли Parser.jj грамматикой (вход в компилятор-компилятор, называемый JavaCC)? Это определенно не BNF. Как называется эта грамматика? Почему эта грамматика имеет язык Java? Разве нет универсального грамматического языка?
  2. Я хочу парсер Python для разбора корпуса. Есть ли способ, как я могу перевести Parser.jj, чтобы получить эквивалент Python? Если да, что это? Если нет, каковы мои другие варианты?
  3. Случайно кто-нибудь знает, что это за корпус? Где его первоисточник? Я хотел бы увидеть описание для этого. Распространяется в интернете с именем frDocs.tar.gz

Ответы [ 2 ]

2 голосов
/ 18 сентября 2010

Почему вы называете эту разметку в стиле XML?- это выглядит как довольно стандартный / базовый XML для меня.Попробуйте elementTree или lxml.Вместо написания парсера используйте одну из стабильных, хорошо защищенных библиотек, которые уже существуют.

1 голос
/ 17 сентября 2010

Вы не можете построить синтаксический анализатор - не говоря уже о целом компиляторе - из (n E) BNF-грамматики - это просто грамматика, то есть синтаксис (и некоторый синтаксис, такой как правила блоков Python, основанные на отступах, не могут быть смоделировано в нем вообще), а не семантика. Либо вы используете отдельные инструменты для этих аспектов, либо используете более продвинутую среду (например, Boost :: Spirit в C ++ или Parsec в Haskell), которая объединяет оба.

JavaCC (подобно yacc) отвечает за генерацию синтаксического анализатора, то есть подпрограммы, которая имеет смысл для чтения токенов из исходного кода. Для этого они смешивают (E) BNF-подобную нотацию с кодом, написанным на языке, на котором будет получен синтаксический анализатор (например, для построения дерева синтаксического анализа) - в данном случае Java. Конечно, было бы возможно придумать другой язык - но поскольку существующие языки могут справляться с этими задачами относительно хорошо, это было бы довольно бессмысленно. А поскольку другие части компилятора могут быть написаны от руки на том же языке, имеет смысл оставить «У меня есть токены, что мне с ними делать?» часть человеку, который напишет эти другие части;)

Я никогда не слышал о "PythonCC", и Google тоже не слышал (ну, есть проект "pythoncc" в коде Google, но в его описании просто говорится "pythoncc - программа, которая пытается генерировать оптимизированный машинный код для скриптов Python"). "и не было никакого коммита с марта). Вы имеете в виду любую из этих библиотек / инструментов разбора python? Но я не думаю, что есть способ автоматически преобразовать код javaCC в эквивалент Python - но все это выглядит довольно просто, так что если вы погрузитесь изучите синтаксический анализ с помощью javaCC и [библиотеки / инструмента по вашему выбору], вы можете перевести его ...

...