Continuo a ricevere pila overflow quando si tenta di utilizzare lo Spirito per analizzare roba

StackOverflow https://stackoverflow.com/questions/1107654

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top