Я написал простой лексический анализатор. И я понимаю необходимость предоставления каждому признанному токену атрибуту. Давайте посмотрим, что я получил:Атрибуты токена
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; }
}
В лексере я епдиеий маркер настройку тир класса значения &. Но как насчет атрибутов? Как мне создать функцию относительно моего существующего класса токенов?
Сначала учил пришло мне в голову было:
- Объявить частные абстрактные классы «неоднозначных-сущностей» (я имею в виду, что номер может быть Integer и Real и т.д.) внутри маркера класса;
- Затем объявите унаследованные классы, например.
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)
. Одна вещь, которая мешает мне делать это, - это количество классов, которые я должен создать. Является ли это решение приемлемым?
У вас есть онтология домена? Не должно быть, чтобы вы делали всевозможные пустые классы. Вы уже создали структуру наследования? Возможно, установка различных типов «ПунктуацияSeperator's» достаточно. – Marnix
Нет, я еще не создал ничего описанного здесь. Это только мои планы и сомнения. Кажется, это полезно, но ... классы ... я не могу решить .. помогите :) Что значит сказать последнее предложение? – lexeme
При создании класса, такого как 'PunctuationSeperator'. Было бы также полезно определить перемычку там, с разными значениями [запятая, период, полуколокон]. Итак, сначала, я думаю, вы должны определить, как ваш домен, прежде чем принимать такое решение. – Marnix