笔记 - C#从头开始构建编译器 - 1
2024-08-26 17:56:14
视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-01.md
作者是 Immo Landwerth(https://twitter.com/terrajobst),微软 .NET 团队的项目经理。
这一集主要内容是一个原始的递归下降 Parser。
思路:
1.Lexer
(1) enum SyntaxKind
(2) abstract class SyntaxNode
(3) class SyntaxToken : SyntaxNode
(4) class Lexer
2.Expression
(1) abstract class ExpressionSyntax : SyntaxNode
(2) sealed class NumberExpressionSyntax : ExpressionSyntax
(3) sealed class BinaryEpressionSyntax : ExpressionSyntax
(4) sealed class ParenthesizedExpressionSyntax : ExpressionSyntax
3.Parser
(1) sealed class SyntaxTree
(2) class Parser
处理优先级的技巧:
public ExpressionSyntax ParseTerm()
{
var left = ParseFactor(); while (Current.Kind == SyntaxKind.PlusToken || Current.Kind == SyntaxKind.MinusToekn)
{
var operatorToken = NextToken();
var right = ParseFactor();
left = new BinaryEpressionSyntax(left, operatorToken, right);
} return left;
} public ExpressionSyntax ParseFactor()
{
var left = ParsePrimaryExpression(); while (Current.Kind == SyntaxKind.StarToken || Current.Kind == SyntaxKind.SlashToken)
{
var operatorToken = NextToken();
var right = ParsePrimaryExpression();
left = new BinaryEpressionSyntax(left, operatorToken, right);
} return left;
}
4.Evaluator
(1) class Evaluator
5. 其他
比如诊断信息等
C#语言点:
1.public override IEnumerable<SyntaxNode> GetChildren() => Enumerable.Empty<SyntaxNode>();
2.yield
最新文章
- lua 例子
- [转]Meta http-equiv属性详解
- Effective C++ -----条款19:设计class犹如设计type
- CloseableHttpResponse的使用
- chromium浏览器开发系列第四篇:如何调试最新chromium源码
- IT公司100题-21-输入n和m,和等于m
- Windows XP与Windows 7系统常见漏洞
- Codeforces Round #237 (Div. 2) B. Marathon(卡long long)
- eclipse集承jboss服务器
- js获取天气
- Church encoding
- 《JavaScript 闯关记》之表达式和运算符
- android第一天错误
- Matlab 之meshgrid, interp, griddata 用法和实例
- [WC2014]紫荆花之恋(动态点分治+替罪羊思想)
- sublime text 3 3103 注册码
- 测试开发之前端——No4.HTML5中的事件属性
- Android Studio自动排版的两种方法
- ASP.NET 之 EntityFramework实体框架搭建
- A Bug&#39;s Life-----poj2492(关系并查集)