如何使用flex / bison进行类似python的缩进

时间:2011-05-12 07:42:53

标签: indentation bison flex-lexer

我希望我的语言有两个功能,使Python格式化得很好:

  • 每行一条陈述
  • 块以另一个缩进级别开始,一直持续到结束

任何人都可以通过flex/bison类似的工具向我详细说明如何实现这一目标吗?这样的块功能会强制用户编写可读代码。

3 个答案:

答案 0 :(得分:16)

您可以尝试跟踪词法分析器中的缩进级别,并为缩进和unindent添加伪标记。您将需要保留一堆已经看到的缩进级别,并且需要不同地关注空/仅注释行。但是我担心最后词法分析器将变成一个难以维护的混乱,并且你的词法分析器中你也有一些特定于语法的句子(缩进栈)。

答案 1 :(得分:11)

Matt Might写了一篇关于独立解析器的文章,其中有一种使用“unput”处理重要空格的方法:

http://matt.might.net/articles/standalone-lexers-with-lex/

(该示例位于页面的中间位置。)

答案 2 :(得分:7)

我认为没有办法只使用lex / yacc创建类似python的语法解析器,因为lex / yacc只能处理Context Free Grammar,但类似python的语法是上下文敏感的。

原因是,如果你想查找一个语句和前一个语句是否在同一个块中,你应该让这个语句知道前一个语句的缩进,即上下文。

我建议你除了lex / yacc之外还要做一些额外的逻辑来实现这个目标,这不会那么难。您可以在“语法”模块中阅读代码here

关键是,让lex / yacc部分解析单个语句,使用缩进级别,并将一些打包语句写入块中。