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

Lan*_*nbo 17 indentation bison flex-lexer

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

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

任何人都可以给我一个关于如何用flex/bison类似工具实现的详细提示吗?这种块特征迫使用户编写可读代码.

Rud*_*udi 16

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

  • 可惜我只能将一个标记为答案.谢谢,您的意见对我帮助很大. (2认同)

wla*_*oth 11

Matt Might写了一篇关于独立解析器的文章,使用"unput"处理重要的空格:

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

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


neu*_*ont 7

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

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

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

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