设为首页 加入收藏

TOP

笔记 - C#从头开始构建编译器 - 1
2019-09-17 18:33:13 】 浏览:28
Tags:笔记 从头 开始 构建 编译器

视频与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.eva luator

(1) class eva luator

5. 其他

比如诊断信息等

 

C#语言点:

1.public override IEnumerable<SyntaxNode> GetChildren() => Enumerable.Empty<SyntaxNode>();

2.yield

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【WPF】一些拖拽实现方法的总结(.. 下一篇C# 校验并转换 16 进制字符串到字..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目