【发布时间】:2011-08-23 21:49:23
【问题描述】:
我希望我的语言具有两个特性,使Python 成为一种格式良好的语言:
- 每行一个语句
- 块从另一个缩进级别开始,一直持续到结束
谁能给我一个详细的提示,告诉我如何使用flex/bison-like 工具实现这一点?这样的块功能迫使用户编写可读的代码。
【问题讨论】:
标签: indentation bison flex-lexer
我希望我的语言具有两个特性,使Python 成为一种格式良好的语言:
谁能给我一个详细的提示,告诉我如何使用flex/bison-like 工具实现这一点?这样的块功能迫使用户编写可读的代码。
【问题讨论】:
标签: indentation bison flex-lexer
您可以尝试在词法分析器中跟踪缩进级别,并为缩进和取消缩进添加伪标记。您将需要保留一堆已经看到的缩进级别,并且需要以不同的方式关心空/仅注释行。但我担心词法分析器最终会变得一团糟,而且你的词法分析器中有一些特定于解析的状态(缩进堆栈)。
【讨论】:
Matt Might 写了一篇关于独立解析器的文章,介绍了一种使用“unput”处理重要空白的方法:
http://matt.might.net/articles/standalone-lexers-with-lex/
(示例在页面的中间。)
【讨论】:
我认为没有办法只使用 lex/yacc 来制作类似 python 的语法解析器,因为 lex/yacc 只能处理上下文无关语法,但类似 python 的语法是上下文敏感的。
原因是,如果要查找一个语句和前一个语句是否在同一个块中,你应该让这个语句知道前一个语句的缩进,这就是上下文。
我建议你在 lex/yacc 之外再做一些额外的逻辑来完成它,这不会那么难。您可以在“语法”模块中阅读代码here。
关键是,让lex/yacc部分解析单个语句,带有缩进级别,然后写一些东西将语句打包成块。
【讨论】:
Parsec 做这件事会不会“更容易”?我听说它不仅仅是上下文无关的。