3

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

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

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

实现一个跟踪评论的预处理器对我来说看起来像是过度设计。

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

4

2 回答 2

3

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

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

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

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

  • 如果 position.Y 已更改,但 position.X 未更改,则注入虚拟 SEPARATOR 令牌。

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

  • 如果先前的标记是软中断(在 python \ 中),请忽略上面的逻辑。

于 2011-01-13T14:03:19.303 回答
2

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

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

WhiteSpaceDecl = "IGNORE" 设置。

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

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

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

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

于 2010-12-05T20:32:58.293 回答