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

自作言語のすすめ - シン・プログラミング自作版 -

soukouki
August 22, 2021

自作言語のすすめ - シン・プログラミング自作版 -

インタプリタの内部実装の紹介と、自作言語yokanの紹介です。

soukouki

August 22, 2021
Tweet

More Decks by soukouki

Other Decks in Technology

Transcript

  1. 自己紹介 29期生で学部1年の sou7 / soukouki です。 twitter:@sou7___ (アンダーバーは3つ!) discord:sou7#0094 github:soukouki

    atcoder:soukouki 大学入ってからというもの、周りにすごい人が多くて刺 激されてます。 みんなすごい!
  2. トークンとはなんぞや トークンとは、一言で言えばコード上で意味を持つ最小単位の文字の並びです。 具体的にはこんなものです。 予約語 (C言語でいう if とか const とか。yokan言語には予約語はありません。) リテラル

    ( 123 , "str" のような、プログラム上の数値や文字列) 識別子 (関数名や変数名のような、プログラム上で自由に名前をつけられるもの) 演算子 ( == , < , + ) 括弧 デミリタ (カンマとか)
  3. 具体例 Wikipedia「再帰下降構文解析」より引用 void term(void) { factor(); while (sym == times

    || sym == slash) { getsym(); factor(); } } void expression(void) { if (sym == plus || sym == minus) getsym(); term(); while (sym == plus || sym == minus) { getsym(); term(); } } (yokanではもう少しごちゃごちゃした処理を書いています。)
  4. 構文木を使った評価 インタプリタなどでは、プログラムを実行することを「評価する」と言うことが多い です。 yokan言語では、構文解析で得られた構文木を使って、直接評価しています。 func evalMinusPrefixOperatorExpression(right object.Object) object.Object { //

    型チェック err, ok := checkTypeIsInteger("MinuPrefixOperator", right) if !ok { return err } // 内部の整数を取得 value := right.(*object.Integer).Value // マイナス演算子を適用 return &object.Integer{Value: -value} }