SlideShare uma empresa Scribd logo
1 de 14
コンパイラ(LexとYaccを使う)
かたわれ@名古屋低レイヤー勉強会
1
自己紹介
• 名前:かたわれ(八木 鶫)
• 所属:名古屋工業大学
• Twitter:@_ktwr
• 最近の困りごと:研究が忙しすぎる
2
お品書き
• コンパイラについて緩い説明
• 字句解析器とlex
• 構文解析器とyacc
• 電卓を作ってみよう
3
コンパイラって?
4
コンパイラとは
• コンピュータの自動プログラミングに使うプログラ
ムの一種。一般に、一定方式に従い、使用機種には
依存せず人間に分かりよい形で書いたプログラムを、
機械コード(=機械がすぐ実行できる形)に翻訳す
る仕事を受け持つ。また「コンパイラ言語(=コン
パイラに与えるために約束された人工言語)」の略
語としても使う。
5
高級言語(C,C++,Java等)を
機械語に翻訳する
コンパイラの処理の流れ
6
字句解析
構文解析
実行コード生成
ソースコード
実行
lexとyaccとは
7
字句解析
構文解析
実行コード生成
ソースコード
実行
Lex(flex)
Yacc(bison)
実行コード生成
ソースコード
実行
字句解析
• Lexical Analysis:字句解析
• 字句解析器はトークンを得る
• トークン:「num」「=」「1」「+」「3」「;」
⇒意味を持つ、これ以上分割できない最小単位
• トークンには型がつけられる
• 「1」「3」 :NUMBER
• 「=」 :ASSIGN
• 「+」 :ADD
• 「num」 :IDENT
• 「;」 :SEMICOLON
8
num = 1 + 3;
型は構文解析で使うよ
lex:a lexical analyzer generator
• 字句解析器を生成するプログラム
• 正規表現とC言語の関数を使う
9
C言語の変数を記述
ここの変数は構文解析でも使える
字句解析のルールを記述
一番長いルールに一致するものを探す
Lex単体で動かすときの
main関数を記述
構文解析
• syntactic analysis:構文解析
• 字句解析をもとに構文木を作る
• バッカスナウア(BNF)記法が使われる
• IDENT ::= NUMBER ADD NUMBER
10
+
1 3
yacc:yet another compiler compiler
• 構文解析器を生成するパーサジェネレーター
• lexと違って単独で動かすことはない
• 三部構成
• 宣言部
• トークンを宣言する
• ルール部
• BNF記法で構文規則記述
• プログラム部
• main関数記述
11
簡単な電卓を作る
12
lexプログラム yaccプログラム四則演算の
トークン作成
改行の
トークン作成
数字の
トークン作成
何もしない
ための定義
Lexで作成した
トークンを宣言
下に行くほど
優先度が高い
構文木作成
再帰で処理を記入
プログラム部
CTFで出るの?
• (ほぼ)出ない
• 知ってることでやれることがあるかも
• ASIS Cyber Security Contest Finals 2014:
ASIS calc†
• lexとyaccのプログラムは
解析できないとき
「syntax error」と出す
13
†https://github.com/ctfs/write-ups-2014/tree/master/asis-ctf-finals-2014/asis-calc
参考文献
• https://www.ibm.com/developerworks/jp/linux/
library/l-lexyac/index.html
• http://cis.k.hosei.ac.jp/~nakata/lectureCompiler
/YaccLex/
14

Mais conteúdo relacionado

Semelhante a コンパイラ(Lexとyaccを使う)

Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...No Bu
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
nl-1. 形態素解析と構文解析
nl-1. 形態素解析と構文解析nl-1. 形態素解析と構文解析
nl-1. 形態素解析と構文解析kunihikokaneko1
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版Katsuhiro Morishita
 
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -Yuki Katada
 
一口で何度もおいしい?DSL
一口で何度もおいしい?DSL一口で何度もおいしい?DSL
一口で何度もおいしい?DSLYou&I
 
2011年10月21日
2011年10月21日2011年10月21日
2011年10月21日nukaemon
 
OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作uchan_nos
 
プログラミング言語として考えたTensor flow
プログラミング言語として考えたTensor flowプログラミング言語として考えたTensor flow
プログラミング言語として考えたTensor flowKeisuke Umezawa
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Narami Kiyokura
 
捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)mosa siru
 
C# と .NET と ・・・
C# と .NET と ・・・C# と .NET と ・・・
C# と .NET と ・・・ShinichiAoyagi
 
BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版
BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版
BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版Go Yamada
 
自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptxhkharu0803
 
サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...
サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...
サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...Madoka Chiyoda
 

Semelhante a コンパイラ(Lexとyaccを使う) (20)

Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
nl-1. 形態素解析と構文解析
nl-1. 形態素解析と構文解析nl-1. 形態素解析と構文解析
nl-1. 形態素解析と構文解析
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
 
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
 
一口で何度もおいしい?DSL
一口で何度もおいしい?DSL一口で何度もおいしい?DSL
一口で何度もおいしい?DSL
 
2011年10月21日
2011年10月21日2011年10月21日
2011年10月21日
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作
 
プログラミング言語として考えたTensor flow
プログラミング言語として考えたTensor flowプログラミング言語として考えたTensor flow
プログラミング言語として考えたTensor flow
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
 
捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)
 
C# と .NET と ・・・
C# と .NET と ・・・C# と .NET と ・・・
C# と .NET と ・・・
 
RedPen texconf15
RedPen texconf15RedPen texconf15
RedPen texconf15
 
Clrh 110827 wfho
Clrh 110827 wfhoClrh 110827 wfho
Clrh 110827 wfho
 
BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版
BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版
BPstudy#64 ドキュメントを作りたくなってしまう魔法のツール Sphinx 2012年版
 
自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx
 
Common Lisp ユーザへのScheme紹介
Common Lisp ユーザへのScheme紹介Common Lisp ユーザへのScheme紹介
Common Lisp ユーザへのScheme紹介
 
サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...
サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...
サーバーレス(Azure Functions)でスマートスピーカーのアプリを作ってみよう ( #GoogleHome / LINE #Clova/ Ama...
 

Mais de kataware

セキュリティ関連OSSツール紹介
セキュリティ関連OSSツール紹介セキュリティ関連OSSツール紹介
セキュリティ関連OSSツール紹介kataware
 
名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~kataware
 
Isolation forest
Isolation forestIsolation forest
Isolation forestkataware
 
git入門(講義っぽく)
git入門(講義っぽく)git入門(講義っぽく)
git入門(講義っぽく)kataware
 

Mais de kataware (6)

セキュリティ関連OSSツール紹介
セキュリティ関連OSSツール紹介セキュリティ関連OSSツール紹介
セキュリティ関連OSSツール紹介
 
名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~
 
Isolation forest
Isolation forestIsolation forest
Isolation forest
 
git入門(講義っぽく)
git入門(講義っぽく)git入門(講義っぽく)
git入門(講義っぽく)
 
0511 lt
0511 lt0511 lt
0511 lt
 
Abc#004d
Abc#004dAbc#004d
Abc#004d
 

コンパイラ(Lexとyaccを使う)