Quale classe di linguaggio formale sono XML e JSON con chiavi univoche?


12

Ho spostato questa domanda da StackOverflow dove ID non ha ottenuto risposte. Abbiamo avuto una domanda simile se JSON è regolare :

JSON e XML sono entrambi spesso chiamati come linguaggi senza contesto - entrambi sono specificati principalmente da una grammatica formale in EBNF. Tuttavia, questo vale solo per JSON come definito in RFC 4329, sezione 2.2, che non richiede l'univocità delle chiavi dell'oggetto (molti potrebbero non sapere ma {"a": 1, "a": 2} è JSON valido!). Ma se hai bisogno di chiavi univoche in JSON o nomi di attributi univoci in XML, questo non può essere espresso da una grammatica senza contesto. Ma qual è la classe di linguaggio di JSON con chiavi univoche e per XML ben formato (che implica nomi di attributi univoci?).

Uno dei migliori articoli che ho trovato su questo argomento (Murato et al, 2001: Tassonomia dei linguaggi di schemi XML usando la teoria del linguaggio formale ) esclude esplicitamente vincoli di integrità come chiavi / keyrif e unicità da controllare su un livello aggiuntivo. Inoltre, il sottoinsieme di XML definito da uno schema XML o da un DTD è privo di contesto. Ma non l'intero set di tutti i documenti XML ben formati.

Penso che un automa dello stack nidificato (= linguaggio indicizzato) dovrebbe essere in grado di analizzare JSON con un vincolo chiave univoco. Per XML puoi semplificare la domanda alla lingua S di tutti gli elenchi separati da virgole di numeri interi univoci. Qualcuno ne sa di più, preferibilmente con citazioni?

PS: un semplice algoritmo per decidere le lingue (oltre alla parte senza contesto) si basa su un buon algoritmo di ordinamento. Pertanto dovrebbe essere decidibile in "tempo linearitmico" con il caso peggiore O (n log n). Non ho ancora scoperto se la classe di complessità sia, ad esempio, "leggermente sensibile al contesto" o "indicizzata", ma probabilmente qualcosa tra il contesto libero e il contesto sensibile (?).

EDIT: forse avrei meglio riformulare la domanda per i più teorici informatici. Data la classe CFL di tutte le lingue che possono essere espresse da Backus-Naur-Form con ripetizione ( ). Ora, cosa guadagno in potenza computazionale se introduco un operatore di "ripetizione con istanze uniche" , quindi una sequenza in cui ciascun elemento si traduce in una diversa sequenza di terminali?x := a+ x := a | x a^a^a


JSON con chiavi oggetto ripetibili è privo di contesto (vedere la grammatica JSON), ma come si esprime il vincolo chiave univoco in una grammatica o un automa comuni? Oppure: a quale classe di complessità appartiene un parser XML, se è in grado di rilevare l'insieme di tutti i documenti XML ben formati (ben formato implica nomi di attributi univoci per elemento).
Jakob,

1
Utilizzando qui i termini del generatore di compilatore. La rispettiva sintassi di JSON e XML è certamente senza contesto. Proprietà come identificatori univoci o restrizioni del tipo di valore sono semantiche statiche (alcune persone chiamano anche questa sintassi, ma rifiuto questa nomenclatura per diversi motivi). Generatori di parser di solito ti permettono di arricchire un parser comune con cose come predicati sintattici / semantici che non devono essere privi di contesto. In teoria, vengono utilizzate le grammatiche attribuite . Non so se tali caratteristiche possano essere espresse naturalmente con grammatiche formali di qualsiasi potere.
Raffaello

1
Quali parti di un linguaggio formale vanno oltre la sintassi, dipende dal punto di vista. Strutture nidificate semplici come XML e JSON possono essere analizzate da un automa pushdown. Voglio solo sapere quale potenza calcolabile ottieni, se l'automa è arricchito da un dizionario per verificare se un valore memorizzato è stato letto in precedenza, per garantire il vincolo di unicità. Immagino che sia una grammatica indicizzata (un automa dello stack nidificato?) Ma ci sono diversi tipi di grammatiche indicizzate.
Jakob,

@Jakob, piegherei questa discussione (abbreviata) nella domanda, quindi è chiaro esattamente cosa stai chiedendo
Suresh Venkat

Un LBA dovrebbe essere sufficiente poiché non dovrai mai memorizzare più identificatori di quanti caratteri hai nel testo. Non ne so abbastanza sulle classi tra CFL e CSL per essere di aiuto lì.
Raffaello

Risposte:


6

L'uso di BNF con l'operatore di ripetizione univoca x := S^indica che an xè un'istanza adi simbolo S, seguita facoltativamente da un'istanza bdi set S - a, a sua volta seguita facoltativamente da un'istanza cdi set S - a - be così via. Se |S|è il numero di possibili Sed è finito, allora 2 ^ |S|! - 1è il numero di possibili S^.

Non è davvero significativo parlare in termini di potere computazionale del linguaggio descritto, poiché si tratta di semantica statica, nel crepuscolo tra sintassi e semantica (dinamica) ordinaria. Il potere espressivo della grammatica è esteso, poiché ha un mezzo formale per esprimere un particolare tipo di adattamento dell'input.

In particolare, fornisce un mezzo per accettare una permutazione di un sottoinsieme di un particolare insieme. Non penso che ci sia un nome esistente per questa classe di linguaggio. Non è certamente privo di contesto, ma il requisito di contesto è almeno abbastanza rigorosamente controllato. Se hai bisogno di un termine per questo, basta coniare uno. Suggerisco il rispetto del contesto per la classe di lingue che non possono essere descritte da una grammatica senza contesto senza ulteriori informazioni incorporate sui vincoli semantici statici, che per essere onesti sono vagamente sintattici nello spirito.

L'applicazione più utile di questa particolare estensione è probabilmente solo la possibilità di introdurre vincoli di chiave univoca, ma consente anche di descrivere insiemi così interessanti x := [0-7]^, che corrispondono a qualsiasi numero ottale di 8 o meno cifre non ripetute. Per quanto riguarda la complessità di esso, determinare se un elemento dell'insieme è stato visto non è peggiore del logaritmico e la frequenza di controllo è lineare nel numero di elementi corrispondenti, quindi l' ^operatore è effettivamente decidibile nel tempo linearitmico nel caso peggiore.


Grazie per la risposta e per il suggerimento di pensare nelle permutazioni di un sottoinsieme. Sebbene l'operatore di ripetizione unica non rilevi coppie chiave-valore con chiavi uniche, la complessità dovrebbe essere la stessa per questi casi. Tuttavia, se comincio ad applicare l'operatore su strutture arbitrarie, la classe in S^cui si Strovano alcuni CFL potrebbe essere non priva di contesto poiché i CFL non sono chiusi in differenza. Dovrebbe essere fattibile se Sè una lingua normale, ma sfortunatamente non puoi decidere se un determinato CFL è regolare. Forse solleverò un'altra domanda poiché questo va oltre i vincoli di JSON e XML.
Jakob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.