识别缩进块的词法分析器
我想写一个编译器,用来处理一种用空格来表示程序块的语言,像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的库,它支持一种叫做“偏离缩进”的解析方式。