3

Python/BooのようにCoco/Rトークン化インデントに実装する方法はよく知られていますか?

Coco / Rは空白を無視しますが、次の行のインデントに基づいて、beginBlock/endBlockトークンを生成する必要があります。

現在、「{」、「}」、および「;」を挿入するプリプロセッサを使用しています。行間のインデントを比較することにより、入力ストリームで。Coco / R文法では、beginBlock/endBlockトークンとして曲線中括弧を使用します。入力ストリームにコメンスがない場合(ネストすることもできます)、うまく機能します。順序付けられていないコメントが来るとすぐに、インテント比較ロジックは失敗します。

コメントをトレースするプリプロセッサを実装することは、私には過剰設計のように見えます。

したがって、問題は、Coco / Rを使用してインデントベースの文法を解析することは一般的に可能ですか?それとも私は何か他のものを試すべきですか?

4

2 に答える 2

3

これを行うための理想的な方法を見つけました。

  • GetNextTokenを、次のトークンのストリーム位置を最後のトークンと比較するメソッドでラップします。

  • position.Yが変更されたが、position.XがN個のタブを増やした場合、N個の仮想インデントトークンを挿入します。

  • 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.frameおよびParser.frame)に同じ変更を加えて、コードを再生成した後に変更が失われないようにすることです。

于 2010-12-05T20:32:58.293 に答える