Sto provando a scrivere un parser di discesa ricorsiva (senza scanner) con una regola "catch all" per la seguente grammatica "Modello di baffi" (semplificata qui):
content : (variable_tag | section_tag | static)*
variable_tag : mustache_open id mustache_close
section_tag : mustache_open '#' id mustache_close
content mustache_open '/' id mustache_close
mustache_open : '{{'
mustache_close : '}}'
id : [a–zA–Z$_][a–zA–Z0–9$_]*
static : .+ // "catch all"
La produzione static
dovrebbe fermarsi prima della prossima produzione abbinata. E non posso venire a una soluzione per questo che non rompere la struttura grammaticale.
Un input valido è:
You have just won {{value}} dollars!
{{#in_ca}}
Well, {{taxed_value}} dollars, after taxes.
{{/in_ca}}
L'output per questo sarebbe un albero sintattico astratto come:
+-------+
|Content|
+-------+
|
+---------------+------+--------+--------------+
| | | |
+--------------+ +-----------+ +-------------+ +----------+
|Static | |VariableTag| |Static | |SectionTag|
|"\nYou...won "| |value | |" dollars"\n"| |in_ca |
+--------------+ +-----------+ +-------------+ +----------+
|
+-------+
|Content|
+-------+
|
+-------------+----+--------------+
| | |
+----------+ +-----------+ +---------------------+
|Static | |VariableTag| |Static |
|"\nWell, "| |taxed_value| |" dollars...taxes.\n"|
+----------+ +-----------+ +---------------------+
Qualsiasi riferimento a un'implementazione di una regola "catch all" per un parser di discesa ricorsivo?