0

我正在为自定义语言编写一个 pythonic 解析器,到目前为止我有这样的东西:

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() 
...

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

4

3 回答 3

3

与其使用您自己的解析器,不如查看可用于 Python的众多解析器库之一。

于 2011-03-07T20:50:55.980 回答
2

我认为这不是您正在寻找的答案,但我认为您会更好地使用实际的 Lexer 和 Tokenizer 来解析您的语言。我建议查看并学习使用PLY来完成此类任务。

于 2011-03-07T20:51:06.587 回答
1

您可能希望创建一个将关键字映射到 RE 的数据结构。但老实说,我会尝试将快速失败的 RE 作为首要任务,然后循环遍历它们。

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

于 2011-03-07T20:52:38.557 回答