Генератор парсера для встроенной документации - PullRequest
0 голосов
/ 04 апреля 2010

Чтобы иметь систему документации общего назначения, которая может извлекать встроенную документацию на нескольких языках, необходим анализатор для каждого языка. Таким образом, необходим генератор синтаксических анализаторов (который на самом деле не должен быть настолько полным или эффективным).

http://antlr.org/ - это хороший генератор синтаксического анализатора, который уже имеет несколько грамматик для популярных языков. Есть ли лучшие альтернативы, то есть более простые, которые поддерживают генерацию синтаксических анализаторов для еще большего количества языков?

Ответы [ 3 ]

0 голосов
/ 04 апреля 2010

Если вы ищете только «частичный анализ», то вы можете использовать опцию ANTLR для частичного «лексирования» потока токенов и игнорирования остальных токенов. Вы можете сделать это, включив filter=true в лексер-грамматике. Затем лексер пытается сопоставить любой токен, который вы определили в своей грамматике, и, когда он не может сопоставить один из токенов, он продвигает один отдельный символ (и игнорирует его), а затем снова пытается сопоставить один из ваших токенов со следующим символом. :

lexer grammar Foo;

options {filter=true;}

StringLiteral
  :  ...
  ;

CharLiteral
  :  ...
  ;

SingleLineComment
  :  ...
  ;

MultiLineComment
  :  ...
  ;

При правильной реализации вы можете MultiLineComment s (/* ... */) из файла Java довольно легко, не боясь однострочных комментариев и строковых или символьных литералов, которые могут испортить ситуацию.

Очевидно, что ваши исходные файлы должны быть корректными, чтобы иметь возможность правильно маркировать файл, в противном случае вы получите странные результаты!

0 голосов
/ 04 декабря 2010

Мой компилятор использует Dypgen. Это расширяемый пользователем анализатор GLR с большим количеством расширений, так что он может анализировать многие языки. Загрузочная грамматика похожа на EBNF (она поддерживает * + и? Непосредственно в ваших продуктах). Он достаточно мощный, чтобы динамически загружать расширения, факт, который использует мой компилятор: основная часть моего языка программирования имеет синтаксис, динамически загружаемый при запуске компилятора.

Dypgen написан на Ocaml и генерирует код Ocaml.

Существует синтаксический анализатор C ++ GLR под названием Elkhound, который достаточно мощный для анализа большей части C ++.

Тем не менее, для ваших реальных требований вам не нужно выполнять какой-либо серьезный анализ: механизм сопоставления регулярных выражений, вероятно, достаточно хорош. Googles re2 может быть подходящим (обеспечивает большинство функций PCRE, намного быстрее и с интерфейсом C ++).

Несмотря на то, что это менее точно, этого достаточно, поскольку вы можете требовать, чтобы встроенная документация придерживалась некоторых простых форматов. Большинство существующих встроенных документов уже делают это по этой причине.

0 голосов
/ 04 апреля 2010

Там, где я работаю, мы использовали GOLD Parser . Это намного проще, чем Antlr, и поддерживает несколько языков. Однако с тех пор мы переехали в Antlr, поскольку нам нужно было выполнить более сложный синтаксический анализ, который, по нашему мнению, лучше для Antlr, чем GOLD.

...