Я написал простой лексический анализатор.И я понимаю необходимость предоставления каждому распознанному токену атрибута.Давайте посмотрим, что я получил:
public sealed class Token
{
public enum TokenClass
{
Identifier,
StringLiteral,
NumberLiteral,
Operator,
PunctuationSeparator,
Bracket,
Parenthesis
}
public TokenClass Class { get; internal set; }
public String Value { get; internal set; }
}
В лексере я ставлю токены в очередь, устанавливая их значение и класс.Но как насчет атрибутов?Как мне разработать функцию относительно моего существующего класса токенов?
Первое, что пришло мне в голову, было:
- Объявить частные абстрактные классы "неоднозначных сущностей" (я имею в виду, чтоЧисло может быть целым и действительным и т. Д.) Внутри класса токена;
- Затем объявить унаследованные классы, например
public class Comma : PunctuationSeparator {}
; - Добавить свойство
Object Attribute {get; private set;}
; - Затем создать методкак
private void ApplyAttribute()
; - Вызов
ApplyAttribute()
, когда создается токен и установлены свойства; Используйте что-то подобное внутри ApplyAttribute()
.
switch(this.TokenClass)
{
case this.TokenClass.Number:
{
this.Attribute = (Int32.TryParse(this.Value))? new Integer() : new Real();
}
}
В парсере было бы легко написать что-то подобное if(CurToken.Attribute is Integer)
.Одна вещь, которая мешает мне делать это, это количество классов, которые я должен создать.Это решение приемлемо?