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の技術発表資料です
February 02, 2024
0
33
プログラミング言語を作る
NearMeの技術発表資料です
February 02, 2024
Tweet
Share
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
OR-Toolsの中⾝ -VRPの解法について-
nearme_tech
0
27
GTFSのデータを Streamlitで可視化してみた
nearme_tech
0
34
Offset / Cursor Paginationについて
nearme_tech
1
25
⼤規模⾔語モデルの拡張(RAG)が 終わったかも知れない件について
nearme_tech
23
15k
VRPを深層強化学習で解く
nearme_tech
0
66
Let’s go monorepo - intro to Nx.dev
nearme_tech
0
20
Dynamic Vehicle Routing のシミュレーションを Streamlitで作ってみた
nearme_tech
0
62
ログ監視ツールについて調べてみた
nearme_tech
0
56
(インターン生が大学院で行なっている)研究紹介
nearme_tech
0
47
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
689
190k
Stop Working from a Prison Cell
hatefulcrawdad
266
19k
Code Reviewing Like a Champion
maltzj
514
39k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Fantastic passwords and where to find them - at NoRuKo
philnash
37
2.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
51k
Fontdeck: Realign not Redesign
paulrobertlloyd
76
4.9k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.6k
A designer walks into a library…
pauljervisheath
200
23k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
Reflections from 52 weeks, 52 projects
jeffersonlam
345
19k
The Brand Is Dead. Long Live the Brand.
mthomps
49
29k
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 解答(エ)