syntax-switch (マクロ)
パッケージ: CURL.LANGUAGE.COMPILER

ソース コード オブジェクトのパターンの一致に基づいて、コード ブロックの実行を変換します。

構文

            {syntax-switch source-object
                       [, index:ParseIndex = BOS]
                       [, must-match?:bool = false]
                       [case pattern do statements]
                       [case pattern do statements]...
                       [else statements]
                   } 
            
source-object: 構文のパターン マッチングのターゲットとなる CurlSource の型のオブジェクト。
index: オプションの index 引数は上級ユーザー用で、これにより先頭以外の場所から source-object の解析を開始することができます。
must-match?: true に設定され、一致するパターンがない場合は SyntaxError 例外がスローされます。
pattern: 可能な構文パターンの 1 つ (下記を参照)。
statements: パターンの一致に成功すると評価される一連の式。

説明

syntax-switch はコントロール コンストラクトで、その構文は switch の構文に似ています。ただし、各 case ステートメントが構文パターンである点が異なります。

パターン マッチングや CurlSource オブジェクトの分解の際に役に立つフォームを提供します。これは、マクロ作成用に特別に設計されていますが、その使用をマクロ定義内に制限する必要はありません。

source-object は各 pattern に対して順番に照合されます。最初に一致する pattern に対して、対応する statements が実行されます。このとき、名前付きの各サブパターンに定義されたローカル変数が使用されます。一致するケース式がない場合、else 句が存在すればそれに続く statements が実行されます。

must-match?true に指定され、一致するパターンがない場合、syntax-switchSyntaxError をスローします。must-match? が true の場合、else 句は許可されません。syntax-switch は、どこまで進んでからパターン一致に失敗したかを示すなどの、意味のある構文エラーの生成を自発的に試みます。これは、do が欠落しているような、簡単な問題を見つけるには十分です。ただし、既定の自発的なエラー生成では、すべての状況、特に他のエラー生成方法がある場合でも、意味のあるエラー メッセージを提供できないという可能性があります。

pattern は、単純パターンを表す識別子、または複合パターンを記述するプレフィックス式のいずれかで構成されます。

pattern template は、疑問符 (?) でエスケープする一連のリテラル ソース コードから構成されます。これは、下記で説明されています。

次は単純な pattern として選択可能なものです。



複合パターンを次に示します。



pattern template は、完全一致を必要とする標準コードのシーケンスで、疑問符 (?) でエスケープされた pattern が配置されています。

たとえば、次の pattern

{pattern alpha ?id:identifier beta}

の内容は、識別子 alpha、続いて任意の識別子、最後に識別子 beta との一致を示します。

次の pattern は上記と同じ一致ですが、alphabeta の間にゼロ個以上の任意の数の識別子が入ります。

{pattern alpha ?ids:{sequence ?:identifier} beta}

最初の pattern template では?id:identifier であることに注意してください。この例では、id がパターンに名前を付けることにより、後続のコードがこのパターンに一致するソース コードにアクセスできるようになります。同様に 2 番目の例では、?ids:{sequence ?:identifier} が一致項目の配列を生成します。

名付けられたパターンは次のように指定されます。

    {syntax-switch source
     case {pattern alpha ?id:identifier beta} do
        {output "I matched identifier ", id.name}
     else
        {error "no match"}
    }


ケースの本体で、id が一致するソース コードにどのようにバインドされているかに注意してください。

通常、名付けられたパターンは、新しいソース コード オブジェクトを生成するために expand-template に渡されます。ただし、高度なコードが CurlSource のメソッドとそのサブクラスを使用し、さらに解析を実行する場合があります。

シーケンス パターンに一致させる場合、変数はすべての一致シーケンスを含むコンテナにバインドされます。このコンテナは、for を使用してループできます。

    {syntax-switch source
     case {pattern alpha ?ids:identifiers beta} do
        {output "I matched ", ids.size, " identifiers"}
     case {pattern whoops} do
        {output "someone said whoops!"}
     else
        {error "no match"}
    }


前述の例で使用された {sequence ?:identifier} に対して、この例では identifiers 省略形が使用されていることに注意してください。これらは同じものです。

パターンの命名はオプションです。一致するソースに名前を付ける必要がない場合は名前を省略します。

{pattern alpha ?:identifier beta}

名付けられたパターンは、1 つだけの一致が保証されない sequenceoptional、あるいは その他のコンストラクト内には表示されない可能性があります。

リテラル疑問符に一致させるには、{pattern ??} のように ? 文字を 2 つ並べます。some-function? のような識別子の一部である疑問符は、識別子の一部と見なされ、別々に一致させることはできないことに注意してください。

注意事項

syntax-switch の 1 つの目的は、マクロ作成者が CurlSource API の知識があまりなくても済むようにすることです。ただし上級ユーザーは、操作によって直接 CurlSource 呼び出しに頼らなくてはならない場合があります。