词法分析器识别缩进块

6

我希望编写一个编译器,用类似Python的空格来表示程序块。我更喜欢使用Python编写,但C++也是一个选择。是否有开源的词法分析器可以帮助我轻松地完成这项工作,例如像Python词法分析器一样正确生成INDENT和DEDENT标识符?相应的解析器生成器是一个加分项。


这个问题来自将近十年前。我不能说我记得很多。不过从描述来看,这个问题更偏好Python而另一个则用C。 - Elektito
为了解释上面突然出现的评论,有人问这是否是 https://dev59.com/HHM_5IYBdhLWcg3wWRyV 的重复问题。关闭此问题的人已经删除了他们的问题。就我个人而言,我不认为这是一个重复的问题。 - Elektito
2个回答

4

LEPL 是纯Python编写的,支持缩进解析。


谢谢。这似乎是我需要的完美工具。 - Elektito

1
如果您正在使用像lex这样的工具,可以按照以下方式执行:
^[ \t]+              { int new_indent = count_indent(yytext);
                       if (new_indent > current_indent) {
                          current_indent = new_indent;
                          return INDENT;
                       } else if (new_indent < current_indent) {
                          current_indent = new_indent;
                          return DEDENT;
                       }
                       /* Else do nothing, and this way
                          you can essentially treat INDENT and DEDENT
                          as opening and closing braces. */
                     }

你可能需要一些额外的逻辑,例如忽略空行,并在需要时自动添加DEDENT到文件末尾。

假设count_indent会考虑根据制表位值将制表符转换为空格。

我不知道Python的词法/语法分析器生成器,但我发布的内容应该可以与lex/flex一起使用,并且您可以将其连接到yacc/bison以创建解析器。您可以使用C或C++。


5
请注意,这一点需要小心,因为您可能需要在一行开头添加多个DEDENT令牌,而不仅仅是一个。Python建议使用堆栈来维护这一点。 - templatetypedef

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