Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SATySFiで作成する構文解析器
Search
puripuri2100
October 22, 2023
Technology
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SATySFiで作成する構文解析器
SATySFi Conf 2023
https://connpass.com/event/295734/
での発表
puripuri2100
October 22, 2023
More Decks by puripuri2100
See All by puripuri2100
法律文書の自動解析2024
puripuri2100
0
110
絵文字は構文解析できるのか
puripuri2100
0
120
係り受け解析を用いた法律文書中の略称規定の解析についての報告
puripuri2100
0
3.4k
気胸の胸部CTデータの可視化
puripuri2100
0
330
SATySFiの開発についての要望
puripuri2100
0
470
研究の場においてのRust 製ソフトウェアのバージョン管理について
puripuri2100
0
670
法律文書の自動解析
puripuri2100
1
1k
汎用的なコードフォーマットライブラリの作成
puripuri2100
0
360
ユーザーがカスタマイズできるクラスファイル ―v0.0.x と v0.1.x それぞれでの実装 ―
puripuri2100
0
420
Other Decks in Technology
See All in Technology
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
160
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
200
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
3k
データ_AIの事業の勝敗をわけるもの
nek0128
0
360
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
27
22k
AI de Idea
kawaguti
PRO
2
110
Amazon Quick on DesktopがIAM Identity Centerで動かない理由
yukiogawa
0
190
映像変換サーバーなしで端末内でHLSを生成してライブ配信
hikarusato
0
110
AI に書かせたその API、 “信頼” できますか?
nagix
0
110
2026/09/10 Spring Bootから Jakarta EE/MicroProfileへの移行
megascus
0
370
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
1
1.3k
今話題のAI「Jev」って何? 宇宙最速で学ぶ会
minorun365
PRO
21
13k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Design in an AI World
tapps
1
320
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
690
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
600
The Pragmatic Product Professional
lauravandoore
37
7.4k
Transcript
SATYSFIで作成する構文解析器 金子尚樹 (@puripuri2100) SATYSFI Conf 2023 2023 年 10 月
22 日
1/17 自己紹介 インターネットネーム: puripuri2100 筑波大学情報科学類 2 年 satysfi-code-printer や satysfi-ruby
などのパッケージの作成 satysfi-base のメンテ・コントリビュート SATySFi Advent Calendar (2018 - 2022) の主催 SATySFi Conf (2020 - 2023) の主催 SATySFi Slack の管理
2/17 今日の発表の概要 今! SATySFi 他のフォーマットを解析するのがアツい!!!!!
2/17 今日の発表の概要 今! SATySFi 他のフォーマットを解析するのがアツい!!!!! puripuri2100 の中で
2/17 今日の発表の概要 今! SATySFi 他のフォーマットを解析するのがアツい!!!!! puripuri2100 の中で 最近大量に構文解析ライブラリを作っているので紹介したい
2/17 今日の発表の概要 今! SATySFi 他のフォーマットを解析するのがアツい!!!!! puripuri2100 の中で 最近大量に構文解析ライブラリを作っているので紹介したい 便利なのでみんな使ってね!
構文解析とは 構文解析とは
構文解析とは 3/17 概要 構造を持ったテキストを解析して対応するデータ構造を生成すること
構文解析とは 3/17 概要 構造を持ったテキストを解析して対応するデータ構造を生成すること 木構造や配列を持つ文字列の例(JSON フォーマット) 1 { 2 "foo"
: "foo", 3 "bar" : { 4 "bar1" : [1,2,3], 5 "bar2" : [ 6 {"baz1" : 123, "baz2" : -1.2}, 7 {"baz3" : null, "baz4" : true} 8 ] 9 } 10 }
構文解析とは 4/17 構文解析が必要な場面 外部とプログラムがデータをやり取りするときに便利 どの OS に存在しているインターフェースとしてのファイル・テキスト もちろんエンコーディングに関しては別の問題があるが、最近は UTF8 前提
にしても良さそう 人がプログラムにデータを渡すときにもファイルやテキストを介して行う コンパイラにソースコードを与えるときや設定ファイルを与えるとき
構文解析とは 5/17 テキストからデータへの変換の例 1 { 2 "foo" : "foo", 3
"bar" : [{"baz1" : 123}, {"baz2" : null}] 4 }
構文解析とは 5/17 テキストからデータへの変換の例 1 { 2 "foo" : "foo", 3
"bar" : [{"baz1" : 123}, {"baz2" : null}] 4 } 1 Value([ 2 (`foo`, String(`foo`)); 3 (`bar`, List([ 4 Value(`baz1`, Int(123)); 5 Value(`baz2`, Null); 6 ])); 7 ])
構文解析とは 6/17 構文解析の流れ 一番単純な解析方法は k 個先読みの再帰下降パーサ 以下のような処理を行う関数を組み合わせて作っていく
構文解析とは 6/17 構文解析の流れ 一番単純な解析方法は k 個先読みの再帰下降パーサ 以下のような処理を行う関数を組み合わせて作っていく (a) トークンのリストを受け取る
構文解析とは 6/17 構文解析の流れ 一番単純な解析方法は k 個先読みの再帰下降パーサ 以下のような処理を行う関数を組み合わせて作っていく (a) トークンのリストを受け取る (b)
他の同様な解析用の関数を規則に応じて順に呼び出してデータの列を 作り、それらをまとめて一つのデータを作る
構文解析とは 6/17 構文解析の流れ 一番単純な解析方法は k 個先読みの再帰下降パーサ 以下のような処理を行う関数を組み合わせて作っていく (a) トークンのリストを受け取る (b)
他の同様な解析用の関数を規則に応じて順に呼び出してデータの列を 作り、それらをまとめて一つのデータを作る (c) 生成したデータと残りのトークンのリストの 2 つを返す
構文解析とは 6/17 構文解析の流れ 一番単純な解析方法は k 個先読みの再帰下降パーサ 以下のような処理を行う関数を組み合わせて作っていく (a) トークンのリストを受け取る (b)
他の同様な解析用の関数を規則に応じて順に呼び出してデータの列を 作り、それらをまとめて一つのデータを作る (c) 生成したデータと残りのトークンのリストの 2 つを返す トークンのリストの終端と規則の終端が一致したら終了
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
これがこう 1 List([ 2 String(`1`); 3 List([String(`2`), String(`3`), String(`4`)]), 4 String(`あ`) 5 ])
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
BNF で書くと 1 list ::= <LCurlyBraces> <items> <RCurlyBraces> 2 items ::= <item> <Comma> <items> | <item> 3 item ::= <string> <list> 4 string ::= <空白文字とカンマと角括弧以外の全て> <string> 5 LCurlyBraces ::= [ 6 RCurlyBraces ::= ] 7 Cooma ::= ,
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
関数を定義に合わせて一つずつ作って相互に呼び出す
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
1 let-rec parse-list tokens = 2 match tokens with 3 | '[' :: xs -> 4 let (items, xs) = parser-items xs in 5 match xs with 6 | ']' :: xs -> List(items) ^:: (parse-list xs) 7 | _ -> panic () 8 | x :: xs when is-WS x -> parse-list tokens 9 | _ -> panic ()
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
1 and parse-items tokens = 2 let (item, xs) = parse-item tokens in 3 match xs with 4 | ',' :: xs -> item ^:: (parse-items xs) 5 | x :: xs when is-WS x -> parse-items xs 6 | _ -> (item, xs)
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
1 and parse-item tokens = 2 match tokens with 3 | '[' :: xs -> parse-list tokens 4 | x :: xs when is-WS x -> parse-item xs 5 | _ -> parse-string tokens
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
1 and parse-string tokens = 2 match tokens with 3 | '[' :: _ -> ('', tokens) 4 | ',' :: _ -> ('', tokens) 5 | x :: xs when is-WS x -> ('', tokens) 6 | x :: xs -> x ^^ (parse-string xs) 7 | [] -> ('', [])
構文解析とは 7/17 構文解析の例 カンマ区切りのリスト(入れ子有り)を解析する例。空白は無視する 1 [1, [2, 3, 4], あ]
リストを解析する関数を呼び出す 解析の終端と入力の終端と一致しているかの検査を行う 1 let parser tokens = 2 let (lst, xs) = parse-list tokens in 3 match xs with 4 | [] -> lst 5 | _ -> panic ()
SATYSFIで書かれた構文解析器の紹介 SATYSFIで書かれた構文解析器の紹介
SATYSFIで書かれた構文解析器の紹介 8/17 なぜ SATYSFIで構文解析器を書くのか 世界には便利なフォーマットが溢れているから json toml csv xml bibtex
既存の資産を手軽に利用したい 外部のファイルを読み込めるプリミティブと組み合わせて最強に read-file : string -> string list
SATYSFIで書かれた構文解析器の紹介 9/17 構文解析器を作るための方法の紹介 再帰関数とパターンマッチ 先ほど紹介した方法
SATYSFIで書かれた構文解析器の紹介 9/17 構文解析器を作るための方法の紹介 再帰関数とパターンマッチ 先ほど紹介した方法 base ライブラリの parser パッケージ パーサーコンビネータという「よくあるパターンに合わせて関数を組み合わ
せて組み上げる」手法 Haskell の Parsec ライブラリがよく似ている
SATYSFIで書かれた構文解析器の紹介 9/17 構文解析器を作るための方法の紹介 再帰関数とパターンマッチ 先ほど紹介した方法 base ライブラリの parser パッケージ パーサーコンビネータという「よくあるパターンに合わせて関数を組み合わ
せて組み上げる」手法 Haskell の Parsec ライブラリがよく似ている 正規表現で括り出し 一番手軽だが正確性に欠ける 正規表現で表すことができる言語の範囲は小さい
SATYSFIで書かれた構文解析器の紹介 9/17 構文解析器を作るための方法の紹介 再帰関数とパターンマッチ 先ほど紹介した方法 base ライブラリの parser パッケージ パーサーコンビネータという「よくあるパターンに合わせて関数を組み合わ
せて組み上げる」手法 Haskell の Parsec ライブラリがよく似ている 正規表現で括り出し 一番手軽だが正確性に欠ける 正規表現で表すことができる言語の範囲は小さい 自分は再帰関数とパターンマッチで頑張るのが好き
SATYSFIで書かれた構文解析器の紹介 10/17 作った構文解析ライブラリたち satysfi-json
SATYSFIで書かれた構文解析器の紹介 10/17 作った構文解析ライブラリたち satysfi-json satysfi-csv
SATYSFIで書かれた構文解析器の紹介 10/17 作った構文解析ライブラリたち satysfi-json satysfi-csv satysfi-xml
SATYSFIで書かれた構文解析器の紹介 10/17 作った構文解析ライブラリたち satysfi-json satysfi-csv satysfi-xml satysfi-bibtex-parser
SATYSFIで書かれた構文解析器の紹介 10/17 作った構文解析ライブラリたち satysfi-json satysfi-csv satysfi-xml satysfi-bibtex-parser satysfi-code-printer
SATYSFIで書かれた構文解析器の紹介 11/17 satysfi-json JSON フォーマットのパース JSON フォーマットへの変換 JSON5 という拡張フォーマットも解析できるようになっている satysfi-aux
ファイルにデータを埋めこむときとかに便利(黒魔術) GitHub リポジトリ https://github.com/puripuri2100/SATySFi-json
SATYSFIで書かれた構文解析器の紹介 12/17 satysfi-csv CSV フォーマットのパース CSV フォーマットへの変換 改行文字やダブルクオーテーションのエスケープ、区切り文字の変更にも 対応 CSV
ファイルを表に変換する csvtable パッケージの裏側に使ってもらっ てる https://satyrographos-packages.netlify.app/packages/csvtable GitHub リポジトリ https://github.com/puripuri2100/SATySFi-csv
SATYSFIで書かれた構文解析器の紹介 13/17 satysfi-xml XML フォーマットのパース XML フォーマットへの変換 CDATA セクション (<![CDATA]]>)
や参照形式などにも対応 将来的にはこれを使って SVG の解析と自動描画や HTML の解析なども行 いたい GitHub リポジトリ https://github.com/puripuri2100/SATySFi-xml
SATYSFIで書かれた構文解析器の紹介 14/17 satysfi-bibtex-parser BibTeX フォーマットのパース アクセント記号にも対応 パースだけをするので、 BiByFi などの参考文献管理用ライブラリへの変換 は個別に必要
最近作ったのでまだ satyrographos に登録できていない …… GitHub リポジトリ https://github.com/puripuri2100/SATySFi-bibtex-parser
SATYSFIで書かれた構文解析器の紹介 15/17 satysfi-code-printer 厳密には少し違うが、内部で解析的な何かをするので紹介する コードを綺麗に組版するためのライブラリ 各言語の構文を表す正規表現やマッチするかの判定をする関数を引数に与 える (a) マッチする部分を取得して色を付けてフォントを変える (b)
マッチした部分の残りを再度判定関数などに渡す (c) 繰り返す このスライドのコードの組版もこれを使っている GitHub リポジトリ https://github.com/puripuri2100/satysfi-code-printer
SATYSFIで書かれた構文解析器の紹介 16/17 今後解析できるようにしたいフォーマット markdown toml yaml
SATYSFIで書かれた構文解析器の紹介 16/17 今後解析できるようにしたいフォーマット markdown toml yaml 設定ファイルを解析できると文書についての設定を外部化できたりして面白 そうではあるが、一応 JSON 形式を解析できるので優先度は低い
SATYSFIで書かれた構文解析器の紹介 16/17 今後解析できるようにしたいフォーマット markdown toml yaml 設定ファイルを解析できると文書についての設定を外部化できたりして面白 そうではあるが、一応 JSON 形式を解析できるので優先度は低い
markdown を解析し SATySFi の文書中に埋めこむことができたらとても面 白いので取り組みたいと思っている。将来的には本体の markdown 機能を 廃止してより抽象かされた機能にできるかも … ?
17/17 まとめ SATySFi でも構文解析ができる 様々なライブラリを作っており、徐々に便利になっている satysfi-json satysfi-csv satysfi-xml satysfi-bibtex-parser satysfi-code-printer
将来的には markdown や svg などにも挑戦していきたい