Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gorgos-parser-combinator-written-in-scheme

Niyarin
November 26, 2020

 Gorgos-parser-combinator-written-in-scheme

Schemeでパーサコンビネータを作りました

Niyarin

November 26, 2020
Tweet

More Decks by Niyarin

Other Decks in Programming

Transcript

  1. Parser combinator
    (written in Scheme)
    「Gorgos」
    Niyarin

    View Slide

  2. Schemeでparser combinator を作った
    ・私はパーサに関しては素人です
    ・文字列を入れるとSchemeオブジェクトを返す手続きを作成する
    (Scheme手続きを組み合わせて)

    View Slide

  3. 返り値は多値
    ・”受理したもの”と、”のこりの文字列”が返る
    ・文字aのパーサに”abcdef”を入れると、
       受理した#\aと残りの”bcdef”が返る

    View Slide

  4. “ab”を受け取るパーサ1
    ・”gchar”を2回使って実装する

    View Slide

  5. “ab”を受け取るパーサ2
    ・よく使いそうなものは楽できるような部品が提供されている
    特定の文字列を受け取るパーサ “gstring”

    View Slide

  6. リストを意識したパーサコンビネータ1
    ・gorgosはリストを返すことを意識した作りになっている
    ・受理→ 変換の”変換”を簡潔に書くため
       リストリーダの例

    View Slide

  7. リストを意識したパーサコンビネータ2
    ・なるべく変換を手抜きしたいので、gpairというpairを返すも
    のも作った
    ab…. を受け取る例

    View Slide

  8. Schemeにcharsetがあって楽できた
    ・Schemeには文字の集合というデータ構造がある
    (SRFI 14) or (scheme charset)
    ・charsetに含まれているかどうかの部分だけでよかった
    ・組み込みも充実している
    char-set:upper-case
    char-set:digit
    char-set:whitespace
    など

    View Slide

  9. macro/手続きでありがちなやつ
    ・glistは最初は手続きだった
    → piyo-parserがfoo-parserの前に来ていないとだめ
    (右)再帰する場合もlambdaで囲わないと再帰できない
    ・parserを受け取るものをすべてマクロに書き換えた
    ・applyとかに渡すことができなくなったので、glist-fという関数版も用意
    した

    View Slide

  10. 未完成な部分
    ・文字列→ Scheme objectはできている
    ・今作り込んでいる部分
    1.エラー表示
    2.1文字先読みだけでいけるように変換orチェックする対応
    port (fileストリームなど)から使えるようにしたい
    1文字先読み

    View Slide