2010-07-23 2 views
0

Есть ли хорошие бесплатные синтаксические программы на Python или Java?Какие хорошие бесплатные синтаксические программы?

В последнее время я использую много текстовых файлов, и все они разные. Я потратил много времени на написание кода для анализа этих текстовых файлов. Мне было интересно, есть ли какая-то программа, которая могла бы получить все имена человека из текстового файла или проанализировать файл на основе ключевого слова.

+1

Что именно вы хотите разобрать? – DOK

+0

В зависимости от того, какой формат файла вы хотите разбор, например.XML, HTML, обычный текст, возможно, вам придется использовать разные механизмы. – Martin

+0

Я имею дело с простым текстом. –

ответ

3

ANTLR является довольно популярным и даже имеет IDE, чтобы помочь вам развить/проверить свои грамматик.

1

Посмотрите на JavaCC.

От JavaCC FAQ:

JavaCC выступает за "Java Compiler Compiler "; это генератор синтаксического анализатора и генератор лексического анализатора. JavaCC прочитает описание языка и сгенерирует код, написанный на Java, , который будет читать и анализировать этот язык . JavaCC особенно полезно, когда вы должны написать код для сделки с языка ввода имеет сложную структуру

0

Это зависит от того, что вам нужно проанализировать.

Если вам нужно решить конкретный проблемный домен, тогда лучший способ - создать domain-specific language и parse it in Groovy.

4

Pyparsing хороший Python дополнительный модуль для обычного текста. Легко получить что-то быстро, но имеет достаточно вспомогательных компонентов, чтобы выполнить довольно сложную работу по синтаксическому анализу. См. http://pyparsing.wikispaces.com и ознакомьтесь с страницей примеров. (Плюс это очень либерально лицензировано, поэтому нет никаких ограничений или обременений времени исполнения.)

0

Если текст имеет известный формат, может быть лучшим выбором для анализа грамматики.

Gold Parser является открытым исходным кодом и поддерживает как Java, так и Python.

+0

Goldparser хорош, но он очень медленный. Даже с оптимизированным по скорости кодом C++ требуется 10 секунд для анализа 15000 строк кода. Если сравнить это со скоростью парсера PHP, это очень медленно. – Elmue

0

Lepl - универсальный рекурсивный парсер спуска для Python, который я поддерживаю.

Это похоже на pyparsing, поскольку оба являются синтаксическими анализаторами, которые вы пишете непосредственно в Python. Вот пример, который анализирует и оценивает арифметическое выражение:

>>> from operator import add, sub, mul, truediv 

>>> # ast nodes 
... class Op(List): 
...  def __float__(self): 
...   return self._op(float(self[0]), float(self[1])) 
... 
>>> class Add(Op): _op = add 
... 
>>> class Sub(Op): _op = sub 
... 
>>> class Mul(Op): _op = mul 
... 
>>> class Div(Op): _op = truediv 
... 

>>> # tokens 
>>> value = Token(UnsignedFloat()) 
>>> symbol = Token('[^0-9a-zA-Z \t\r\n]') 

>>> number = Optional(symbol('-')) + value >> float 
>>> group2, group3 = Delayed(), Delayed() 

>>> # first layer, most tightly grouped, is parens and numbers 
... parens = ~symbol('(') & group3 & ~symbol(')') 
>>> group1 = parens | number 

>>> # second layer, next most tightly grouped, is multiplication 
... mul_ = group1 & ~symbol('*') & group2 > Mul 
>>> div_ = group1 & ~symbol('/') & group2 > Div 
>>> group2 += mul_ | div_ | group1 

>>> # third layer, least tightly grouped, is addition 
... add_ = group2 & ~symbol('+') & group3 > Add 
>>> sub_ = group2 & ~symbol('-') & group3 > Sub 
>>> group3 += add_ | sub_ | group2 

... ast = group3.parse('1+2*(3-4)+5/6+7')[0] 
>>> print(ast) 
Add 
+- 1.0 
`- Add 
    +- Mul 
    | +- 2.0 
    | `- Sub 
    |  +- 3.0 
    |  `- 4.0 
    `- Add 
     +- Div 
     | +- 5.0 
     | `- 6.0 
     `- 7.0 
>>> float(ast) 
6.833333333333333 
>>> 1+2*(3-4)+5/6+7 
6.833333333333333 

Основные преимущество ЮЛПП над Pyparsing является то, что это немного более мощным (он может компилировать себя с регулярными выражениями в местах для скорости, ручка леворекурсивным грамматика, использует батут, чтобы избежать пробега в стеке). Основными недостатками являются то, что он моложе, чем pyparsing, поэтому не имеет такого же количества пользователей или большого и поддерживающего сообщества.

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