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
77
プログラミング言語を作る
NearMeの技術発表資料です
PRO
February 02, 2024
Tweet
Share
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
Box-Muller法
nearme_tech
PRO
1
14
Kiro触ってみた
nearme_tech
PRO
0
28
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
4
340
ReactNative のアップグレード作業が (意外に)楽しかった話
nearme_tech
PRO
2
93
強化学習アルゴリズムPPOの改善案を考えてみた
nearme_tech
PRO
0
27
Apple Containerについて調べて触ってみた
nearme_tech
PRO
0
350
Rust 並列強化学習
nearme_tech
PRO
0
28
並列で⽣成AIにコーディングをやらせる
nearme_tech
PRO
1
200
希望休勤務を考慮したシフト作成
nearme_tech
PRO
0
48
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
49
14k
How to Think Like a Performance Engineer
csswizardry
27
2k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
980
What's in a price? How to price your products and services
michaelherold
246
12k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.7k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
Building a Modern Day E-commerce SEO Strategy
aleyda
44
7.8k
Writing Fast Ruby
sferik
629
62k
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 解答(エ)