2013-06-27 2 views
1

Предположим, есть строка в формате, как это:Разбор строки в иерархии классов

"2 + 3 * (5 + 2) * -1 - 2" 

(Просто в качестве примера, он не должен быть арифметическим синтаксис)

Чтобы быть анализируется на основе классов иерархии

add(2,sub(mul(mul(3,add(5,2)),-1),2)) 

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

+0

источников/ссылки начинаются здесь: https://en.wikipedia.org/wiki/Parsing#Overview_of_process – georg

+0

вы также можете посмотреть на http://en.wikipedia.org/wiki/Shunting-yard_algorithm – kindall

ответ

1

Если вы хотите создать эффективный парсер для пользовательского языка (часто называемого языком DSL-домена), вам необходимо посмотреть на генераторы парсера. Они обычно работают следующим образом:

  • Вам необходимо собрать грамматику для вашего языка в определенном формате (грамматика представляет собой правила вашего языка).
  • Генератор синтаксического анализатора предоставляет инструмент, который будет читать вашу грамматику и генерировать код анализатора lexer &, необходимый для анализа операторов.
  • Сгенерированный анализатор лексер & сможет прочитать строку, и если строка соответствует заданной вами грамматике, постройте AST (абстрактное синтаксическое дерево), которое представляет логическую структуру анализируемого.
  • Вы бы тогда интегрировали лексер & парсер в свой собственный инструмент, который на самом деле что-то делает с генерируемым АСТ.

Это хорошая ссылка для parser generators in Python. Единственный из них, с которым я столкнулся, это ANTLR, который я могу рекомендовать как очень способный и мощный.

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

+0

Спасибо ! Я посмотрю. – Erwin

2

Если это юридическое выражение питона вы можете использовать ast module, в частности ast.parse:

>>> import ast 
>>> s = ast.parse("2 + 3 * (5 + 2) * -1 - 2") 
>>> ast.dump(s) 
'Module(body=[Expr(value=BinOp(left=BinOp(left=Num(n=2), op=Add(), right=BinOp(l 
eft=BinOp(left=Num(n=3), op=Mult(), right=BinOp(left=Num(n=5), op=Add(), right=N 
um(n=2))), op=Mult(), right=Num(n=-1))), op=Sub(), right=Num(n=2)))])' 

Использование ast.Visitor вы можете пройти через это дерево.