【问题标题】:How to tokenize indents in Coco/R (Python, Boo like indentation)如何在 Coco/R 中标记缩进(Python,类似缩进的 Boo)
【发布时间】:2011-01-13 22:03:19
【问题描述】:

有一种众所周知的方法,如何在 Coco/R 中像 Python/Boo 一样实现标记化缩进?

Coco/R 会忽略空格,但我需要根据下一行缩进以某种方式生成 beginBlock/endBlock 标记。

现在,我使用预处理器,它插入 '{'、'}' 和 ';'在输入流中,通过比较行之间的缩进。在 Coco/R 语法中,我使用弯括号作为 beginBlock/endBlock 标记。如果输入流没有注释(也可以嵌套),它会很好地工作。一旦无序的 cmets 出现,意图比较逻辑就会失败。

实现一个跟踪 cmets 的预处理器在我看来像是过度设计。

所以问题是,通常是否可以使用 Coco/R 解析基于缩进的语法? 还是我应该尝试其他方法?

【问题讨论】:

    标签: c# cocor


    【解决方案1】:

    找到了一个理想的方法来做到这一点。

    • 使用以下方法包装 GetNextToken 比较下一个流的位置 与最后一个令牌。

    • 如果 position.Y 改变了,但是 position.X 增加 N 个标签,注入 N 虚拟 INDENT 令牌。

    • 如果 position.Y 改变了,但是 position.X 减少了 N 个标签,注入 N 虚拟 DENDENT 令牌。

    • 如果 position.Y 改变了,但是 position.X 不是,注入虚拟 SEPARATOR 令牌。

    • 如果 position.Y 没有改变,返回 原始的下一个令牌。

    • 如果之前的令牌是软中断(在 python \ 中), 忽略上面的逻辑。

    【讨论】:

      【解决方案2】:

      首先,Coco/R 默认只忽略空格。选项卡不会被忽略:

      2.3.5 空白
      空格、制表符或换行符等字符 符号通常被认为是 应该被忽略的空白 扫描仪。空白被忽略 默认。如果其他字符应该 也被忽略,用户必须 按以下方式指定它们:

      WhiteSpaceDecl = "IGNORE" 设置。

      示例 IGNORE '\t' + '\r' + '\n'

      我没有对此进行测试,但我猜你应该覆盖扫描仪的默认行为:

      Token NextToken() {
          while (ch == ' ' ||
              false
          ) NextCh();
      

      最简单的方法是首先修改生成的代码,直到它可以正常工作,然后在框架文件(Scanner.frameParser.frame)中进行相同的更改,这样您就不会在重新生成后丢失更改代码。

      【讨论】:

        猜你喜欢
        • 2011-08-23
        • 2019-05-17
        • 2011-08-28
        • 2013-08-30
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        相关资源
        最近更新 更多