2010-11-27 38 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),所以你重新生成代碼後,你將不鬆變動的最簡單方法。