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
69
プログラミング言語を作る
NearMeの技術発表資料です
PRO
February 02, 2024
Tweet
Share
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
ESLintをもっと有効活用しよう
nearme_tech
PRO
0
9
リファクタリングのための第一歩
nearme_tech
PRO
0
31
ガウス過程回帰とベイズ最適化
nearme_tech
PRO
1
85
確率的プログラミング入門
nearme_tech
PRO
2
83
Observability and OpenTelemetry
nearme_tech
PRO
2
37
観察研究における因果推論
nearme_tech
PRO
1
110
React
nearme_tech
PRO
2
44
Architecture Decision Record (ADR)
nearme_tech
PRO
1
870
遺伝的アルゴリズムを実装する
nearme_tech
PRO
1
72
Featured
See All Featured
RailsConf 2023
tenderlove
29
960
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Statistics for Hackers
jakevdp
797
220k
Unsuck your backbone
ammeep
669
57k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
2
160
Speed Design
sergeychernyshev
25
720
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
How to Ace a Technical Interview
jacobian
276
23k
Thoughts on Productivity
jonyablonski
68
4.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
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 解答(エ)