Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SATySFiで作成する構文解析器
Search
puripuri2100
October 22, 2023
Technology
0
190
SATySFiで作成する構文解析器
SATySFi Conf 2023
https://connpass.com/event/295734/
での発表
puripuri2100
October 22, 2023
Tweet
Share
More Decks by puripuri2100
See All by puripuri2100
絵文字は構文解析できるのか
puripuri2100
0
28
係り受け解析を用いた法律文書中の略称規定の解析についての報告
puripuri2100
0
1.9k
気胸の胸部CTデータの可視化
puripuri2100
0
230
SATySFiの開発についての要望
puripuri2100
0
370
研究の場においてのRust 製ソフトウェアのバージョン管理について
puripuri2100
0
520
法律文書の自動解析
puripuri2100
1
620
汎用的なコードフォーマットライブラリの作成
puripuri2100
0
280
ユーザーがカスタマイズできるクラスファイル ―v0.0.x と v0.1.x それぞれでの実装 ―
puripuri2100
0
310
mdbook-satysfiを作成しました
puripuri2100
0
560
Other Decks in Technology
See All in Technology
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
150
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
220
Application Development WG Intro at AppDeveloperCon
salaboy
0
180
フルカイテン株式会社 採用資料
fullkaiten
0
40k
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
110
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
170
[FOSS4G 2019 Niigata] AIによる効率的危険斜面抽出システムの開発について
nssv
0
310
SSMRunbook作成の勘所_20241120
koichiotomo
1
110
なぜ今 AI Agent なのか _近藤憲児
kenjikondobai
4
1.3k
New Relicを活用したSREの最初のステップ / NRUG OKINAWA VOL.3
isaoshimizu
2
570
AGIについてChatGPTに聞いてみた
blueb
0
130
Featured
See All Featured
Become a Pro
speakerdeck
PRO
25
5k
The Cult of Friendly URLs
andyhume
78
6k
RailsConf 2023
tenderlove
29
900
Into the Great Unknown - MozCon
thekraken
32
1.5k
Being A Developer After 40
akosma
86
590k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Producing Creativity
orderedlist
PRO
341
39k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
410
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Optimizing for Happiness
mojombo
376
70k
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 などにも挑戦していきたい