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
170
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
Azure Copilot Resiliency Agentをいろいろ試してみる
tomokusaba
0
89
30代後半からでも遅くないキャリア形成
tomokusaba
0
300
GitHub Copilotで書いたコード、レビューはどうしてる?
tomokusaba
0
60
Azure CAFで考えるAIエージェント導入の進め方
tomokusaba
1
120
GitHub Copilot app時代の開発フロー
tomokusaba
0
83
GitHub Copilot appとGitHub Copilot CLIとVS CodeのCopilot Chat Agent Modeの使い分け
tomokusaba
0
220
GitHub Copilot app最速の発信の裏側
tomokusaba
1
600
自宅サーバの変遷
tomokusaba
0
940
Microsoft Build Keynoteふりかえり
tomokusaba
0
190
Other Decks in Technology
See All in Technology
GitHub Agentic Workflows を触ってみる
htkym
2
640
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
1
500
Argo CDとAtlantisで実現するインフラ管理のセルフサービス化──小規模SREチームで支えるプラットフォーム
cassius7
0
160
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
500
EventBridge に「合流」はない ― サーバーレスのワークフローを育てるということ / No Join in EventBridge
yusukeshimizu
2
560
エージェントはローカル、検証はMicroVM — Lambda MicroVMsでつくるServerless CI
fujioka6789
3
800
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例
taiki45
2
330
時うどん〜Socket.getifaddrsで学ぶネットワーク編 / Tokiudon: The Socket.getifaddrs Edition
coe401_
4
270
LLMに渡さなかった仕事
nanaism
0
12k
Antigravity SDK for the Java Developer
glaforge
0
210
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
1
260
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Building Adaptive Systems
keathley
44
3.2k
Site-Speed That Sticks
csswizardry
13
1.5k
The Spectacular Lies of Maps
axbom
PRO
1
1k
Ruling the World: When Life Gets Gamed
codingconduct
0
360
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
430
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
770
The Cost Of JavaScript in 2023
addyosmani
55
10k
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)
おしまい