笔记 - C#从头开始构建编译器 - 1
视频与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
笔记 - C#从头开始构建编译器 - 1的更多相关文章
- 笔记 - C#从头开始构建编译器 - 2
视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-02.md 作者是 Immo Landwerth(https:// ...
- 笔记 - C#从头开始构建编译器 - 3
视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-03.md 作者是 Immo Landwerth(https:// ...
- keras 学习笔记:从头开始构建网络处理 mnist
全文参考 < 基于 python 的深度学习实战> import numpy as np from keras.datasets import mnist from keras.model ...
- 软工读书笔记 week 9 ——《构建之法》
软工读书笔记 week 9 ——<构建之法> 最近的三周我们正式开始我们的项目.然后我也把<构建之法>中的相关章节再拿出来读了一番.以下是一些 ...
- [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设
[HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...
- blfs(systemd版本)学习笔记-为桌面环境构建xorg服务
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs准备使用桌面环境,首先需要构建xorg服务 xorg服务项目地址:http://www.linuxfromscratch. ...
- blfs(systemv版本)学习笔记-为桌面环境构建xorg服务
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs准备使用桌面环境,首先需要构建xorg服务 xorg服务项目地址:http://www.linuxfromscratch. ...
- 软工读书笔记 week 5 ——《构建之法》
本周主要对<构建之法>中的一部分进行阅读. 一.软件与软件工程究竟是什么? 本书的概论部分就指出“软件 = 程序 + 软件工程”.而我们这门课的名字就叫“现代软件工程”.其实在上课之前,我 ...
- 《Maven实战》笔记-10-灵活的构建
一.灵活构建的意义 一个优秀的构建系统必须足够灵活,它应该能够让项目在不同的环境下都能成功地构建.例如,典型的项目都会有开发环境.测试环境和产品环境,这些环境的数据库配置不尽相同,那么项目构建的时候就 ...
随机推荐
- Vue实现图片预加载
<script>export default { data () { return { count: 0, } }, mounted: function() { this.preload( ...
- python脚本使用源码安装不同版本的python
# coding=utf-8 import os import sys # 判断是否是root用户 if os.getuid() == 0: pass else: print('当前用户不是root用 ...
- Qt编写气体安全管理系统15-网络转发
一.前言 在本系统中网络转发是个什么功能含义呢,其实就是将本地采集设备的所有数据打包发送到指定的网络地址,默认采用UDP的形式,无连接开销小,我也是看到很多的组态软件有这个功能,其实现有的很多的气体探 ...
- 敏感信息直接在 nginx 通过环境变量设置
通常我们在维护PHP线上项目的时候,为了隔离配置和代码,会使用fastcgi_param的形式将环境变量定义在Nginx的配置文件中(Apache可以使用SetEnv指令).这样在PHP-FPM运行过 ...
- 【440】Tweet 元素意义
参考:Tweet Object 参考:Geo Objects 参考:User Object Ref: Place data dictionary Tweet Object Attribut ...
- Django之Restful API
理解Restful架构:http://www.ruanyifeng.com/blog/2011/09/restful RESTful设计指南:http://www.ruanyifeng.com/blo ...
- python 中删除文件中的空白行(回车)
staff.txt 内容: Alex Li,Engineer,1363432345,alex@126.com Jack Zhang,Salesman,Sales Dep,15697892356,jac ...
- 【NANO】引脚说明
http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=489650&page=1
- prometheus数据格式
注意区分以下两种“数据格式”: 1.自定义exporter的时候所需要遵循的给prometheus提供数据的数据格式: https://yunlzheng.gitbook.io/prometheus- ...
- curl实现put请求
<?php function curlrequest($url,$data,$method='post'){ $ch = curl_init(); //初始化CURL句柄 curl_setopt ...