如何从零开始编写词法分析器?

3
我想从头开始编写一个Python词法分析器,但我不知道该从哪里开始和如何开始。首先,我希望假设我们将有一个Python程序作为传递给分析器的字符串集。分析器应该找出新行在哪里以及要查看的适当空格。如何找出Python源代码中的新行?我已经阅读了Python的词汇规范,我们可以使用基于堆栈的方法来解决缩进和空格,但是无法确定如何查看。它只是使用'\n'进行正则表达式检查,还是有任何算法方式来确定这一点呢?
我故意不想使用lex、yacc或flex等工具。

1
你似乎迷失在你想要实现的目标中。你可能想要使用词法分析器中获得的标记进行解析,但你从未提到与标记相关的任何内容。你似乎不了解基本的逐字符读取等操作。我强烈建议至少阅读与此相关的章节,即《编译原理:原理、技术和工具》(通常称为“龙书”,因其封面上有一只可爱的龙)。 - mmgp
你看过Python自己的词法分析器吗,tokenizer.c里面? - Gareth Rees
《龙书》虽然出版于1977年,但绝对值得一读。在我80年代从事语言开发时,它是标准参考书。 - Peter Wooster
1个回答

1

我最近开发了一个用于查找SQL语句的解析器。虽然规则不同,但方法可能相似。我使用Python开发了这个解析器。第一步是使用正则表达式找到标记的开始位置。然后将该列表传递给有限状态机,以确定标记表示什么。

规则需要考虑诸如换行符、分号、跨越多行的字符串和注释等因素。在Python中,您需要更关注换行符和缩进。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接