何となく勉强した気分になれるパーサ入门
- 17. MicroMark文法
start = doc
doc = block+
block = headline / blankline / paragraph
headline = "#"+ " " textline
paragraph = textline+ blankline
textline = !headline inline+ "n"
inline = char
char = [^n]
blankline = "n"
- 18. MicroMark文法
開始 = 文書
文書 = ブロック+
ブロック = 見出し / 改行 / パラグラフ
見出し = "#"+ " " テキスト行
パラグラフ = テキスト行+ 改行
テキスト行 = !見出し インライン+ "n"
インライン = 文字
文字 = [^n]
改行 = "n"
- 20. MicroMark for PEG.js
start = doc
doc = block:block+ { return "<body>"+block.join("")+"</body>"; }
block = headline / blankline / paragraph
headline = pre?x:"#"+ " " textline:textline
{ return "<h" + pre?x.length + ">" + textline + "</h" + pre?x.length+">"; }
paragraph = textline:textline+ blankline { return "<p>" + textline.join("") +"</p>"; }
textline = !headline inline:inline+ "n" { return inline.join(""); }
inline = char
char = ch:[^n] { return ch; }
blankline = "n" { return ""; }
https://gist.github.com/takahashim/150faec504955ef7b0f7
これをhttp://pegjs.org/onlineの
左側に貼れば試せます。
- 29. 文脈自由文法
?CFG, context free grammar
?普通のBNFで表現できる文法
?BNFはCFGの記法の一つ、らしい
?プログラミング言語、マークアップ言語とかは
だいたいコレ(+α)
?+αがあると文脈依存文法の範囲になる
?-αのことも多い
- 30. CFGの例
start = exp
exp = primary + exp
? primary - exp
? primary
primary = integer
? ( exp )
integer = [0-9]+
start = exp
exp = exp + exp
? exp - exp
? ( exp )
? primary
primary = integer
integer = [0-9]+
PEGやLLで
使える文法
PEGやLLでは
使えない文法
- 40. PEGの例
start = exp
exp = primary + exp
/ primary - exp
/ primary ←これが先頭に来るとNG
primary = integer
/ ( exp )
integer = [0-9]+