using System; using NTERA.EmuEra.Game.EraEmu.GameData.Expression; namespace NTERA.EmuEra.Game.EraEmu.Sub { internal abstract class Word { public abstract char Type { get; } public bool IsMacro; public virtual void SetIsMacro() { IsMacro = true; } } internal sealed class NullWord : Word { public override char Type => '\0'; public override string ToString() { return "/null/"; } } internal sealed class IdentifierWord : Word { public IdentifierWord(string s) { code = s; } readonly string code; public string Code => code; public override char Type => 'A'; public override string ToString() { return code; } } internal sealed class LiteralIntegerWord : Word { public LiteralIntegerWord(Int64 i) { code = i; } readonly Int64 code; public Int64 Int => code; public override char Type => '0'; public override string ToString() { return code.ToString(); } } internal sealed class LiteralStringWord : Word { public LiteralStringWord(string s) { code = s; } readonly string code; public string Str => code; public override char Type => '\"'; public override string ToString() { return "\"" + code + "\""; } } internal sealed class OperatorWord : Word { public OperatorWord(OperatorCode op) { code = op; } readonly OperatorCode code; public OperatorCode Code => code; public override char Type => '='; public override string ToString() { return code.ToString(); } } internal sealed class SymbolWord : Word { public SymbolWord(char c) { code = c; } readonly char code; public override char Type => code; public override string ToString() { return code.ToString(); } } internal sealed class StrFormWord : Word { public StrFormWord(string[] s, SubWord[] SWT) { strs = s; subwords = SWT; } readonly string[] strs; readonly SubWord[] subwords; public string[] Strs => strs; public SubWord[] SubWords => subwords; public override char Type //@はSymbolがつかっちゃった => 'F'; public override void SetIsMacro() { IsMacro = true; foreach(SubWord subword in SubWords) { subword.SetIsMacro(); } } } internal sealed class TermWord : Word { public TermWord(IOperandTerm term) { this.term = term; } readonly IOperandTerm term; public IOperandTerm Term => term; public override char Type => 'T'; } internal sealed class MacroWord : Word { public MacroWord(int num) { this.num = num; } readonly int num; public int Number => num; public override char Type => 'M'; public override string ToString() { return "Arg" + num; } } }