私は単純な字句解析ツールを書いています。そして私は認識された各トークンに属性を付ける必要性を理解しています。のは、私が得たものを見てみましょう:トークン属性
レクサーで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; }
}
私はthier値&クラスを設定するトークンをキュー。しかし、属性についてはどうですか?既存のトークンクラスに関連して機能をどのように設計する必要がありますか?
まず取り払わは私の心に入って来たのだった。
- が内部トークンクラス(私はその数が整数と実などが可能性を意味する)「あいまいな-実体」のプライベート抽象クラスを宣言します。
- 次に、継承されたクラスを宣言します。
public class Comma : PunctuationSeparator {}
; - プロパティを追加
Object Attribute {get; private set;}
; - 次に、
private void ApplyAttribute()
のようなメソッドを作成します。 - トークンをインスタンス化してプロパティを設定すると、
ApplyAttribute()
が呼び出されます。 ApplyAttribute()
のように使用してください。if(CurToken.Attribute is Integer)
ような何かを書くのは簡単だろうパーサでswitch(this.TokenClass) { case this.TokenClass.Number: { this.Attribute = (Int32.TryParse(this.Value))? new Integer() : new Real(); } }
。 そうすることを止めることの1つは、私が作成すべきクラスの数です。この解決策は受け入れられますか?
あなたのドメインのオントロジーを持っていますか:
あなたはテランスパーの本(複数可)を見てすることがあります?異なる種類の空のクラスを作る必要はありません。あなたはすでに相続の構造を作りましたか?おそらく、異なるタイプの 'PunctuationSeperator'を設定すれば十分でしょう。 – Marnix
いいえまだここに記載されているものは作成していません。これらは私の計画と疑問です。それは役に立つと思われるが、クラス... ...私は決定することはできません..助け:)あなたの最後の文をどういう意味ですか? – lexeme
'PunctuationSeperator'のようなクラスを作成するとき。さまざまな引用[カンマ、ピリオド、セミコロ]を使用して、そこにもenumを定義すると便利です。だから最初に、私はあなたがそのようなdescisionを行う前に、あなたのドメインがどのように定義する必要がありますと思います。 – Marnix