2010-11-27 41 views
2

有没有一种众所周知的方法,如何在Coco/R中实现象Python/Boo中的缩进?如何在Coco/R中标记缩进(Python,Boo如缩进)

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

现在,我使用预处理器,它插入'{','}'和';'在输入流中,通过比较行间的缩进。在Coco/R语法中,我使用弧形括号作为beginBlock/endBlock标记。如果输入流没有commens(它也可以嵌套),它效果很好。一旦无序的评论来临,意向比较逻辑失败。

实现一个预处理程序,它跟踪评论看起来像给我过度引导。

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

回答

2

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

  • 涡卷GetNextToken与 比较下一 令牌与所述最后一个的流位置的方法。

  • 如果position.Y更改,但 position.X增加了N个选项卡,则注入虚拟INDENT标记N 。

  • 如果position.Y被更改,但 position.X减少了N个选项卡,则注入虚拟DENDENT令牌N 。

  • 如果position.Y被更改,但 position.X不是,注入虚拟 SEPARATOR标记。

  • 如果位置。Y不变,返回 原始下一个令牌。

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

2

首先,Coco/R默认只会忽略空格(空格)。标签不忽略:

2.3.5空白
字符如空格,制表符或结束行 符号通常被认为应该由 扫描仪被忽略 空白。空白由默认值 忽略。如果其他字符 应该被忽略,用户必须以 以下列方式指定它们:

WhiteSpaceDecl =“IGNORE”Set。

例忽略 '\ t' + '\ r' + '\ n'

我没有测试过这一点,但我的猜测是,你应该覆盖扫描仪的默认行为:

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

要做到这一点,首先修改生成的代码,直到它的工作原理确定,然后做在框架文件相同的变化(Scanner.frameParser.frame),所以你重新生成代码后,你将不松变动的最简单方法。