2011-03-07 36 views
0

我写了一个自定义的语言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() 
... 

与此同时,我不想给定线路与所有可能的正则表达式匹配,因为那将是一种浪费。在不丢弃我写下来的所有内容之前,是否有一种解决这个问题的优雅方法,并使其更加高效和易读?

+1

你有没有考虑过使用真正的[parser](http://wiki.python.org/moin/LanguageParsing)? – nmichaels 2011-03-07 20:52:52

+0

这是什么解析器?你能详细说明你正在解析的文本/代码的复杂性吗? – 2011-03-07 20:54:10

+0

@nmichaels:我想我需要更多地了解这一点。谢谢! @Nicolas Buduroi:我正在解析一个字节码反汇编。 – Legend 2011-03-07 20:55:44

回答

2

我不认为这是你正在寻找的答案,但我认为你会用一个实际的Lexer和Tokenizer解析你的语言会有更好的时间。我建议看看并学习使用PLY来完成这种任务。

1

您可能想要创建一个数据结构maps到RE的关键字。但说实话,我会尝试让RE作为第一优先级快速失败,然后循环遍历它们。

失败快速RE的示例将以“^ Sometext”开头,就好像第一个字符与“S”不匹配,然后RE的其余部分不被评估。