Как мне улучшить мою технику разбора? - PullRequest
0 голосов
/ 07 марта 2011

Я пишу Python-анализатор для пользовательского языка, и на данный момент у меня есть что-то вроде этого:

re1 = re.compile(r"...")
re2 = re.compile(r"...")
re3 = re.compile(r"...")
re4 = re.compile(r"...")
...
...

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

if line.find("keyword1") >= 0
  # Uses re1 to match the string
  invoke_handler1() 
elif line.find('keyword2") >= 0
  # Uses re2 to match the string
  invoke_handler2() 
...

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

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

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

2 голосов
/ 07 марта 2011

Я не думаю, что это ответ, который вы ищете, но я думаю, вам было бы лучше, если бы вы использовали реальный Lexer и Tokenizer для анализа вашего языка. Я предлагаю посмотреть и научиться использовать PLY для такого рода задач.

1 голос
/ 07 марта 2011

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

Примером аварийного быстрого RE может быть тот, который начинается с «^ Sometext», как будто первый символ не соответствует «S», тогда остальная часть RE не оценивается.

...