Python 识别缩进块的Lexer
我想为一种用空格表示程序块的语言编写一个编译器,比如Python。我更喜欢用Python来做这件事,但是C++也是一种选择。是否有一个开源lexer可以帮助我轻松地做到这一点,例如像Python lexer那样正确地生成缩进和DEDENT标识符?相应的解析器生成器将是一个加号。如果您使用的是类似于lex的东西,您可以这样做: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
^[ \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,我不认为这是重复的。