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

Gorgos-parser-combinator-written-in-scheme

4861686276b2f990387eaef28b099db0?s=47 Niyarin
November 26, 2020

 Gorgos-parser-combinator-written-in-scheme

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

4861686276b2f990387eaef28b099db0?s=128

Niyarin

November 26, 2020
Tweet

Transcript

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

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

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

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

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

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

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

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

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

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