Python 识别缩进块的Lexer

Python 识别缩进块的Lexer,python,compiler-construction,whitespace,lexer,Python,Compiler Construction,Whitespace,Lexer,我想为一种用空格表示程序块的语言编写一个编译器,比如Python。我更喜欢用Python来做这件事,但是C++也是一种选择。是否有一个开源lexer可以帮助我轻松地做到这一点,例如像Python lexer那样正确地生成缩进和DEDENT标识符?相应的解析器生成器将是一个加号。如果您使用的是类似于lex的东西,您可以这样做: ^[ \t]+ { int new_indent = count_indent(yytext); i

我想为一种用空格表示程序块的语言编写一个编译器,比如Python。我更喜欢用Python来做这件事,但是C++也是一种选择。是否有一个开源lexer可以帮助我轻松地做到这一点,例如像Python lexer那样正确地生成缩进和DEDENT标识符?相应的解析器生成器将是一个加号。

如果您使用的是类似于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. */
                     }
^[\t]+{int new_indent=count_indent(yytext);
if(新缩进>当前缩进){
当前缩进=新缩进;
返回缩进;
}否则如果(新缩进<当前缩进){
当前缩进=新缩进;
返回DEDENT;
}
/*否则什么也不做,这样
基本上可以处理缩进和DEDENT
作为打开和关闭大括号*/
}
您可能需要一些额外的逻辑,例如忽略空行,并在需要时自动在文件末尾添加DEDENT

据推测,count_indent将考虑根据制表符停止值将制表符转换为空格


我不知道Python的lexer/parser生成器,但我发布的内容应该与lex/flex一起使用,您可以将其连接到yacc/bison来创建解析器。你可以使用C或C++来使用这些。

是纯Python,支持越位解析。

你必须小心,因为你可能需要在行的开头添加多个DEDENT令牌,而不仅仅是一个。Python建议使用一个堆栈来维护它。谢谢。这对我来说似乎是一个完美的工具。这个问题来自近十年前。我不能说我记得很多。不过,从描述来看,这个问题更倾向于python和另一个C。为了提供上述出乎意料的注释的上下文,有一个问题是,这是一个复制的。结束此操作的人员已删除他们的问题。FWIW,我不认为这是重复的。