using System.Collections.Generic;
public class ReservedWords
Dictionary<string, HashSet<string>> _types;
public ReservedWords(StringComparer comparer)
_types = new Dictionary<string, HashSet<string>>();
_values = new HashSet<string>(comparer);
this(StringComparer.Ordinal)
public void AddWord(string type, string word)
public void DefineType(string type) => _types.Add(type, new HashSet<string>());
public void DefineType(string type, params string[] values)
_types.Add(type, new HashSet<string>(values));
foreach (var v in values)
public bool IsOneOf(string token, string type) => _types[type].Any(d => d.Equals(token));
public bool IsOneOf(string token, params string[] types)
return _types.Where(k => types.ToList().Contains(k.Key)).Any(v => v.Value.Contains(token));
public bool IsReserved(string token) => _values.Any(s => s.Equals(token));
public string GetType(string token)
return _types.FirstOrDefault(kv => kv.Value.Equals(token)).Key;
public bool HasType(string type) => _types.ContainsKey(type);
public StringComparer Comparer { get; set; }
static DotNetAsm.ReservedWords Reserved = new DotNetAsm.ReservedWords(StringComparer.OrdinalIgnoreCase);
public static void Main()
string[] cpu65816 = { "65816", "65C02", "6502" };
Reserved.DefineType("65816", "mvp", "sep", "rep", "jml");
Reserved.DefineType("65C02", "bra", "phx", "phy");
Reserved.DefineType("6502i", "isb", "jam");
Reserved.DefineType("6502", "lda", "and", "ora", "brk");
Console.WriteLine("Is \"{0}\" one of \"{1}\"? {2}", token, type, Reserved.IsOneOf(token, type));
Console.WriteLine("Is \"{0}\" one of \"{1}\"? {2}", token, string.Join(",", cpu65816), Reserved.IsOneOf(token, cpu65816));