2010-04-03 3 views
0

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

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

+0

Простые генераторы парсера для обработки * больше * языков? Генераторы парсеров причины сложны, чтобы справиться со множеством осложнений, которые, как кажется, привносят многие языки. –

+0

См. Ответы на вопрос SO Source of Parsers for Programming Languages

ответ

0

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

lexer grammar Foo; 

options {filter=true;} 

StringLiteral 
    : ... 
    ; 

CharLiteral 
    : ... 
    ; 

SingleLineComment 
    : ... 
    ; 

MultiLineComment 
    : ... 
    ; 

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

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

-1

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

+0

GOLD AFAIK - чистый генератор парсеров LALR (1), например, Bison и YACC. Недостатком такого генератора синтаксического анализа является то, что практически каждый настоящий компьютерный язык программирования не имеет естественной грамматики LALR (1), и поэтому требуется огромное количество энергии для изгиба и скручивания грамматики в соответствии с генераторами парсера LALR (1), включенными GOLD , Генераторы парсеров LALR (1) идеально подходят только для локальных доменных языков, которые * разработаны *, чтобы иметь LALR (1) грамматики. –

0

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

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

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

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

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

Смежные вопросы