Как мне создать свой собственный парсер для кода java / jsf? - PullRequest
4 голосов
/ 23 марта 2009

Привет, я бы хотел создать свой собственный парсер, например: computing (4+ (3-4 ^ 2)) * 2 или парсинг Java, JSF, HTML-код.

На самом деле я сделал что-то подобное, но чувствую, что это не хорошо.

Есть что-нибудь хорошее для меня? Я пытался читать больше, но я немного запутался, LL, LR, AST, BNF, javacc yacc и т. Д. :). Я не уверен, какой путь, когда я хотел бы вычислить 4 + ...

или если я захочу разобрать java, jsf-код и произвести что-то из этого (другой java-код)

Есть ли что-нибудь достаточно хорошее, например, аст? или что-то, что я могу использовать для обоих?

спасибо за помощь.

Ответы [ 8 ]

2 голосов
/ 23 марта 2009

Прежде всего, вы должны понимать, что все в разборе основано на грамматиках .

Грамматики описывают язык, который вы хотите реализовать, с точки зрения того, как разложить текст на базовые единицы и как в определенном смысле сложить эти единицы. Вы также можете поискать понятия token , non-Terminal , терминал .

Различия между LL и LR могут быть двух видов: различия в реализации и различия в написании грамматики. Если вы используете стандартный инструмент, вам нужно понять только вторую часть.

Я обычно использую грамматику LL (сверху вниз). Их проще написать и реализовать даже с использованием пользовательского кода. Грамматики LR теоретически охватывают больше видов языков, но в нормальной ситуации они являются просто помехой, когда вам нужно какое-то правильное обнаружение ошибок.

Несколько случайных указателей:

  • javacc (Java, LL),
  • antlr (Java, LL),
  • yepp (smarteiffel, LL),
  • бизон (C, LR, GNU версия почтенного yacc )
1 голос
/ 23 марта 2009

ANTLR, но обязательно прочитайте Определенную справку ANTLR , которая проведет вас через создание синтаксических анализаторов. ANTLR выполняет синтаксический анализатор LL сверху вниз, поэтому в книге не рассматриваются LALR и другие типы.

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

BNF - это синтаксис для указания грамматики; ANTLR использует свой собственный, который я считаю более эстетичным, но который другие часто не делают.

1 голос
/ 23 марта 2009

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

1 голос
/ 23 марта 2009

ANTLR это, вероятно, путь для Java. Это немного интенсивно, книга, по-видимому, очень хорошая (я только боролся с онлайн-документами).

Если вы можете перейти на другие языки, тогда lex / yacc (или flex / bison) является стандартом для C, хотя я бы не стал особенно рекомендовать ни одну из этих комбинаций (крутая кривая обучения, теперь немного показывающая их возраст).

В Python доступно около миллиона парсеров (SimpleParse, Yapps) или есть TreeTop для Ruby - у разработчика даже есть демонстрационная программа, которая выполняет простые вычисления, как в вашем вопросе, - но учтите, что это не будет делать все, что анализатор LALR можно выполнить.

1 голос
/ 23 марта 2009

Парсеры могут быть довольно интенсивными для написания. Стандартными инструментами являются bison или yacc для грамматики и flex для синтаксиса. Все эти выходные коды на C или C ++.

0 голосов
/ 23 марта 2009

Использование инструментов, которые генерируют Lexers и парсеры, обычно гораздо проще, чем писать свои собственные с нуля.

В дополнение к тому, что уже было перечислено, вы можете использовать такие вещи, как JLex с CUP , чтобы очень легко создать простой интерпретатор для таких вещей, как арифметические выражения.

0 голосов
/ 23 марта 2009

Возможно, вы захотите проверить Создание синтаксических анализаторов с Java. Автор Steven John Metsker Кажется, что книга точно описывает то, что вы хотите сделать.

0 голосов
/ 23 марта 2009

Вы можете проверить http://antlr.org/. Будет выведен код Java. Насколько я помню, один из их образцов - это почти то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...