Passa al contenuto principale

Appendix A. Implementation Hints (Suggerimenti per l'implementazione)

Le sezioni normative sull'espansione descrivono ogni operatore con un processo di espansione separato per chiarezza descrittiva. Nelle implementazioni effettive, ci aspettiamo che le espressioni vengano elaborate da sinistra a destra utilizzando un algoritmo comune che ha solo variazioni minori nel processo per operatore. Questa appendice non normativa descrive uno di questi algoritmi.

Inizializzare una stringa di risultato vuota e il suo stato non di errore.

Scansionare il modello e copiare i letterali nella stringa di risultato (come nella Sezione 3.1) fino a quando un'espressione è indicata da un "{", un errore è indicato dalla presenza di un carattere non letterale diverso da "{", o il modello termina. Quando termina, restituire la stringa di risultato e il suo stato di errore o non errore corrente.

  • Se viene trovata un'espressione, scansionare il modello fino al successivo "}" ed estrarre i caratteri tra le parentesi graffe.
  • Se il modello termina prima di un "}", quindi aggiungere il "{" e i caratteri estratti alla stringa di risultato e restituire con uno stato di errore che indica che l'espressione è malformata.

Esaminare il primo carattere dell'espressione estratta per un operatore.

  • Se l'espressione è terminata (cioè è ""), viene trovato un operatore sconosciuto o non implementato, o il carattere non è nell'insieme varchar (Sezione 2.3), quindi aggiungere "{", l'espressione estratta e "}" alla stringa di risultato, ricordare che il risultato è in uno stato di errore, e quindi tornare a scansionare il resto del modello.
  • Se viene trovato un operatore conosciuto e implementato, memorizzare l'operatore e saltare al carattere successivo per iniziare la varspec-list.
  • Altrimenti, memorizzare l'operatore come NUL (espansione di stringa semplice).

Utilizzare la seguente tabella di valori per determinare il comportamento di elaborazione per operatore di tipo di espressione. La voce per "first" è la stringa da aggiungere per prima al risultato se una qualsiasi delle variabili dell'espressione è definita. La voce per "sep" è il separatore da aggiungere al risultato prima di qualsiasi seconda (o successiva) espansione di variabile definita. La voce per "named" è un booleano per indicare se l'espansione include il nome della variabile o della chiave quando non viene fornito alcun modificatore di esplosione. La voce per "ifemp" è una stringa da aggiungere al nome se il suo valore corrispondente è vuoto. La voce per "allow" indica quali caratteri consentire non codificati all'interno dell'espansione del valore: (U) significa che qualsiasi carattere non nell'insieme non riservato sarà codificato; (U+R) significa che qualsiasi carattere non nell'unione di (unreserved / reserved / pct-encoding) sarà codificato; e, per entrambi i casi, ogni carattere non consentito viene prima codificato come la sua sequenza di ottetti in UTF-8 e quindi ogni ottetto viene codificato come un tripletto codificato in percentuale.

┌──────────────────────────────────────────────────────────────┐
│ NUL + . / ; ? & #│
├──────────────────────────────────────────────────────────────┤
│ first │ "" "" "." "/" ";" "?" "&" "#"│
│ sep │ "," "," "." "/" ";" "&" "&" "," │
│ named │ false false false false true true true false│
│ ifemp │ "" "" "" "" "" "=" "=" "" │
│ allow │ U U+R U U U U U U+R │
└──────────────────────────────────────────────────────────────┘

Con la tabella sopra in mente, elaborare la lista di variabili come segue:

Per ogni varspec, estrarre un nome di variabile e un modificatore opzionale dall'espressione scansionando la lista di variabili fino a quando viene trovato un carattere non nell'insieme varname o viene raggiunta la fine dell'espressione.

  • Se è la fine dell'espressione e il varname è vuoto, tornare a scansionare il resto del modello.
  • Se non è la fine dell'espressione e l'ultimo carattere trovato indica un modificatore ("" o ":"), ricordare quel modificatore. Se è un'esplosione (""), scansionare il carattere successivo. Se è un prefisso (":"), continuare a scansionare i successivi da uno a quattro caratteri per il max-length rappresentato come intero decimale e quindi, se non è ancora la fine dell'espressione, scansionare il carattere successivo.
  • Se non è la fine dell'espressione e l'ultimo carattere trovato non è una virgola (","), aggiungere "{", l'operatore memorizzato (se presente), il varname e modificatore scansionati, l'espressione rimanente e "}" alla stringa di risultato, ricordare che il risultato è in uno stato di errore, e quindi tornare a scansionare il resto del modello.

Cercare il valore per il nome di variabile scansionato, e quindi

  • Se il varname è sconosciuto o corrisponde a una variabile con un valore indefinito (Sezione 2.3), quindi passare al varspec successivo.
  • Se questa è la prima variabile definita per questa espressione, aggiungere la stringa first per questo tipo di espressione alla stringa di risultato e ricordare che è stato fatto. Altrimenti, aggiungere la stringa sep alla stringa di risultato.
  • Se il valore di questa variabile è una stringa, allora
    • se named è true, aggiungere il varname alla stringa di risultato utilizzando lo stesso processo di codifica dei letterali, e
      • se il valore è vuoto, aggiungere la stringa ifemp alla stringa di risultato e passare al varspec successivo;
      • altrimenti, aggiungere "=" alla stringa di risultato.
    • se è presente un modificatore di prefisso e la lunghezza del prefisso è inferiore alla lunghezza della stringa del valore in numero di caratteri Unicode, aggiungere quel numero di caratteri dall'inizio della stringa del valore alla stringa di risultato, dopo aver codificato in percentuale qualsiasi carattere che non è nell'insieme allow, prestando attenzione a non dividere caratteri multi-ottetto o tripletti codificati in percentuale che rappresentano un singolo punto di codice Unicode;
    • altrimenti, aggiungere il valore alla stringa di risultato dopo aver codificato in percentuale qualsiasi carattere che non è nell'insieme allow.
  • altrimenti se non viene fornito alcun modificatore di esplosione, allora
    • se named è true, aggiungere il varname alla stringa di risultato utilizzando lo stesso processo di codifica dei letterali, e
      • se il valore è vuoto, aggiungere la stringa ifemp alla stringa di risultato e passare al varspec successivo;
      • altrimenti, aggiungere "=" alla stringa di risultato; e
    • se il valore di questa variabile è una lista, aggiungere ogni membro della lista definito alla stringa di risultato, dopo aver codificato in percentuale qualsiasi carattere che non è nell'insieme allow, con una virgola (",") aggiunta al risultato tra ogni membro della lista definito;
    • se il valore di questa variabile è un array associativo o qualsiasi altra forma di struttura accoppiata (name, value), aggiungere ogni coppia con un valore definito alla stringa di risultato come "name,value", dopo aver codificato in percentuale qualsiasi carattere che non è nell'insieme allow, con una virgola (",") aggiunta al risultato tra ogni coppia definita.
  • altrimenti se viene fornito un modificatore di esplosione, allora
    • se named è true, allora per ogni membro della lista definito o coppia dell'array (name, value) con un valore definito, fare:
      • se questo non è il primo membro/valore definito, aggiungere la stringa sep alla stringa di risultato;
      • se questa è una lista, aggiungere il varname alla stringa di risultato utilizzando lo stesso processo di codifica dei letterali;
      • se questa è una coppia, aggiungere il name alla stringa di risultato utilizzando lo stesso processo di codifica dei letterali;
      • se il membro/valore è vuoto, aggiungere la stringa ifemp alla stringa di risultato; altrimenti, aggiungere "=" e il membro/valore alla stringa di risultato, dopo aver codificato in percentuale qualsiasi carattere membro/valore che non è nell'insieme allow.
    • altrimenti se named è false, allora
      • se questa è una lista, aggiungere ogni membro della lista definito alla stringa di risultato, dopo aver codificato in percentuale qualsiasi carattere che non è nell'insieme allow, con la stringa sep aggiunta al risultato tra ogni membro della lista definito.
      • se questo è un array di coppie (name, value), aggiungere ogni coppia con un valore definito alla stringa di risultato come "name=value", dopo aver codificato in percentuale qualsiasi carattere che non è nell'insieme allow, con la stringa sep aggiunta al risultato tra ogni coppia definita.

Quando la lista di variabili per questa espressione è esaurita, tornare a scansionare il resto del modello.