字句エレメント

このセクションでは、Q の字句エレメント (正規表現) について説明します。 字句間のコメント、スペース、タブ、復帰、および改行は無視されます。 コメントは、(* と *) で区切られた一連の文字です。コメントは複数行で表すことができます。
注: コメントをネストすることはできません。

句読点

句読点記号を以下に示します。

= <> ~= ~<> < <= > >= + - * / -> ( ) { } [ ] " => |=> , $

識別子 (ID)

識別子は、1 つの文字またはアンダースコアーに続いていくつかの文字、数字、またはアンダースコアーで 表します。 識別子の大/小文字は区別されます。

キーワード

キーワードを以下に示します。キーワードを変数や関数の名前として 使用することはできません。

表 1. 字句エレメントのキーワード
and in real
Boolean integer sort
current let string
else map then
false model there_exists
filter not this
for_all of traverse
if or true
implies over  

整数リテラル (INTEGER_LITERAL)

整数リテラルは、オプションの負符号 (-) に続いて 1 つ以上の 10 進数字で 表します。

実数リテラル (REAL_LITERAL)

実数リテラルは、オプションの負符号 (-) に続いて 1 つ以上の 10 進数字、小数点、および 1 つ以上の整数で 表します。

ブール・リテラル (BOOLEAN_LITERAL)

ブール・リテラルには true と false があります。

関連リテラル (ASSOC_LITERAL)

関連リテラルは、基本的には、ストリング・リテラルを 引用符の代わりに大括弧 ([]) で囲んだものです。シーケンス ¥] は終了区切り文字をエスケープします。

ストリング・リテラル (STRING_LITERAL)

ストリング・リテラルは、引用符で囲まれた 文字シーケンスです。 ストリングを複数行にわたって拡張することはできません (つまり、 ストリングに、アンエスケープされた改行を含めることはできません)。サポートされる エスケープ・シーケンスを以下の表に示します。

エスケープ・シーケンス
置換テキスト
\"
\\
\
¥t
タブ
¥r
復帰
¥n
改行

正規表現リテラル (REGEXP_LITERAL)

正規表現リテラル は、 逆引用符 (`) で囲まれた文字シーケンスです。正規表現リテラル内のいくつかの文字には 特別な意味を持つものがあります。これらの文字は、円記号の後に示された場合を除いて、 特別な意味を表します。特殊文字は、.、¥、[、]、?、*、+、^、および $ です。 正規表現リテラルには、文字エスケープ・シーケンスを含めることができます。 許可されているエスケープ・シーケンスは、¥t、¥r、¥n、および ¥xdd です。 これらは、タブ、復帰、改行、および 16 進数 dd に相当する ASCII コードの文字を表します。

正規表現は再帰的な構造を持ちます。これらは、 より小さな副次式で形成されます。すべての正規表現のビルディング・ブロックは、 単一文字と一致する式です。 これらの基本式には以下の 3 つのフォームがあります。

  • ピリオド (.) は、任意の単一文字と一致する正規表現です。 例えば、`.` は、a5、#、¥n、" などと一致します。
  • 特殊文字以外の文字、または円記号に続いて 示される特殊文字は、その文字と一致する正規表現です。 例えば、`a`、`5`、および `¥*` は、それぞれ a5、および * と一致します。
  • 大括弧で囲まれた文字の組み合わせは、その組み合わせの中の 1 文字と 一致する正規表現です。 例えば、`[abc]` は、ab、または c のいずれかと一致します。 組み合わせの中の先頭文字がキャレット (^) である場合、正規表現は、 その文字の組み合わせの補数と一致します。 したがって、`[^abc]` は、ab、および c 以外の文字と一致します。 便宜上、文字の範囲はダッシュを使用して指定できます。 この範囲には、包括的に下限と上限の間のすべての文字が含まれます。 例えば、`[a-zA-Z0-9]` はあらゆる文字や数字と一致します。

これらのビルディング・ブロックから、 より大きな正規表現を以下のようにして形成できます。

  • re1 および re2 が 正規表現である場合、re1 re2 (連結) は、 フォーム s1s2 (ここで、s1re1 に 匹敵し、s2re2 に匹敵します) の文字列すべてと 一致する正規表現となります。例えば、`[ab][01]` は、a0a1b0、および b1 と一致します。
  • re が正規表現である場合、re? は、re のゼロ個または 1 個のオカレンスと 一致する正規表現です。 例えば、`ab?` は a または ab と一致し、`a[01]?` は aa0、または a1 と一致します。
  • re が正規表現である場合、re* は、re のゼロ個以上の オカレンスと一致する正規表現です。 例えば、`ab*` は aababbabbb、… と 一致し、`a[01]*` は aa0a1a00a01a11、… と一致します。
  • re が正規表現である場合、re+ は、re の 1 個以上の オカレンスと一致する正規表現です。 例えば、`ab+` は ababbabbb、… と 一致し、`a[01]+` は a0a1a00a01a11、… と一致します。
    注: 後置演算子 ?、*、および + は、 連結に比べてより密にバインドします。そのため、ab* は、(ab)* ではなく a(b*) を意味します。

完全な 正規表現は、^ および $ をそれぞれ使用した文字列の始めまたは終わりに固定できます。 re が正規表現である場合、^re は、re に匹敵するすべてのストリングと 一致する正規表現ですが、これらのストリングが先頭にある場合に限られます。 同様に、re$ は、re に匹敵するすべてのストリングと 一致する正規表現ですが、これらのストリングが末尾にある場合に限られます。例えば、`^[01]+` は 0 および 0110 と一致しますが、a0a0110 とは 一致しません。また、`[01]+$` は 0 および 0110 と一致しますが、0a0110a とは 一致しません。


フィードバック