首页 > Windows开发 > 详细

笔记 - C#从头开始构建编译器 - 1

时间:2019-05-03 23:14:33      阅读:173      评论:0      收藏:0      [点我收藏+]

视频与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

原文:https://www.cnblogs.com/wqyu/p/10807005.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!