2013-07-08 17 views
7

Correlato a my earlier question relativo alla corrispondenza di parole chiave insensibili alle maiuscole utilizzando le espressioni regolari.Corrispondenza senza distinzione tra maiuscole e minuscole in Marpa

È possibile associare le stringhe senza distinzione tra maiuscole e minuscole in Marpa? Se sì, come?

Supponiamo che io ho la grammatica

:start ::= script 
identifier ~ [\w]+ 
script ::= 'script' identifier code 
code ::= command* 
command ::= 'run' | 'walk' | 'stop' 

Come posso farlo corrispondere qualsiasi script, Script, SCRIPT o qualsiasi altra combinazione di lettere maiuscole e maiuscole?

+0

Solo ASCII a 7 bit, la codifica ASCII estesa a 8 bit sul sistema operativo preferito o Unicode completo? – hippietrail

+0

Poiché il progetto in questione è stato scritto in Perl, suppongo: Qualunque cosa pensi Perl sia la corretta codifica per i dati. Tuttavia, poiché la grammatica è pensata per un linguaggio di programmazione, l'ASCII a 7 bit sarebbe sufficiente per gli identificatori. – onitake

+0

Perl ha forse il supporto più completo per diverse codifiche di qualsiasi linguaggio di programmazione. Non so però se Marpa usi direttamente la regex di Perl o reimpieghi un sottoinsieme limitato. Ma in generale in qualsiasi lingua ho sempre usato espressioni regolari come '[sS] [cC] [rR] [iI] [pP] [tT]' di fronte a questo. – hippietrail

risposta

3

Non esiste un modo semplice per specificare la distinzione tra maiuscole e minuscole. Naturalmente, puoi mettere insieme le classi di caratteri: [sS] [cC] [rR] [iI] [pP] [tT], ma questo è abbastanza imbarazzante.

Siamo spiacenti. Le stringhe senza distinzione tra maiuscole e minuscole sarebbero una buona caratteristica da aggiungere.

AGGIORNAMENTO: A partire da 2.076000, l'ultima versione indicizzata, Marpa :: R2 ora ha un modificatore: ic per entrambe le stringhe e classi di caratteri, rendendole insensibili al caso. Nei documenti, vedi https://metacpan.org/pod/Marpa::R2::Scanless::DSL#Single-quoted-strings e https://metacpan.org/pod/Marpa::R2::Scanless::DSL#Character-classes.

+0

Capisco. C'è un altro modo per influenzare il parser G0, come inserire codice che converte stringhe in minuscole prima di essere inviate al confronto? Un'altra soluzione a cui posso pensare è la preparatura dell'input e la conversione di tutto ciò che corrisponde a una parola chiave in lettere minuscole. Questo potrebbe probabilmente essere fatto usando ordinari 's ///'. – onitake

+1

È possibile ignorare il parser G0 e utilizzare il proprio scanner: https://metacpan.org/module/JKEGL/Marpa-R2-2.062000/pod/Scanless/R.pod#Internal-and-external-scanning. Dovrò aggiungere maiuscole e minuscole alle mie priorità per le nuove funzionalità. –

+0

Grazie, darò un'occhiata. Identificatore – onitake

Problemi correlati