B. OMake言語の文法

B.1 OMakeの語彙規則

OMake言語は、2,3個の語彙規則からなるGNU/BSDのmake言語を元にしています。厳密にいうと、この言語にキーワードは存在しません。また、少数の特殊文字から成り立っています。

B.1.1 コメント

コメントは # 文字から始まり、行末まで続きます。また、コメントの中にある文字列の制限はありません。

例:

# This is a comment
# This $comment contains a quote " character

B.1.2 特殊文字

以下の文字は、特定の文中で特殊文字となります。:

$    (    )    ,    .   =    :    "    '    `    \    #
  • $ は変数の参照、あるいは関数を適用する際に用いられます。

  • 括弧 ), ( は引数のデリミタに用いられます。

  • コマンド , は引数のセパレータです。

  • ピリオドシンボル . は名前のセパレータです。

  • 等価シンボル = は定義(definition)を意味します。

  • コロンシンボル : はルール付けと、『この式はインデント先の内容に従っている』ことを示すために用いられます???ただし、後者はオプションです。

  • クオーテーションシンボル "' は文字列の範囲を定めるために用いられます。

  • シンボル # は定数の初期文字です。

  • エスケープシンボル \ は別の特殊文字を修飾するため のみ に用いられます。この場合、二番目の文字の特殊効果はすべて取り除かれ、一つの文字として扱われます。そうでない場合、 \ は特殊文字とはなりません。

    例:

    • \$ : 文字 $ (通常の文字列として扱われる)
    • \# : 文字 # (通常の文字列として扱われる)
    • \\ : 文字 \ (通常の文字列として扱われる)
    • c\:\Windows\moo\#boo : 文字列 c:\Windows\moo#boo

B.1.3 識別子

識別子(変数名) は _, -, @ を含めた、ASCIIの英数字で構成されなければなりません。大文字小文字は区別されるため、以下の識別子は区別されます: FOO, Foo, foo 。また、識別子の一文字目は条件に当てはまる文字であればなんでも構いません。つまり、数字から始めても構いません。

egrep 表記を用いると、識別子の正規表現は以下のようになります。

identifier ::= [-@~_A-Za-z0-9]+

以下の識別子はすべて正当です。

Xyz    hello_world    seventy@nine
79-32  Gnus~Gnats     CFLAGS

以下の識別子は正当ではありません。

x+y    hello&world

B.1.4 コマンド識別子

以下の単語はプログラム行の 最初に 呼び出された場合に、特別な意味を持つ単語です。そうでない場合、これらの単語は特別な意味を持ちません。

case     catch  class    declare    default
do       else   elseif   export     extends
finally  if     import   include    match
open     raise  return   section    switch
try      value  when     while

B.1.5 変数の参照

変数の参照(variable reference)は、 $ 特殊文字を識別子の前に付与することによって指定できます。もし識別子名が一文字より多い文字列であった場合、括弧を使って閉じなければなりません。この括弧を使った表記法は非常によく使われます。以下はすべて正当な変数の参照です。

$(Xyz)    $(hello_world)   $(seventy@nine)
$(79-32)  $(Gnus~Gnats)    $(CFLAGS)

一文字で変数を参照する場合は、通常の識別文字に加えていくつかの追加修飾子 &*<^?[] を利用することもできます。以下はすべて正当な変数の参照です。

$@   $&   $*   $<   $^   $+   $?   $[   $]
$A   $_   $a   $b   $x   $1   $2   $3

ノート

括弧を利用しない変数の参照は、たとえその後にに正当な文字が続いていたとしても、一文字のみに制限されます。例えば、変数 $x の値が17であった場合、以下の構文は次のように評価されます。

$x           evaluates to    17
foo$xbar     evaluates to    foo17bar
foo$(x)bar   evaluates to    foo17bar

特殊シーケンス $$ はリテラル文字 $ に置き換わります。これはつまり、二文字のシーケンス \$$$ は通常の場合等価であることを表しています。

B.1.6 文字列定数

リテラル文字列は対応する文字列のデリミタによって定義されます。左の文字列デリミタはダラーサイン $ から始まり、0でない数のシングルクオート、またはマルチクオートを使います。また、文字列は対応するクオーテーションシンボルのシーケンスで終わります。クオーテーションの種類を混ぜることはできません。言い換えると、デリミタは必ずシングルクオートかダブルクオート文字のどちらかでなければいけません。以下の例はすべて正当な文字列です。

$'Hello world'
$"""printf("Hello world\n")"""
$''''
Large "block" of
text # spanning ''multiple'' lines''''

文字列のデリミタは、文字の内容には 含まれません 。シングルクオートを用いた場合、文字列の内容は逐語的に解釈されます。言い換えると、この文字列にはなんの特殊文字も含まれていないものと解釈されます。

ダブルクオートを用いた場合、文字列の内容に $ シンボルを用いて式の評価を含めることができます。以下にいくつかの例を示します。

X = Hello
Y = $""$X world""             # Hello world
Z = $'''$X world'''           # $X world
I = 3
W = $"6 > $(add $I, 2)"       # 6 > 5

ノート

OMakeでは、 $ を付与していないクオーテーションシンボルは特別なものとして扱われません。この場合、クオーテーションシンボルはシーケンスに含まれます。

osh>println('Hello world')
'Hello world'
osh>println($'Hello world')
Hello world
osh>X = Hello
- : "Hello" : Sequence
osh>println('$X world')
Hello world

B.2 OMakeの語彙規則

B.2.1 式

B.2.1.1 インライン参照

B.2.2 構文とプログラム

B.2.2.1 特殊構文

B.2.2.2 変数定義

B.2.2.3 参照と関数定義

B.2.2.4 オブジェクト

B.2.2.5 ルール

B.2.2.6 シェルコマンド

B.3 ダラー修飾子