【问题标题】:How to do python-like indentation with flex/bison如何使用 flex/bison 进行类似 python 的缩进
【发布时间】:2011-08-23 21:49:23
【问题描述】:

我希望我的语言具有两个特性,使Python 成为一种格式良好的语言:

  • 每行一个语句
  • 块从另一个缩进级别开始,一直持续到结束

谁能给我一个详细的提示,告诉我如何使用flex/bison-like 工具实现这一点?这样的块功能迫使用户编写可读的代码。

【问题讨论】:

    标签: indentation bison flex-lexer


    【解决方案1】:

    您可以尝试在词法分析器中跟踪缩进级别,并为缩进和取消缩进添加伪标记。您将需要保留一堆已经看到的缩进级别,并且需要以不同的方式关心空/仅注释行。但我担心词法分析器最终会变得一团糟,而且你的词法分析器中有一些特定于解析的状态(缩进堆栈)。

    【讨论】:

    • 可惜我只能标记一个作为答案。谢谢,您的意见对我帮助很大。
    【解决方案2】:

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

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

    (示例在页面的中间。)

    【讨论】:

      【解决方案3】:

      我认为没有办法只使用 lex/yacc 来制作类似 python 的语法解析器,因为 lex/yacc 只能处理上下文无关语法,但类似 ​​python 的语法是上下文敏感的。

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

      我建议你在 lex/yacc 之外再做一些额外的逻辑来完成它,这不会那么难。您可以在“语法”模块中阅读代码here

      关键是,让lex/yacc部分解析单个语句,带有缩进级别,然后写一些东西将语句打包成块。

      【讨论】:

      • 说,用 Haskell 的 Parsec 做这件事会不会“更容易”?我听说它不仅仅是上下文无关的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多