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
オートマトンと字句解析でRoslynを読む
Search
tomokusaba
July 24, 2026
Technology
15
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
オートマトンと字句解析でRoslynを読む
オートマトンと字句解析でRoslynを読む
.NETラボ 勉強会 2026年7月
https://dotnetlab.connpass.com/event/393450/
tomokusaba
July 24, 2026
More Decks by tomokusaba
See All by tomokusaba
GitHub Copilot appとGitHub Copilot CLIとVS CodeのCopilot Chat Agent Modeの使い分け
tomokusaba
0
120
GitHub Copilot app最速の発信の裏側
tomokusaba
1
490
自宅サーバの変遷
tomokusaba
0
760
Microsoft Build Keynoteふりかえり
tomokusaba
0
150
GitHub Copilot CLIでWebアクセシビリティを改善した話
tomokusaba
0
720
GitHub Copilot CLI で考える複数エージェント設計
tomokusaba
0
250
GitHub Copilot appで変わる GitHub Copilot CLI開発体験
tomokusaba
1
1.5k
アクセシビリティはすべての人のもの
tomokusaba
0
450
GitHub Copilot Dev Days
tomokusaba
0
210
Other Decks in Technology
See All in Technology
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
430
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
290
Type-safe IaC for Dart
coborinai
0
180
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.5k
AI Native なプロダクト組織の立ち上げ方 : 生産性 100 倍への挑戦
mikesorae
0
1.2k
OPENLOGI Company Profile for engineer
hr01
1
74k
Network Firewallやっていき!
news_it_enj
0
260
kaonavi Tech Night#1
kaonavi
0
150
AI、CDK と協働する Full TypeScript アプリケーション開発 / Full TypeScript Application with AI and CDK
geekplus_tech
2
460
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
3
970
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
280
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
360
Featured
See All Featured
Speed Design
sergeychernyshev
33
1.9k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
410
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.8k
Crafting Experiences
bethany
1
230
Designing Powerful Visuals for Engaging Learning
tmiket
1
450
Docker and Python
trallard
47
4k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Prompt Engineering for Job Search
mfonobong
0
380
Leo the Paperboy
mayatellez
8
1.9k
Deep Space Network (abreviated)
tonyrice
0
230
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Transcript
オートマトンと字句解析でRoslynを読む .NETラボ 勉強会 2026年7月 FutureOne株式会社 草場 友光
自己紹介 • 2022/08-2027 Microsoft MVP (Microsoft Azure, Developer Technologies) •
tomo_kusaba • ドラクエ大好き ドラクエ10のプレイ時間→ 1キャラ目:2691時間 2キャラ目:919時間 3キャラ目:793時間 4キャラ目:190時間(配信用)
Azure Well-Architected & Resiliencyって? • 日本語に直訳すれば「Azureの適切な設計と回復性」 • 実質的にはAzure CAFやW-AFなどを参考文章としてAzure の適切な設計についてのコンテンツが評価
• 開発者としてインフラを意識した設計というのは不可欠ですので とてもシナジーのあるテクノロジー分野と感じた
注意 • 個人の見解・解釈が多分に入っています。 • 見解の相違・事実誤認などありましたらご指摘ください。
今日の目的 • どんな壮大なプロジェクトも根底は基礎理論がとても重要です。 • 今回は、オートマトンと字句解析の話を通じてRoslynについて** 雰囲気**だけ味わってもらいます。 厳密な論理実証は30分という短い時間なので割愛します。
コンピューター言語とは? • 以下長いので言語と略 • 言語は受け入れたい文字列の集合 • 受け入れたい文字列が俗に言う「文法」
オートマトンについて • DFA(Deterministic Finite Automaton決定性有限オート マトン)は現在の状態と入力によって次の状態が決定できる機械 • NFA(Nondeterministic Finite Automaton非決定性有限
オートマトン)は次の状態が複数あり得る機械 • 履歴をすべて持たない • DFAが有限であるとは入力文字列をまるごと記憶しない • 記憶するのは現在の状態だけ
集合とオートマトン • 一般的に有限オートマトンは以下のような形式で表されます (Q, Σ,δ, q0, F) 記号 意味 詳細
Q 状態 状態列の許可値集合 Σ 入力記号集合 入力し得るイベントの集合 δ 遷移関数 許可遷移表 q0 開始状態 初期状態の定義 F 受理状態集合 終端の定義
DFAについて 状態 意味 できること 0円 まだ投入なし 50円または100円入れる 50円 50円投入済み さらに50円または100円入れる
購入可能 100円以上 商品を出す Start 100円 0円 50円 50円 50円 購入可能 100円 商品を出す End
字句解析器(Lexer) • ソースコードの文字列をトークンに分解する処理 var answer = 3 + 4; トークン文字列
トークン種類 説明 var Identifier Token 文脈キーワードとして解釈され得る識別子 answer Identifier 識別子 = EqualsToken 代入演算子 3 NumericLiteralToken 数値リテラル + PlusToken 加算演算子 4 NumericLeteralToken 数値リテラル ; SemicolonToken 文の区切り
オートマトンを字句解析器に当てはめる 記号 意味 字句解析 Q 状態 トークン種類(Identifier, Equals, Semicolon) Σ
入力記号集合 テキスト文字列 δ 遷移関数 トークンからどのトークンへ遷移可能かの許可表 q0 開始状態 F 受理状態集合 (EndOffFileToken)
字句解析器とオートマトン • 現在のトークンから次の入力文字のトークン種別が限定される • 文法をトークン分解して状態として表したものがオートマトンとし て表現できる • 字句解析は「今は識別子を呼んでいる」「数値を呼んでいる」とい う状態を持ち、次の文字で振る舞いを変える動きをする •
実際の実装はパフォーマンス的な問題でそのままの状態遷移とし て実装されるとは限りません。
最長一致の原則 • 字句解析では1文字だけ、一致したからといってすぐにTokenを 決めない。 • 必要ならば次の文字もみて最長で一致したtokenを採用する • 例)+を見たとき次が=であるならば+=、次が+ならば++ いずれでもないならば+です。
Roslynとオートマトンとの用語対比 用語 意味 記号 Roslynでみる例 SourceText ソースコード全体の文字列を表す入力 Σ CSharpSyntaxTree.ParseText(Sour ceText)
lexeme 分類前の入力から切り出した文字列 token lexemeに種類をつけたもの SyntaxKind token,node,triviaの種類を表す SyntaxKind.PlusToken SyntaxToken 構文木の中にあるtokenの公開API表現 token.Kind(), token.Text SyntaxTrivia 空白、改行、コメントのように構文の外側につく情 報 WhitespaceTrivia, SingleLineCommentTrivia SyntaxNode tokenを組み合わせた構文上のまとまり LocalDeclarationStatementSyntax Diagnostic エラーや警告など解析中に見つかった問題 token.GetDiagnostics() green tree 親や位置を持たない内部表現の構文木 InternalSyntax 側の node / token red tree 親・位置・SyntaxTreeへの参照を持つ公開API 側の構文木 GetRoot() で触る node / token answer, 40, + Q IdentifierToken, NumericLiteralToken
ParseTextからLexerへ 行 意味 new InternalSyntax.Lexer(...) 文字列をtokenに分ける字句解析器を作る new InternalSyntax.Language Parser(...) token
を受け取り、文・式・宣言などの構文に組み立てる parser を 作る ParseCompilationUnit() C# ファイル全体を表す構文木の根を作る CreateRed() 内部表現から、公開 API として辿れる red tree を作る
つまりやっていること • LexerがSourceTextをtokenに分ける • tokenをLanguageParserが受け取る • CompilationUnitSyntaxというC#ファイル全体を表すノード へまとめる • green
treeを作りそれを公開APIとしてred treeとして作る
Lexer 読む順番 メソッド 内容 1 Lex 現在の LexerMode に応じて、通常 token・directive・XML
doc comment などの読み方を選ぶ 2 LexSyntaxToken leading trivia、token 本体、trailing trivia をまとめて 1 つの SyntaxToken にする 3 ScanSyntaxToken 現在の文字を見て SyntaxKind を決める 4 ScanIdentifierOrKeyword 識別子・キーワード候補を読む。内部で ScanIdentifier などに進 む 5 Create TokenInfo から SyntaxFactory で実際の token を作る
ScanSyntaxToken • 最長一致の考えでTokenを選ぶ a++ + b 入力位置 読み方 token a
識別子として読む IdentifierToken ++ 2 文字をまとめて読む PlusPlusToken + 空白のあと、1 文字の演算子とし て読む PlusToken b 識別子として読む IdentifierToken
TokenInfoからSyntaxTokenへ • Tokenの種類ごとに必要情報を集めてくる Tokenの種類 必要情報 例 識別子 表面上の文字列、値としての文字列、 contextual keyword
var, answer 数値リテラル 表面上の文字列、数値としての値、型の候補 40, 0x10 文字リテラル 引用符やエスケープを含む文字列 "¥¥n" 記号Token ほぼ、SyntaxKindだけで足りる +, =, ;
Triviaを読む • 空白、改行、コメントを捨てるのではなくtokenのleading triviaまたはtrailing triviaとして持つ • この構造があるのでRoslynはコード修正やリファクタリングをし てもコメントや空白を保ったまま新しい構文木を作れる
オートマトンとRoslyn Lexerでの姿 オートマトン理論 Roslyn Lexer での姿 状態 LexerMode、TextWindow.Position、読み取り中の token 種別
入力記号 現在位置の char、または Unicode エスケープを解釈した文字 遷移関数 ScanSyntaxToken や ScanIdentifier の分岐 受理状態 TokenInfo.Kind が決まり、token の終端に到達した状態 受理ラベル SyntaxKind.IdentifierToken など 出力 SyntaxFactory が作る SyntaxToken
まとめ 理論 コンパイラー Roslyn 集合 数字、英字、空白、記号の分類 char の判定、Lexer 内の分岐 関係
/ 関数 (状態, 入力) -> 次の状態 トークンを読むための状態遷移 言語 受け入れたい文字列の集合 識別子、数値、文字列などのトー クンパターン DFA / NFA 入力を読み進める有限状態機械 ScanSyntaxToken などの分 岐を DFA 的に眺める トークン 字句解析の出力 SyntaxKind.IdentifierToke n など 構文木 トークンを構文に組み立てたモデル CSharpSyntaxTree.ParseT ext と CompilationUnitSyntax
Roslynはとっても巨大だけども • 文字を読み、Tokenを分類して、状態を進める • この原則には全く変わりはなくオートマトンの考え方が適用でき る • 実コードは最適化のためのファーストパスが存在するだけで考え 方は全く同じ
宣伝
C# Kaigi 2026(9/19)
おしまい