Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プログラミング言語を作る
Search
NearMeの技術発表資料です
PRO
February 02, 2024
0
59
プログラミング言語を作る
NearMeの技術発表資料です
PRO
February 02, 2024
Tweet
Share
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
観察研究における因果推論
nearme_tech
PRO
1
13
React
nearme_tech
PRO
2
17
Architecture Decision Record (ADR)
nearme_tech
PRO
1
750
遺伝的アルゴリズムを実装する
nearme_tech
PRO
1
25
Fractional Derivative!
nearme_tech
PRO
1
21
GitHub Projectsにおける チケットの ステータス更新自動化について
nearme_tech
PRO
1
33
2つの曲線を比較する方法ってあるの? 〜フレシェ距離を試してみた〜 with Python
nearme_tech
PRO
1
150
Constrained K-means Clustering (クラスタサイズの制限をしたK-means法) を調べてみた
nearme_tech
PRO
1
59
VRPの近傍操作SWAP*について調べてみた
nearme_tech
PRO
1
81
Featured
See All Featured
Become a Pro
speakerdeck
PRO
24
4.9k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Embracing the Ebb and Flow
colly
83
4.4k
How to name files
jennybc
77
98k
Designing Experiences People Love
moore
138
23k
What the flash - Photography Introduction
edds
67
11k
The Straight Up "How To Draw Better" Workshop
denniskardys
231
130k
In The Pink: A Labor of Love
frogandcode
139
22k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
48k
Debugging Ruby Performance
tmm1
73
12k
Design by the Numbers
sachag
278
19k
Visualization
eitanlees
143
15k
Transcript
0 プログラミング⾔語を作る 2024-02-02 第27回NearMe技術勉強会 Takuma KAKINOUE
1 概要 • インタプリタ型⾔語の動作原理を解説 ◦ 字句解析 ◦ 構⽂解析 • 字句解析および構⽂解析ライブラリのPython
Lex-Yacc (https://github.com/dabeaz/ply)を⽤いて,簡単な⾔語を作成する
2 インタプリタ型⾔語が実⾏される仕組み • Step 1 : プログラムをブロックに分割する ◦ このブロック単位で実⾏される •
Step 2 : 字句解析 ◦ ブロック単位のプログラムをトークンへと分解する • Step 3 : 構⽂解析 ◦ トークンの羅列をBNFに当てはめ関係性を抽出し,構⽂解析⽊を⽣成する • Step 4 : 実⾏ ◦ 構⽂解析⽊をもとに,インタプリタで定義された動作が実⾏される ※ コンパイラ型⾔語の場合は,Step 4以降が異なり,「意味解析」→「コード⽣成」とい う処理が⾏われる。コンパイラは「実⾏」までは⾏わず,あくまで与えられたプログラム を機械語などの別のプログラムに変換することが⽬的である。
3 トークン(終端記号)とは • プログラムの最⼩単位で,それ以上分割することができない記号のこと • トークンの例 ◦ 演算⼦ ▪ +,
-, *, /, = など ◦ 予約語 ▪ if, else, while, for, return など ◦ 数値 ▪ 0, 5, 100 など ◦ 変数名や関数名 ▪ my_var, my_func など
4 BNFとは • プログラムの構⽂を定義するための記法のこと ◦ 正式名称は,バッカス‧ナウア記法(Backus-Naur form) • 記法の例 ◦
<A> ⇨ 記号Aの宣⾔ ◦ <A> ::= <B> ⇨ AはBである(定義) ◦ <A> | <B> ⇨ AまたはBである(選択) • 構⽂の例 ◦ 英数字の定義(<英字>と<数字>は終端記号,<英数字>は⾮終端記号となる) ▪ <英字> ::= [a - z] | [A - Z] ▪ <数字> ::= [0 - 9] ▪ <英数字> ::= <英字> | <英数字> <数字> | <英数字> <英字>
5 ⾜し算と引き算を定義する • トークン(終端記号)の定義 ◦ <整数> ::= ([1 - 9]
| [0 - 9]* ) | 0 ◦ <演算⼦ > ::= + | - • BNFの定義 ◦ <式> ::= <整数> | <式> <演算⼦> <整数> • “1 + 2”という式を解析する流れ ◦ 1 + 2 ◦ <整数> <演算⼦> <整数> → 1 + 2 ◦ <式> <演算⼦> <整数> → 1 + 2 ◦ <式> → 3(演算⼦を読み込み演算を実⾏)
6 問題 • 以下の構⽂に合致するものはどれか?ただし、構⽂解析は最⻑⼀致で⾏われる。 ◦ <動作> ::= ⾷べる | 捨てる
| 投げる ◦ <もの> ::= りんご | 雑草 | ボール ◦ <命令> ::= <動作> | <動作> <もの> | <命令> <動作> | <命令> <動作> <もの> • 選択肢 ◦ (ア)ボール 投げる ⾷べる りんご ◦ (イ)捨てる 雑草 ⾷べる りんご りんご ◦ (ウ)⾷べる 雑草 りんご 捨てる ◦ (エ)投げる ボール 投げる 投げる ボール
7 サンプルコードを動かす • リポジトリをclone ◦ https://github.com/kakky-hacker/algorithm_sandbox/tree/main/my-script • main.pyを実⾏(今回はpip install不要) ◦
インタプリタが⼊⼒待ち状態になるので,sample/code.txtをコピペする ◦ ちゃんとコード通りの出⼒か検算してみる • インタプリタで遊んでみる ◦ 変数宣⾔や”()”を⽤いた四則演算も可能 ◦ 代⼊⽂以外は,コンソールに結果が出⼒される
8 Thank you 解答(エ)