BNF
What is parsing
多くのプログラミング言語はBNFによる文法の定義を持っている
Ecmascriptも例外ではなく
ECMA262の仕様書のAppendix A Grammar Summary
というページが存在し、そこにBNFで文法が定義されている
https://262.ecma-international.org/14.0/#sec-grammar-summary
Slide 14
Slide 14 text
Parse手法
What is parsing
プログラミング言語をParseする方法はいくつか種類がある
Slide 15
Slide 15 text
Top-Down Parsing
What is parsing
Top-Down Parsing
• 再帰下降構文解析
• LL(N)
Slide 16
Slide 16 text
再帰下降構文解析
What is parsing
それぞれの文法をParseするための関数を
再帰的に呼び出すことでParseする手法
手書き向き
Slide 17
Slide 17 text
LL(N)
What is parsing
Left To RightでParseし、左端導出というものを行う
Slide 18
Slide 18 text
左端導出
What is parsing
const a = "Hello World"
7BSJBCMF%FDMBSBUJPO.PEJ
fi
FS*EFOUJ
fi
FS&YQS PNJU
.PEJUJ
fi
FSlDPOTUzclMFUz
*EFOUJ
fi
FS$IBS PNJU
Slide 19
Slide 19 text
const a = "Hello World"
7BSJBCMF%FDMBSBUJPO
const a = "Hello World"
.PEJUJ
fi
FS
const a = "Hello World"
.PEJUJ
fi
FS *EFOUJ
fi
FS
lDPOTUz
const a = "Hello World"
.PEJUJ
fi
FS *EFOUJ
fi
FS
lDPOTUz
$IBS PNJU
B
Slide 20
Slide 20 text
const a = "Hello World"
.PEJUJ
fi
FS *EFOUJ
fi
FS
lDPOTUz
$IBS PNJU
B
&YQS PNJU
const a = "Hello World"
.PEJUJ
fi
FS *EFOUJ
fi
FS
lDPOTUz
$IBS PNJU
B
&YQS PNJU
4USJOH-JUFSBM 0NJU
l)FMMP8PSMEz
Slide 21
Slide 21 text
const a = "Hello World"
.PEJUJ
fi
FS *EFOUJ
fi
FS
lDPOTUz
$IBS PNJU
B
&YQS PNJU
4USJOH-JUFSBM 0NJU
l)FMMP8PSMEz
7BSJBCMF%FDMBSBUJPO
Slide 22
Slide 22 text
Bottom-Up Parsing
What is parsing
Bottom-Up Parsing
• LR(N)
• LALR(N)
Slide 23
Slide 23 text
LR法
What is parsing
Left To RightでParseし、右端導出を行う
手書きでは作成が難しく
BisonやYacc等のParserジェネレータを使い
状態遷移テーブルから次の状態を決め
最終的な文法が決まる
Slide 24
Slide 24 text
右端導出
What is parsing
const a = "Hello World"
7BSJBCMF%FDMBSBUJPO.PEJ
fi
FS*EFOUJ
fi
FS&YQS PNJU
.PEJUJ
fi
FSlDPOTUzclMFUz
*EFOUJ
fi
FS$IBS PNJU
Slide 25
Slide 25 text
const a = "Hello World"
.PEJUJ
fi
FS 4
const a = "Hello World"
.PEJUJ
fi
FS 3
*EFOUJ
fi
FS 4
lDPOTUz
const a = "Hello World"
.PEJUJ
fi
FS 3
*EFOUJ
fi
FS 3
lDPOTUz
$IBS PNJU
B
< DPOTU
4
4FYQFDUFE>
<.PEJ
fi
FS
B
4
4FYQFDUFE>
<.PEJ
fi
FS
*EFOUJ
fi
FS
4>
Slide 26
Slide 26 text
const a = "Hello World"
.PEJUJ
fi
FS 3
*EFOUJ
fi
FS 3
lDPOTUz
$IBS PNJU
B
&YQS PNJU
4
const a = "Hello World"
.PEJUJ
fi
FS 3
*EFOUJ
fi
FS 3
lDPOTUz
$IBS PNJU
B
&YQS PNJU
3
4USJOH-JUFSBM PNJU
3
l)FMMP8PSMEz
<.PEJ
fi
FS
*EFOUJ
fi
FS
4>
<.PEJ
fi
FS
*EFOUJ
fi
FS
&YQS>
Slide 27
Slide 27 text
const a = "Hello World"
.PEJUJ
fi
FS 3
*EFOUJ
fi
FS 3
lDPOTUz
$IBS PNJU
B
&YQS PNJU
3
4USJOH-JUFSBM PNJU
3
l)FMMP8PSMEz
<7BSJBCMF%FDMBSBUJPO>
Slide 28
Slide 28 text
結局?
What is parsing
Javascriptは一応LL(1)の文法なので
再帰下降構文解析を使うことが多い
メジャーなJavascriptエンジンは手書きで書いている
Slide 29
Slide 29 text
結局?
What is parsing
LRの構文解析器を作成するためには
BNFレベルで文法の曖昧さをなくしていく必要があるが
JavascriptはBNFレベルでは厳密なパースができないので
むしろ手書き以外だと非常に面倒なことになる