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
120
絵文字は構文解析できるのか
puripuri2100
0
120
係り受け解析を用いた法律文書中の略称規定の解析についての報告
puripuri2100
0
3.4k
気胸の胸部CTデータの可視化
puripuri2100
0
330
SATySFiの開発についての要望
puripuri2100
0
470
研究の場においてのRust 製ソフトウェアのバージョン管理について
puripuri2100
0
680
法律文書の自動解析
puripuri2100
1
1k
汎用的なコードフォーマットライブラリの作成
puripuri2100
0
360
ユーザーがカスタマイズできるクラスファイル ―v0.0.x と v0.1.x それぞれでの実装 ―
puripuri2100
0
420
Other Decks in Technology
See All in Technology
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
190
OSC2026on_the-world-is-waiting-for-your-voice.pdf
naruoga
0
360
あなたの知らないAmazon VPC Route Server/Amazon VPC Route Server you don't know about
masakiokuda
2
230
[2026 Oracle Technical Deep Dive] エンタープライズAIエージェントを支えるOCIソリューション。ラインナップと特徴を理解しよう! (2026年9月17日開催)
oracle4engineer
PRO
0
550
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
120
使いこなすために知っておきたい Azure SRE Agent アンチパターン
torumakabe
2
400
Kernel testing frameworks
ennael
PRO
0
110
AI時代のAPI開発を加速する品質ガードレール / API Quality Guardrails in the AI Era
yokawasa
0
160
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
210
インバスケット試験対策アプリを 作って見えたAIエージェント構築 ナレッジ2選
shichijoyuhi
1
130
自律型 AI をセキュアに実装!Gemini と MIG で作る動的コード実行環境
recruitengineers
PRO
1
220
SDDの運用にめげずに向き合った話
sansantech
PRO
1
130
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
510
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
440
How to Ace a Technical Interview
jacobian
280
24k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
Balancing Empowerment & Direction
lara
6
1.3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
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 などにも挑戦していきたい