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
オートマトンと字句解析でRoslynを読む
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
tomokusaba
July 24, 2026
Technology
190
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
M5Stackで作る BLEマウス GPSログの世界
tomokusaba
0
290
Azure Copilot Resiliency Agentをいろいろ試してみる
tomokusaba
0
160
30代後半からでも遅くないキャリア形成
tomokusaba
0
320
GitHub Copilotで書いたコード、レビューはどうしてる?
tomokusaba
0
67
Azure CAFで考えるAIエージェント導入の進め方
tomokusaba
1
130
GitHub Copilot app時代の開発フロー
tomokusaba
0
91
GitHub Copilot appとGitHub Copilot CLIとVS CodeのCopilot Chat Agent Modeの使い分け
tomokusaba
0
240
GitHub Copilot app最速の発信の裏側
tomokusaba
1
620
自宅サーバの変遷
tomokusaba
0
970
Other Decks in Technology
See All in Technology
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
590
Classmethod Company Deck
satoshi7
0
190
V8のArray.prototype.flatを最大約20倍速くするまでと、巨大OSSへの大規模コミットの道のり
riyaamemiya
0
280
go-sqletch
moznion
0
140
ゲームのリアルタイム通信から見た QUIC と MoQ
segadevtech
0
120
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
110
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
150
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
120
その Valkey 使いこなしていますか?
onk
PRO
5
850
味覇で作るパスタが美味い - 20261001_yabaubuki.dev
livesense
PRO
0
130
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
230
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
320
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
620
How to make the Groovebox
asonas
2
2.5k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Product Roadmaps are Hard
iamctodd
55
13k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
410
Navigating Team Friction
lara
192
16k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
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)
おしまい