2012-09-27 11 views
5

Sto per scrivere un parser per un linguaggio simile alla matematica e ho scoperto che sarebbe bello invocare talvolta la mia grammatica dello spirito per le parti secondarie dell'espressione da analizzare.Sono consentite le grammatiche boost-spirit ricorsive?

vale a dire se sto per analizzare

a+b*c+d 

sarebbe utile per chiamare parse() sul 'b * c' parte durante l'interrogazione il segno '+'.

È possibile eseguire questa operazione durante l'utilizzo della stessa istanza della grammatica? (Il parametro grammaticale sarebbe '* this')

Anche se non sono ancora del tutto convinto che questo sia il modo migliore per eseguire questo particolare compito, trovo la domanda piuttosto interessante, dal momento che non ho trovato nulla nei documenti .

Ovviamente non dovrei dipendere da variabili locali o globali della classe se ho usato questa tecnica. Ma mi piacerebbe sapere se è principalmente permesso dal disegno dello spirito.

EDIT:

mie istanze di grammatica apparire come segue:

class MyGrammar : public boost::spirit::qi::grammar<...> 
{ 
    /* a few rules. Some with local and/or inherited attributes */ 
    MyGrammar(void) 
    { 
     /* assign all the rules, use a few 'on_error' statements */ 
     // In one or two rules I would like to invoke parse(...,*this,...) 
     // on a subrange of the expression 
    } 
} 

Grazie!

+0

come l'istanza assomiglia? – elyashiv

+0

@elyashiv Vedi modifica – iolo

+1

Questa è una domanda altamente specifica con uno snippet di codice privo di significato. Perché non inizi con gli esempi nella documentazione: http://boost-spirit.com/home/doc/ – sehe

risposta

6

Naturalmente è possibile:

// In one or two rules I would like to invoke parse(...,*this,...) 
// on a subrange of the expression 

^Che non è come le regole sono composte in una grammatica dichiarativa. Sembra che tu pensi a questo in termini procedurali (il che potrebbe indicare che potresti avere esperienza precedente nella scrittura di parser ricorsivi-discendenti?).


Fuori della parte superiore della mia mente una semplice grammatica espressione di spirito potrebbe essere la seguente:

literal  = +qi::int_; 
    variable = lexeme [ qi::alpha >> *qi::alnum ]; 
    term  = literal 
       | variable 
       | (qi::lit('(') > expression >> ')'); 

    factor  = term >> *(qi::char_("+-") >> term); 
    expression = factor >> *(qi::char_("*/%") >> term); 

Nota la ricorsione nel l'ultimo ramo di term: si parser di espressioni tra parentesi.

Questo campione semplicistico non genererà in realtà un albero di analisi che riflette la precedenza degli operatori. Ma i campioni e i test nella libreria Spirit contengono molti esempi.

Vedi anche altre risposte di mine che mostrano come funziona in modo più dettagliato (con i campioni completo):

Speranza che aiuta

+0

Ok. Grazie. In realtà ho finito per implementarlo usando semplici regole. (Era più facile di quanto pensassi prima) - Ma comunque. Hai risposto alla domanda! – iolo

Problemi correlati