TOML の LALR (1) 文法の構文

TOML の仕様はなぜか行指向になっています。 構文上では行指向にする必要性がなく、 字句間の任意の位置に空白と改行を区別せずに置いてもあいまいさが生じません。 下向きでも上向きでも行指向でない構文を記述可能ですし、 その方が生成規則がすっきりします。

TOML の LALR (1) 文法の構文 行指向版

title  # ここはコメント。字句解析部ではコメントは改行の一種扱い
 ="TOML は行指向でなくても良い"  [
section1
] key1=
"value1" key2="value2"
[section2] key3="value3" key4="value4"
[section3] key5="value5" key6="value6"

仕様はコーディング規則と構文を区別せずに作ってあるのだろうと都合良く解釈して、 改行の特別扱いをやめて LALR (1) 文法の構文を作ってみました。 これでも、 衝突はありません。 あえて問題点をあげるなら、 字句解析単独ではベアキーを数と真偽値から区別できないことです。 字句解析部を構文解析部と連動させると、 ベアキーを区別することができます。 構文から LR オートマトン解析表を作ってみると、 ベアキーでシフトする状態に数・真偽値のシフトが含まれていませんし、 数・真偽値でシフトする状態にもベアキーは含まれていません。 字句を一つ読み込むのはシフトのときですので、 ベアキーを要求する状態とそうでない状態で字句解析部のふるまいを変更すると、 ベアキー問題をひとまず解決することができます。

toml
    :
    | statements
    | statements sections
    | sections

sections
    : sections section
    | section

section
    : '[' keypath ']' statements
    | '[' keypath ']'
    | '[' '[' keypath ']' ']' statements
    | '[' '[' keypath ']' ']'

keypath
    : keypath '.' key
    | key

key
    : BAREKEY
    | STRKEY            /* 空でない ["] 1 個版の文字列 */

statements
    : statements pair
    | pair

pair
    : key '=' value     /* keypath '=' value でも衝突はおこらない */

value
    : BOOLEAN
    | FIXNUM
    | FLONUM
    | DATETIME
    | STRKEY            /* 空でない Basic String */
    | STRING            /* ["] と ['] のクォート 1 個版と3 個版 */ 
    | '[' list ']'
    | '{' table '}'

list
    :
    | value_list ','
    | value_list

value_list
    : value_list ',' value
    | value

table
    :
    | pair_list ','
    | pair_list

pair_list
    : pair_list ',' pair
    | pair