Slide 1

Slide 1 text

0 プログラミング⾔語を作る 2024-02-02 第27回NearMe技術勉強会 Takuma KAKINOUE

Slide 2

Slide 2 text

1 概要 ● インタプリタ型⾔語の動作原理を解説 ○ 字句解析 ○ 構⽂解析 ● 字句解析および構⽂解析ライブラリのPython Lex-Yacc (https://github.com/dabeaz/ply)を⽤いて,簡単な⾔語を作成する

Slide 3

Slide 3 text

2 インタプリタ型⾔語が実⾏される仕組み ● Step 1 : プログラムをブロックに分割する ○ このブロック単位で実⾏される ● Step 2 : 字句解析 ○ ブロック単位のプログラムをトークンへと分解する ● Step 3 : 構⽂解析 ○ トークンの羅列をBNFに当てはめ関係性を抽出し,構⽂解析⽊を⽣成する ● Step 4 : 実⾏ ○ 構⽂解析⽊をもとに,インタプリタで定義された動作が実⾏される ※ コンパイラ型⾔語の場合は,Step 4以降が異なり,「意味解析」→「コード⽣成」とい う処理が⾏われる。コンパイラは「実⾏」までは⾏わず,あくまで与えられたプログラム を機械語などの別のプログラムに変換することが⽬的である。

Slide 4

Slide 4 text

3 トークン(終端記号)とは ● プログラムの最⼩単位で,それ以上分割することができない記号のこと ● トークンの例 ○ 演算⼦ ■ +, -, *, /, = など ○ 予約語 ■ if, else, while, for, return など ○ 数値 ■ 0, 5, 100 など ○ 変数名や関数名 ■ my_var, my_func など

Slide 6

Slide 6 text

5 ⾜し算と引き算を定義する ● トークン(終端記号)の定義 ○ <整数> ::= ([1 - 9] | [0 - 9]* ) | 0 ○ <演算⼦ > ::= + | - ● BNFの定義 ○ <式> ::= <整数> | <式> <演算⼦> <整数> ● “1 + 2”という式を解析する流れ ○ 1 + 2 ○ <整数> <演算⼦> <整数> → 1 + 2 ○ <式> <演算⼦> <整数> → 1 + 2 ○ <式> → 3(演算⼦を読み込み演算を実⾏)

Slide 7

Slide 7 text

6 問題 ● 以下の構⽂に合致するものはどれか?ただし、構⽂解析は最⻑⼀致で⾏われる。 ○ <動作> ::= ⾷べる | 捨てる | 投げる ○ <もの> ::= りんご | 雑草 | ボール ○ <命令> ::= <動作> | <動作> <もの> | <命令> <動作> | <命令> <動作> <もの> ● 選択肢 ○ (ア)ボール 投げる ⾷べる りんご ○ (イ)捨てる 雑草 ⾷べる りんご りんご ○ (ウ)⾷べる 雑草 りんご 捨てる ○ (エ)投げる ボール 投げる 投げる ボール

Slide 8

Slide 8 text

7 サンプルコードを動かす ● リポジトリをclone ○ https://github.com/kakky-hacker/algorithm_sandbox/tree/main/my-script ● main.pyを実⾏(今回はpip install不要) ○ インタプリタが⼊⼒待ち状態になるので,sample/code.txtをコピペする ○ ちゃんとコード通りの出⼒か検算してみる ● インタプリタで遊んでみる ○ 変数宣⾔や”()”を⽤いた四則演算も可能 ○ 代⼊⽂以外は,コンソールに結果が出⼒される

Slide 9

Slide 9 text

8 Thank you 解答(エ)