我正在创建一个编译器。我遵循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
仅接受IntegerLiteral
或Identifier
?是否以唯一的方式在set方法中检查它,然后如果它与规则不匹配则抛出异常?它是最好的做法吗?我还想知道是否可以为每种节点类型创建单独的类?
答案 0 :(得分:1)
您只需在~/.profile
媒体资源的set
中查看即可。使用C#7语法。
Token