Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Esehara Shigeo
4,814 views
Goで言語処理系(の途中まで)を作ろう
Technology
◦
Read more
13
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 79
2
/ 79
3
/ 79
4
/ 79
5
/ 79
6
/ 79
7
/ 79
8
/ 79
9
/ 79
10
/ 79
11
/ 79
12
/ 79
13
/ 79
14
/ 79
15
/ 79
16
/ 79
17
/ 79
18
/ 79
19
/ 79
20
/ 79
21
/ 79
22
/ 79
23
/ 79
24
/ 79
25
/ 79
26
/ 79
27
/ 79
28
/ 79
29
/ 79
30
/ 79
31
/ 79
32
/ 79
33
/ 79
34
/ 79
35
/ 79
36
/ 79
37
/ 79
38
/ 79
39
/ 79
40
/ 79
41
/ 79
42
/ 79
43
/ 79
44
/ 79
45
/ 79
46
/ 79
47
/ 79
48
/ 79
49
/ 79
50
/ 79
51
/ 79
52
/ 79
53
/ 79
54
/ 79
55
/ 79
56
/ 79
57
/ 79
58
/ 79
59
/ 79
60
/ 79
61
/ 79
62
/ 79
63
/ 79
64
/ 79
65
/ 79
66
/ 79
67
/ 79
68
/ 79
69
/ 79
70
/ 79
71
/ 79
72
/ 79
73
/ 79
74
/ 79
75
/ 79
76
/ 79
77
/ 79
78
/ 79
79
/ 79
More Related Content
PDF
Go静的解析ハンズオン
by
Takuya Ueda
PDF
Goとテスト
by
Takuya Ueda
PDF
Goでかんたんソースコードの静的解析
by
Takuya Ueda
PDF
静的解析を使った開発ツールの開発
by
Takuya Ueda
PDF
Go入門
by
Takuya Ueda
PDF
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
by
Takuya Ueda
PDF
Goroutineと channelから はじめるgo言語
by
Takuya Ueda
PDF
GAE/GoでWebアプリ開発入門
by
Takuya Ueda
Go静的解析ハンズオン
by
Takuya Ueda
Goとテスト
by
Takuya Ueda
Goでかんたんソースコードの静的解析
by
Takuya Ueda
静的解析を使った開発ツールの開発
by
Takuya Ueda
Go入門
by
Takuya Ueda
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
by
Takuya Ueda
Goroutineと channelから はじめるgo言語
by
Takuya Ueda
GAE/GoでWebアプリ開発入門
by
Takuya Ueda
What's hot
PDF
20130824 Lightweight Language "Go" @LL matsuri
by
Yoshifumi Yamaguchi
PPTX
20130316 プログラミング言語Go
by
Yoshifumi Yamaguchi
PDF
KMC Font Project 3 - FontForgeで欧文書体製作
by
k maztani
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
by
Takuya Ueda
PDF
Go言語によるwebアプリの作り方
by
Yasutaka Kawamoto
PDF
エキスパートGo
by
Takuya Ueda
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
by
Takuya Ueda
PDF
ヒカルのGo 資料 Webアプリケーションの作り方
by
Yosuke Furukawa
PDF
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
by
Takuya Ueda
PDF
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
by
Takuya Ueda
PDF
マスター・オブ・Reflectパッケージ
by
Takuya Ueda
PDF
Goにおける静的解析と製品開発への応用
by
Takuya Ueda
PDF
「Python言語」はじめの一歩 / First step of Python
by
Takanori Suzuki
PDF
今日から始める Go言語 と appengine
by
a know
PDF
マスター・オブ・goパッケージ
by
Takuya Ueda
PPTX
20130228 Goノススメ(BPStudy #66)
by
Yoshifumi Yamaguchi
PDF
マスター・オブ・reflectパッケージ II
by
Takuya Ueda
PDF
Goでwebアプリを開発してみよう
by
Takuya Ueda
PPTX
Pynyumon03 LT
by
drillan
PDF
Go1.8 for Google App Engine
by
Takuya Ueda
20130824 Lightweight Language "Go" @LL matsuri
by
Yoshifumi Yamaguchi
20130316 プログラミング言語Go
by
Yoshifumi Yamaguchi
KMC Font Project 3 - FontForgeで欧文書体製作
by
k maztani
今日から始めるGopher - スタートGo #0 @GDG名古屋
by
Takuya Ueda
Go言語によるwebアプリの作り方
by
Yasutaka Kawamoto
エキスパートGo
by
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
by
Takuya Ueda
ヒカルのGo 資料 Webアプリケーションの作り方
by
Yosuke Furukawa
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
by
Takuya Ueda
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
by
Takuya Ueda
マスター・オブ・Reflectパッケージ
by
Takuya Ueda
Goにおける静的解析と製品開発への応用
by
Takuya Ueda
「Python言語」はじめの一歩 / First step of Python
by
Takanori Suzuki
今日から始める Go言語 と appengine
by
a know
マスター・オブ・goパッケージ
by
Takuya Ueda
20130228 Goノススメ(BPStudy #66)
by
Yoshifumi Yamaguchi
マスター・オブ・reflectパッケージ II
by
Takuya Ueda
Goでwebアプリを開発してみよう
by
Takuya Ueda
Pynyumon03 LT
by
drillan
Go1.8 for Google App Engine
by
Takuya Ueda
Similar to Goで言語処理系(の途中まで)を作ろう
PDF
エディタの壁を越えるGoの開発ツールの文化と作成法
by
Takuya Ueda
PDF
Cookpad Summer Intern 2015 - Programming Paradigm
by
Minero Aoki
PDF
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
by
LINE Corporation
PDF
謎の言語Forthが謎なので実装した
by
t-sin
PDF
JavaScript経験者のためのGo言語入門
by
Shohei Arai
PDF
PEGで構文解析をする
by
jiro4989
KEY
Yesodを支える技術
by
Hiromi Ishii
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
by
mganeko
PDF
GoでMinecraftっぽいの作る
by
京大 マイコンクラブ
PDF
ErlangでErlagVM上で動く言語の作り方
by
osamu kimura
PDF
並行プログラミングと継続モナド
by
Kousuke Ruichi
PDF
プログラミング言語を作る
by
Masaya Konishi
PDF
TechDo Goハンズオン#3
by
privatemy
PDF
Lisp tutorial for Pythonista : Day 1
by
Ransui Iso
PDF
初心者向けGo言語勉強会
by
leverages_event
PDF
Lisper はじめました(大嘘)
by
Nobutada Matsubara
PDF
認証Gwのプロトタイプでgolang使ってみた20171024
by
Kohji Osamura
PDF
Ppl
by
Seizan Shimazaki
PDF
Rust samurai#01
by
Noritada Shimizu
PDF
Goの文法の実例と解説
by
Ryuji Iwata
エディタの壁を越えるGoの開発ツールの文化と作成法
by
Takuya Ueda
Cookpad Summer Intern 2015 - Programming Paradigm
by
Minero Aoki
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
by
LINE Corporation
謎の言語Forthが謎なので実装した
by
t-sin
JavaScript経験者のためのGo言語入門
by
Shohei Arai
PEGで構文解析をする
by
jiro4989
Yesodを支える技術
by
Hiromi Ishii
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
by
mganeko
GoでMinecraftっぽいの作る
by
京大 マイコンクラブ
ErlangでErlagVM上で動く言語の作り方
by
osamu kimura
並行プログラミングと継続モナド
by
Kousuke Ruichi
プログラミング言語を作る
by
Masaya Konishi
TechDo Goハンズオン#3
by
privatemy
Lisp tutorial for Pythonista : Day 1
by
Ransui Iso
初心者向けGo言語勉強会
by
leverages_event
Lisper はじめました(大嘘)
by
Nobutada Matsubara
認証Gwのプロトタイプでgolang使ってみた20171024
by
Kohji Osamura
Ppl
by
Seizan Shimazaki
Rust samurai#01
by
Noritada Shimizu
Goの文法の実例と解説
by
Ryuji Iwata
Goで言語処理系(の途中まで)を作ろう
1.
Goでプログラミング言語 (の途中まで)を 作ろう esehara shigeo
2.
お前 誰だ
3.
esehara shigeo ただのWeb系プログラマー (Python使い)
4.
Webプログラマーに ありがちな中二病
5.
Lisp ※皆様がいるカンファレンスはGo Conです。安心してください。
6.
Lispが持つ病 1. 関数型言語カッコイイ! 2. 関数型言語の元祖といえばLisp!カッ コイイ!(括弧なだけに) 3.
コンピューターサイエンス、Artifact Intelligenceの分野でも活躍! Awesome! 4. Lispが使いこなせると構文木も自由自 在!
7.
Lispは もっとも美しい 言語 ※皆様がいるカンファレンスはGo Conです。安心してください。
8.
全ての言語は S式を 信じられない 人間によって作ら れる
9.
「Lispはエリート向けの言語」
11.
LL系プログラマーに ありがちな中二病
12.
C言語 ※皆様がいるカンファレンスはGo Conです。安心してください。
13.
C言語が持つ病 1. 「Lightweight Languageって所詮富豪 プログラミングだよねー」 2.
「Lightweight Languageって所詮ポイ ンタとかメモリアドレスとか知らないんで しょ」 3. 「Lightweight Languageってコンパイル のこととか所詮わからないんでしょ」
14.
屈辱ッ!
15.
でもC言語は つらぽよ……
16.
そんな貴方の ための!!
18.
Go ※皆様がいるカンファレンスはGo Conです。安心してください。
19.
前置きは ここまで
20.
そもそもプログラミング言語 処理ってなに?
21.
How to Create
Your Own Programming Language http://createyourproglang.com/
22.
“The book I
want to read.”
23.
プログラミング言語処理の流れ 『Create your own
language』より
24.
字句解析(Tokenize) とは?
25.
文字のカタマリ によって その文字が 何に属するのか を分析する
26.
例: Haskell 2010
Language Report literal -> integer | float | char | string digit -> ascDigit | uniDigit ascDigit -> 0 | 1 | … | 9 uniDigit -> any Unicode descimal decit decimal -> digit{digit} integer -> decimal
27.
Goで 字句解析器を作ろう
28.
packageに あるよ! > Tips: 困ったら公式のGoのpackageのソースを読みましょう
29.
go/scanner
30.
使える http://www.oki-osk.jp/esc/golang/lisp.html
31.
とはいえ、 このSourceを入れ替えて 使うのはつらいので
32.
自動 生成
33.
Ragel :: State
Machine Compiler
34.
Ragel compiles executable finite
state machines from regular languages. Ragel targets C, C++, ObjectiveC, C#, D, Java, Ruby, OCaml and Go.
35.
そして
37.
Rust班も頑張ってる(まだ非公式)
38.
Ragelの書きかた # ---- Literal
---string = ("'" . (any - "'")* . "'") |('"' . (any - '"')* . '"'); integer = digit+; atom = (alpha (alpha | digit)* ); # ---- Operator ---operator = "+" | "-" | "*" | "/"; main := |* atom => { material := Ore{ Token: ATOM, Value: data[ts:te], } material.Research() ores = append(ores, material) }; String => { material := Ore{ Token: STRING, Value: data[ts:te], } material.Research() ores = append(ores, material) }; ….
39.
二つの流れ どの文字の規則を トークンとして定義するか? トークンをどのように 管理するか?
40.
文字の規則とトークン # ---- Literal
---string = ("'" . (any - "'")* . "'") |('"' . (any - '"')* . '"'); integer = digit+; atom = (alpha (alpha | digit)* ); # ---- Operator ---operator = "+" | "-" | "*" | "/";
41.
Ragelによる図式化
42.
トークンの処理 main := |* atom
=> { material := Ore{ Token: ATOM, Value: data[ts:te], } material.Research() ores = append(ores, material) };
43.
トークンの管理方法 type Ore struct
{ Token Token // int Name string }
44.
トークンの定義 const( //Special Token ILLEGAL Token
= iota EOF COMMENT begin_define_literal ATOM STRING INTEGER end_define_literal ……… ) 参考: go/token
45.
このように作った トークンの順序を 構文解析する
46.
Goで 構文解析器を作ろう
47.
toolに あるよ! >
48.
go tool yacc Yacc
is a version of yacc for Go. It is written in Go and generates parsers written in Go. (公式より)
49.
yaccとは? Yet Another Compiler Compiler
50.
go yaccの書きかた %type <val>
ATOM, STRING, OPERATOR, BINDER, DEFINE %type <val> ARG %type <val> action, Expression %type <values> StringExpression, AtomExpression %% %{ package casting import ( "fmt" ".. /miner" ) %} %union { tok int val interface{} values Val box Box } %token ATOM STRING %token ARG %token OPERATOR BINDER DEFINE %token ROUNDPAREN_O ROUNDPAREN_C action: ATOM { var v Value v = Box{Type: ATOM, Value: $1,} yylex.(*lex).NewBox(v) } | Expression { if val, ok := $1.(Val); ok { yylex.(*lex).root = val } } ...
51.
何してるの? トークンの順序を 解釈しやすいように再構築
52.
利用するトークンの定義 %token ATOM STRING %token
ARG %token OPERATOR %token BINDER DEFINE %token ROUNDPAREN_O ROUNDPAREN_C
53.
ここで一つ 問題が
54.
Ragelで宣言したトークンと go yaccで宣言したトークンは お互いどういう対応に なってるかを知らない
55.
対応させましょう var oretokens =
[...]int { miner.ATOM: ATOM, miner.STRING: STRING, miner.OPERATOR: OPERATOR, miner.BINDER: BINDER, miner.ROUNDPAREN_O: ROUNDPAREN_O, miner.ROUNDPAREN_C: ROUNDPAREN_C, } func toToken(ore miner.Ore) int { return oretokens[ore.Token] }
56.
もう一つ 問題が
57.
Go yaccで宣言したトークンが どのような型になってるべきか を教えてないといけない
58.
トークンの型定義 %union { tok int val
interface{} values Val box Box } %type <val> ATOM, STRING, OPERATOR, BINDER, DEFINE %type <val> ARG %type <val> action, Expression %type <values> StringExpression, AtomExpression
59.
あとは 抽象構文木を 作成しよう
60.
抽象構文木とは http://en.wikipedia.org/wiki/Abstract_syntax_tree
61.
抽象構文木 = Node = 配列の入れ子
62.
例
63.
Goで 抽象構文木を歩こう
64.
packageに あるよ! > Tips: 困ったら公式のGoのpackageのソースを読みましょう
65.
go/ast Package ast declares
the types used to represent syntax trees for Go packages. (公式より) ※実はPythonにも標準パッケージとしてあります
66.
ネタが尽 きました
67.
おまけ
68.
関数宣言の 管理
69.
関数宣言の管理とGlobal Environment http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/
70.
Global Environment は一つ
71.
シングルトン だ!
72.
トークンの型定義 type Env interface{} type
envs []Env var environment envs type EnvValue struct { Name string Val Env } func AccessEnv() *envs { return &environment }
73.
DEMO
74.
Go languageで大切なこと
75.
標準Package の ソースは 宝の山
76.
さしずめこんな感じ
78.
ご清聴 ありがとう ございました
79.
https://github.com/ esehara/Perid
Download