Recommended
PDF
PDF
PDF
PDF
PDF
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
PDF
awk v.s. bashどっちが強い?@OSC2011Tokyo
KEY
PDF
GNU awk (gawk) を用いた Apache ログ解析方法
PDF
PDF
PPTX
PDF
菩薩でもわかる!Rで動かすExcelアドインの作り方
PPT
PDF
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
KEY
PDF
Node.js Error & Debug Leveling
PDF
PDF
PDF
KEY
PDF
Lisp Tutorial for Pythonista : Day 3
PDF
PDF
Start printf 6_takarakasai
PDF
KEY
KEY
PDF
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
PDF
Yapc -asia 2012 lt @studio3104
PDF
PPT
Parsing Left Recursive PEG
More Related Content
PDF
PDF
PDF
PDF
PDF
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
PDF
awk v.s. bashどっちが強い?@OSC2011Tokyo
KEY
PDF
GNU awk (gawk) を用いた Apache ログ解析方法
What's hot
PDF
PDF
PPTX
PDF
菩薩でもわかる!Rで動かすExcelアドインの作り方
PPT
PDF
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
KEY
PDF
Node.js Error & Debug Leveling
PDF
PDF
PDF
KEY
PDF
Lisp Tutorial for Pythonista : Day 3
PDF
PDF
Start printf 6_takarakasai
PDF
KEY
KEY
PDF
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
PDF
Yapc -asia 2012 lt @studio3104
Similar to PCさえあればいい。
PDF
PPT
Parsing Left Recursive PEG
PDF
PPTX
Ocaml lecture slides 01 at axsh
PDF
Scalaの文字列処理 Day 2 リテラル・補間子・特殊な文字
PDF
PPT
PPT
KEY
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
PDF
PPTX
PDF
PDF
PDF
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
PDF
PPTX
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
KEY
Algebraic DP: 動的計画法を書きやすく
PDF
PPTX
More from bleis tift
PDF
PDF
PPTX
解説?FSharp.Quotations.Compiler
PDF
PDF
PDF
PDF
PDF
PDF
PDF
yield and return (poor English ver)
PDF
PDF
PDF
PDF
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
PDF
PDF
F#によるFunctional Programming入門
PDF
VBAを書きたくない話(Excel-DNAの紹介)
PDF
PDF
PDF
PCさえあればいい。 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. データ構造
type Json =
| JNull
| JBool of bool
| JNumber of float
| JString of string
| JList of Json list
| JObject of Map<string, Json>
21. 用意したデータ構造に変換
// この発表ではFParsecというライブラリを使います
let jnull = pstring "null" >>% JNull
let jtrue = pstring "true" >>% (JBool true)
let jfalse = pstring "false" >>% (JBool false)
let jnumber = pfloat |>> JNumber
let str = manyChars (noneOf """) |> between (pchar '"') (pchar '"')
let jstring = str |>> JString
let jvalue, jvalueRef = createParserForwardedToRef ()
let jlist =
sepBy jvalue (pchar ',')
|> between (pchar '[') (pchar ']') |>> JList
let jobject =
let jprop = str .>> pchar ':' .>>. jvalue
sepBy jprop (pchar ',')
|> between (pchar '{') (pchar '}')
|>> (Map.ofList >> JObject)
jvalueRef :=
choice [ jobject; jlist; jstring; jnumber; jtrue; jfalse; jnull ]
let json : Parser<Json, unit> = jvalue .>> eof
22. おしまい
let parse str =
match run json str with
| Success (res, _, _) -> res
| Failure (msg, _, _) -> failwithf "oops!: %s" msg
23. 24. 25. 26. 27. JSONパーサー(改良版)
let ws = spaces
let jnull = pstring "null" .>> ws >>% JNull
let jtrue = pstring "true" .>> ws >>% (JBool true)
let jfalse = pstring "false" .>> ws >>% (JBool false)
let jnumber = pfloat .>> ws |>> JNumber
let str = manyChars (noneOf """) |> between (pchar '"') (pchar '"') .>> ws
let jstring = str |>> JString
let jvalue, jvalueRef = createParserForwardedToRef ()
let jlist =
sepBy jvalue (pchar ',' .>> ws)
|> between (pchar '[' .>> ws) (pchar ']' .>> ws) |>> JList
let jobject =
let jprop = str .>> pchar ':' .>> ws .>>. jvalue
sepBy jprop (pchar ',' .>> ws)
|> between (pchar '{' .>> ws) (pchar '}' .>> ws)
|>> (Map.ofList >> JObject)
jvalueRef :=
choice [ jobject; jlist; jstring; jnumber; jtrue; jfalse; jnull ]
let json : Parser<Json, unit> = ws >>. jvalue .>> eof
28. 29. 30. こんな感じで
let str =
let nonEscaped = noneOf """ |> many1Chars
let escaped =
pchar '"' >>. anyOf @"""/bfnrt"
|>> function
| 'b' -> "b"
| 'f' -> "f"
| 'n' -> "n"
| 'r' -> "r"
| 't' -> "t"
| c -> string c
let elem = nonEscaped <|> escaped // four hex digitsなやつは省略
manyStrings elem |> between (pchar '"') (pchar '"') .>> ws
31. 32. こう?
let integer = regex "([1-9][0-9]*|0)" |>> Int
let real = regex @"([1-9][0-9]*|0).[0-9]*" |>> Real
let number = integer <|> real
33. 34. 35. 36. 37. これでOK
let integer = regex "([1-9][0-9]*|0)" |>> Int
let real = regex @"([1-9][0-9]*|0).[0-9]*" |>> Real
// attemptでrealが失敗したら、realが消費した文字を入力に戻す
let number = attempt real <|> integer
38. 39. 40. パーサー
let integer = pint32 .>> ws |>> Integer
let expr, exprRef = createParserForwardedToRef ()
let add =
tuple2 (expr .>> pchar '+' .>> ws) integer |>> Add
let sub =
tuple2 (expr .>> pchar '-' .>> ws) integer |>> Sub
exprRef := choice [attempt add; attempt sub; integer]
41. 42. 43. 44. 左再帰の繰り返しへの変換
// 元のコードの意味(左再帰)
// expr ::= expr op integer
// | integer
// から、下記(繰り返し)に変換
// expr ::= integer (op integer)*
let expr =
integer .>>. (many (op .>>. integer))
|>> fun (x, xs) -> List.fold (fun x (f, y) -> f x y) x xs
and op =
anyOf "+-" .>> ws
|>> (function
| '+' -> fun a b -> Add(a, b)
| '-' -> fun a b -> Sub(a, b)
| other -> invalidOp ("invalid char: " + string other))
45. 46. chainl1を使いましょう
// expr ::= integer (op integer)*
let expr = chainl1 integer op
and op =
anyOf "+-" .>> ws
|>> (function
| '+' -> fun a b -> Add(a, b)
| '-' -> fun a b -> Sub(a, b)
| other -> invalidOp ("invalid char: " + string other))
47. 48.