Continuo a ricevere pila overflow quando si tenta di utilizzare lo Spirito per analizzare roba
-
12-09-2019 - |
Domanda
ho pensato quando ho iniziato a ricevere overflow dello stack che era ora di venire qui a chiedere;)
Sto cercando di imparare ad usare Spirito Boost in questo momento. Ho capito le cose di base. Da quando ho avuto K & R a portata di mano (che contiene la grammatica C) ho deciso di vedere se potevo fare un accettore per la lingua. Questo è stato più o meno il mio obiettivo originale in ogni caso, dal momento che alla fine ho voglio usare questo come un preprocessore per raccogliere alcune informazioni da strutture di dati e roba.
Sono in grado di analizzare le costanti e stringhe, ma quando provo ad analizzare questo comincio ad avere problemi.
postfix_expression =
primary_expression
// omitting some other rules for simplicity's sake
| (postfix_expression >> chseq+p("++"))
| (postfix_expression >> chseq_p("--"));
primary_expression =
identifier
| constant
| string_literal;
// The parsers for constants and strings are
// pretty trivial so I'm not going to C+P them here.
Quando passo in qualcosa di simile i++
fallisce. Presumo che ciò è dovuto al fatto i
è una primary_expression
valido e in modo da non andare avanti per verificare la ++
o --
. Ho provato a mettere in fondo, e poi vengo overflow dello stack. Sto diventando un po 'di ricorsione infinita sinistra qui, ma non so come risolverlo.
Soluzione
Dovrete sbarazzarsi della ricorsione sinistra. Questo articolo di Wikipedia spiega alcune tecniche:
http://en.wikipedia.org/wiki/Left_recursion
Tuttavia, potrebbe non essere possibile. C ha una sintassi abbastanza flessibile e può non fornire abbastanza contesto per consentire una discesa parser ricorsivo di funzionare a meno che Boost Spirito permette backtracking. O sarete in grado di farlo, ma le associazioni sarà indietro.
Si può essere meglio utilizzare uno strumento basato su LALR come bisonti.