识别缩进块的词法分析器

6 投票
2 回答
2450 浏览
提问于 2025-04-16 22:40

我想写一个编译器,用来处理一种用空格来表示程序块的语言,像Python那样。我比较想用Python来做,但C++也可以。如果有一个开源的词法分析器可以帮助我简单地做到这一点,比如像Python的词法分析器那样正确生成缩进(INDENT)和取消缩进(DEDENT)的标识符,那就太好了。如果还有一个对应的解析器生成器,那就更棒了。

2 个回答

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++ 来实现这些。

4

LEPL 是一个纯Python的库,它支持一种叫做“偏离缩进”的解析方式。

撰写回答