2013-01-20 48 views
2

我想从头开始为python编写一个词法分析器。但我不知道在哪里以及如何开始。对于初学者,我想假设我们将Python程序作为一组传递给分析器的字符串。分析器应该确定新行的位置以及要查看的适当空白。如何找出python源代码中的新行?我已经阅读了python的词汇规范,我们可以使用基于堆栈的方法来解决使用空格的缩进问题,但无法计算如何查看。它只是使用'\ n'进行正则表达式检查,还是有算法方式来确定这一点?如何从头开始编写词法分析器?

我故意不想使用像lex,yacc或flex这样的东西。

+1

你似乎迷失在你想达到的目标中。您可能会想要使用词法分析器中的令牌进行解析,但是您从未提及与令牌相关的任何内容。你似乎没有意识到基本的字符每字符阅读等。我认真地推荐阅读,至少相关章节,“编译器:原理,技术和工具”一书(通常称为龙的书,因为它的封面上有很好的龙)。 – mmgp

+0

你看过Python自己的词法分析器吗,[在'tokenizer.c'](http://hg.python.org/cpython/file/575eb20cd7d1/Parser/tokenizer.c)? –

+0

龙书是古代(1977年),但绝对值得一读。当我在80年代从事语言开发时,这是一个标准参考。 –

回答

1

我最近开发了一个用于查找SQL语句的解析器。我知道规则是不同的,但方法可能相似。我用python来开发解析器。第一步是找到令牌的开始的正则表达式。然后,我将该列表传递给确定令牌所表示的有限状态机。

规则需要考虑换行符,分号和字符串以及可以跨越行的注释等内容。在python中,你会更关注换行和缩进。

一旦你能够解析出单个语句,那么你应该将它们传递给一个可以解析语句的函数,它可能会采用类似的方法。

您可以在https://github.com/PeterWooster/SQL-Tools/blob/master/SQLStatements.py找到SQL分析器这说明了查找令牌并使用FSM处理它们的方法。是的,它处理跨越换行符的字符串。

相关问题