※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Treetop の文法は構文解析の文法を元にしたカスタム言語で書かれています。構文解析の文法の知識は Treetop の文法を書く上で役に立ちます。

文法構造

Treetop の文法はこんな感じです:

grammar GrammarName
  rule rule_name
    ...
  end
  rule rule_name
    ...
  end
  ...
end

主なキーワードは:

* grammar : これは新しい文法の始まりです。 It is followed by a constant name to which the grammar will be bound when it is loaded.

* rule : これは文法中に構文解析の規則を定義します。他の rule の中で参照することができる名前を付けます。そして rule を決める構文解析表現が後に続きます。

構文解析

各規則は構文解析表現の名前を関連付けます。構文解析表現は vanilla 正規表現の一般化です。これらの重要な特徴は名前による文法の他の表現への参照能力です。

終端シンボル

文字列

文字列はダブルコーテーションまたはシングルコーテーションで囲まれていて、完全に一致する必要があります。

"foo"
'foo'

文字クラス

文字クラスはブラケットに囲まれています。これらは意味合いは Ruby の正規表現に使用されるもとの同じです。

[a-zA-Z]
[0-9]

その他シンボル

その他シンボルとしてはドット(.) が提供され、どんな単一文字ともマッチします。


非終端シンボル

非終端シンボルは、クォーテーションの無い、他で命名されたルールから参照です。これらは命名された式のインライン展開と同等です。

rule foo
  "the dog " bar
end

rule bar
  "jumped"
end

上の文法は下記と同等です:

rule foo
  "the dog jumped"
end

解析規則

パーサーは左から右の順で規則正しい選択にマッチさせ、最初に一致に成功した後で終了します。

"foobar" / "foo" / "bar"

上の式では、もし "foo" が一番最初になるようなら、"foobar" は決してマッチしないことに注意してください。

順序

順序はスペース区切りの構文解析表現のリストです。これらは選択するより higher precedence なので、順序の要素として使うために parenthesized されて選択されなければなりません。

"foo" "bar" ("baz" / "bop")

0回以上

パーサーは、スター(*)シンボルがあると0回以上の表現にマッチするでしょう。

'foo'* は、空文字、"foo"、"foofoo"、等にマッチします。

1回以上

パーサーは、スター(+)シンボルがあると1回以上の表現にマッチするでしょう

'foo'+ は、空文字にはマッチしませんが、"foo"、"foofoo" 等にはマッチします。

任意の式

疑問符(?)を使うと任意の表現になります。

'foo'? は、"foo" や空文字にマッチします。

先読み

限られた文脈を構文解析に与えるのに先読みを使用できます。パーサはバッファの中で入力を消費せずに先の評価を行うでしょう。

積極的な先読み

アンパサンド(&)を使って表現を先読みして一致させる場合、true になるまでどんな入力も途中でまったく消費されないでしょう。

"foo" &"bar" は "foobar" にマッチしますが、最後の "foo" は消費されるだけです。(?)"foobaz" にはマッチしません。

否定的な先読み

衝突符(!)を使って表現を先読みして一致させない場合、true になるまでどんな入力も途中でまったく消費されないでしょう。

"foo" !"bar" は "foobaz" にマッチしますが、最後の "foo" は消費さえるだけです。  "foobar" にはマッチしません。