2014-12-13 13 views
5

Ho visto alcuni post relativi alle sfumature dell'uso di parole chiave/identificatore nelle grammatiche qi, ma non riesco a dare un senso a come l'approccio dimostrato negli esempi di boost dovrebbe funzionare ...boost :: spirit :: qi parole chiave e identificatori

Parole dichiarazione:

qi::symbols<char> keywords; 

Esempio set di parole chiave:

keywords.add 
     ("foo") 
     ("bar") 
     ; 

Identifier dichiarazione regola:

qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier; 

Ecco come la regola identificatore è definito nelle Calc e compilatore esempi qi:

identifier = !keywords >> qi::raw[ qi::lexeme[ (qi::alpha | '_') >> *(qi::alnum | '_') ] ]; 

Forse sto leggendo la sintassi qi sbagliato, ma mi sembra che questo non avrebbe accettato alcun letterale che corrisponde o inizia con una parola chiave. Rifiutare una corrispondenza di parola chiave completa è il comportamento desiderato. Ma, voglio accettare "cibo" come identificatore, anche se inizia con la parola chiave "pippo". Questo mi sembra un caso d'uso piuttosto comune, ma ho difficoltà a trovare la documentazione che la inchioda davvero.

Qualcuno può offrire una regola di identificazione che rifiuta solo corrispondenze esatte per parole chiave?

Grazie!

+0

In realtà questa domanda merita alcuni voti.Dovrebbe essere molto più spesso realizzato e probabilmente indirizzato negli Spirit Tutorials, poiché viene spesso trascurato (ovviamente ** [i campioni del compilatore] (http://www.boost.org/doc/libs/1_57_0/libs/spirit/example/qi/compiler_tutorial /) ** sono ok) – sehe

risposta

3

In realtà questa domanda merita alcuni voti. Dovrebbe essere molto più spesso realizzato, e probabilmente essere affrontati nello Spirito Tutorials, come è spesso trascurato (ovviamente the compiler samples sono ok)


Forse sto leggendo la sintassi qi sbagliato, ma mi sembra che questo non accetterebbe alcun letterale che corrisponde o inizia con una parola chiave.

Questo è corretto. Nel caso in cui tu abbia individuato una delle mie risposte (una buona possibilità), tendo a farlo come un modo veloce e sporco per sistemare grammatiche che non avevano guardie di parole chiave adeguate in quel momento.

Ma sì, richiedere parole chiave/identificatori distinti richiede un po 'più di lavoro. Potrei trovare un collegamento a una risposta dove è stato fatto correttamente (non è difficile, è solo noioso).

Nel frattempo, hanno uno sguardo al molto rilevante

Se si sta costruendo davvero un robusto linguaggio di grammatica general-purpose, questo è circa il punto in cui dovresti prendere in considerazione l'utilizzo di Spirit Lexer. Poi di nuovo, a mio modesto parere, lo Spirito mira al rapido sviluppo e alle piccole grammatiche uniche che sono sinteticamente incorporate usando il modello di espressione di Spirit eDSL. In molti aspetti, questo è l'antipode di quando questo è importante, penso.

+0

Grazie mille per la risposta. Questo lo risolve. Ero a conoscenza della direttiva distinta, ma pensavo che mi sarebbe mancato qualcosa con quella soluzione rapida. Grazie! – pt3dNyc