Interpreter
Problemet
Du behöver tolka och utvärdera uttryck i ett litet, avgränsat eget språk — t.ex. matematiska uttryck, sökfilter eller enkla regler. Att skriva om texten till en switch-djungel av strängjämförelser blir snabbt ohanterligt.
Lösningen
Varje del av grammatiken blir en egen klass som vet hur den tolkar (utvärderar) sig själv:
public interface IUttryck{ int Utvärdera();}
public class Tal : IUttryck{ private readonly int _värde; public Tal(int värde) => _värde = värde; public int Utvärdera() => _värde;}
public class Addition : IUttryck{ private readonly IUttryck _vänster, _höger; public Addition(IUttryck vänster, IUttryck höger) => (_vänster, _höger) = (vänster, höger); public int Utvärdera() => _vänster.Utvärdera() + _höger.Utvärdera();}
public class Multiplikation : IUttryck{ private readonly IUttryck _vänster, _höger; public Multiplikation(IUttryck vänster, IUttryck höger) => (_vänster, _höger) = (vänster, höger); public int Utvärdera() => _vänster.Utvärdera() * _höger.Utvärdera();}// Representerar: (3 + 4) * 2IUttryck uttryck = new Multiplikation( new Addition(new Tal(3), new Tal(4)), new Tal(2));
Console.WriteLine(uttryck.Utvärdera()); // 14Varje nod i trädet vet bara hur den tolkar sig själv och sina barn — hela uttrycksträdet utvärderas rekursivt utan en enda central switch.
Var det används i praktiken
Att skriva en fullständig parser för hand (text → trädstruktur) är ett eget stort ämne. I praktisk C#-kod stöter du oftare på färdiga interpreter-liknande verktyg än att bygga egna:
- Regex (se Regex) — mönstret du skriver tolkas av en inbyggd motor.
- LINQ:s uttrycksträd (
Expression<Func<T, bool>>) — bygger upp en representation av ett C#-uttryck som sedan kan tolkas och översättas, t.ex. till SQL av Entity Framework.
TL;DR
Interpreter representerar ett litet språks grammatik som ett träd av objekt, där varje nod vet hur den tolkar sig själv — rekursiv utvärdering istället för en central parsning-switch. LINQ:s uttrycksträd och regex-motorer bygger på samma grundidé.