"ohne größeren aufwand" ... ist ein dehnbarer begriff ...
du wirst vermutlich einen parser für EBNF schreiben müssen, der das ganze in einen graphen überführt, und die test primitiven (string/regex vergleich) in objekte überführt
jedes element des graphen, ob blatt oder nicht, muss für einen eingabestring vermelden ob es den string akzeptiert, und wieviele zeichen es "verbrauchen kann" ... alles was kein blatt des graphen ist, muss den test an seine untergeordneten knoten weitergeben.
für untergeordnete knoten muss es eine prioritätsliste geben in welcher reihenfolge sie zu testen sind.
untergeordnete knoten der priorität 0 sind als erste dran ...
untergeordnete knoten einer priorität n != 0 werden nur getestet, wenn ein knoten der priorität n-1 die eingabe akzeptiert ... für den test der knoten der priorität n sind die verbrauchten zeichen der vorgängers mit der priorität n-1 aus der eingabe zu entfernen
ein knoten der kein blatt ist meldet die eingabe nur als akzeptiert, wenn knoten aller vorhandenen prioritäten die eingabe akzeptieren
...
das ganze ist also umsetzbar ... nur bleibt die frage des aufwands ...