限制设置为属性的值

时间:2017-08-19 19:12:07

标签: c# compiler-construction abstract-syntax-tree

我正在创建一个编译器。我遵循Token定义:

public sealed class Token
    {
        public TokenType Type { get; private set; }
        public string Lexeme { get; private set; }
        public int CurrentLine { get; private set; }

        public Token(TokenType type, string lexeme, int currentLine)
        {
            Type = type;
            Lexeme = lexeme;
            CurrentLine = currentLine;
        }
    }

TokenType是一个枚举,其中我有不同的令牌类型。

public enum TokenType
    {

        // keyword
        PrintKeyword,
        VarKeyword,
        //...

        // literal
        IntegerLiteral,
        //...

        // identifier
        Identifier,

        //...
    }

tokenizer为解析器提供令牌流,然后解析器开始生成抽象语法树。在我的实现中,我为每个节点类型都有一个类。

class Operand
    {
        Token token { get; set; }
            //Token.Type
                //IntegerLiteral || Identifier

    }

    class Term
    {
        Token termOperator { get; set; }
            //Token.Type
                //Multiplication || Division
        Operand termOperand1 { get; set; }
        Operand termOperand2 { get; set; }

    }

    //...

如您所见,其中一个类是Operand,它存储解析器给出的令牌。如何保护它,以便<OperandObjHere>.token仅接受IntegerLiteralIdentifier?是否以唯一的方式在set方法中检查它,然后如果它与规则不匹配则抛出异常?它是最好的做法吗?我还想知道是否可以为每种节点类型创建单独的类?

1 个答案:

答案 0 :(得分:1)

您只需在~/.profile媒体资源的set中查看即可。使用C#7语法。

Token