Esistono linguaggi di modelli di input?

3

Quando devo creare una rappresentazione testuale dei dati, posso usare un linguaggio template, in modo che il mio codice non debba preoccuparsi della struttura del file di output - a volte riesco a scrivere codice che è indipendente dal fatto che l'output è XML, LaTeX o qualsiasi altro testo normale. Un semplice esempio:

Modello (in un file separato):

<someXmlTag>
$variableName
</someXmlTag>

Codice:

Template(temstring).substitute(variableName="value")

Risultato (scritto nel file di output):

<someXmlTag>
value
</someXmlTag>

Voglio fare lo stesso, ma nella direzione opposta. Ho XML o testo normale o qualsiasi altro file da inserire. Voglio descrivere la struttura di input in un file separato che assomiglia all'input ma contiene queste dichiarazioni variabili e voglio gestirlo con un codice indipendente dalla struttura.

È già stato fatto? Quale approccio è stato utilizzato e come è andato a finire?

(Di solito gestiamo l'input XML utilizzando una libreria di parser XML per descrivere la struttura di input nel codice del programma, gestiamo l'input in plaintext scrivendo regex nel codice e non gestiamo l'input di LaTeX perché LaTeX non può essere realmente analizzato.)

    
posta marczellm 30.05.2014 - 09:09
fonte

5 risposte

2

Esistono vari strumenti come questo. La scelta dello strumento dipende dal tipo di input e dal tipo di estrazione o trasformazione richiesti.

Lo strumento più semplice è le espressioni regolari Perl che ora esistono nella maggior parte delle lingue moderne. Il limite principale di questi è che non gestiscono naturalmente la struttura ricorsiva nell'input. Anche linguaggi / formati con meccanismi di escaping / unescaping ragionevolmente complessi possono essere difficili da catturare correttamente con espressioni regolari.

Se sei specificamente interessato alla corrispondenza del modello di input XML, allora CDuce e XDuce sono probabilmente i più vicini a ciò che stai cercando. Scala ha anche una forma simile ma più debole di corrispondenza del modello XML integrata nella lingua . Questo tipo di cose era una zona abbastanza attiva qualche anno fa, molti degli strumenti sono elencati in questa pagina di Wikipedia .

L'input generale con struttura ricorsiva richiede qualche forma di generatore di parser come yacc, bison o Antlr.

    
risposta data 01.06.2014 - 01:35
fonte
1

I semplici modelli non funzionano nella direzione opposta. La direzione inversa è (efficace) l'analisi. Il problema con l'analisi basata su solo modelli è che un tipico modello o set di modelli può essere applicato a una stringa di input tipica in molti modi ... risultando in analisi ambigue.

Questo non vuol dire che il reverse templating sia impossibile. Ma penso che puoi renderlo pratico solo nel contesto di una grammatica e / o schema. Ad esempio, per gestire i modelli XML, il motore dei modelli inversi dovrebbe comprendere almeno la sintassi XML principale e anche uno schema XML o DTD.

È stato fatto? Bene, ho usato un sistema chiamato Refine negli anni '90 che ha fatto qualcosa di simile a questo. (È stato progettato come framework per l'ingegneria del linguaggio del programma / reverse engineering, e ti ha permesso di fare cose funky come la definizione di una grammatica personalizzata e definire pattern di parse-tree nel contesto di quella grammatica.) Ricordo che è piuttosto potente .. ma il sistema era molto costoso e non è mai decollato.

    
risposta data 02.06.2014 - 12:28
fonte
0

Il più vicino che penso che tu possa trovare è il software di web scraping. Molti di questi usano xpath o simili piuttosto che un modello, ma non ho familiarità con l'intero campo.

Tuttavia, non sarebbe terribilmente difficile scrivere il tuo, soprattutto se limiti i tuoi modelli a una semplice sostituzione, nessun loop o se le istruzioni e crei tutte le stringhe di variabili. Stai cercando una lunga stringa di testo fisso, seguita da una stringa di lunghezza sconosciuta da inserire nella variabile, seguita da un'altra stringa fissa. Stimerei meno di un giorno a fare una prova di concetto di nudo.

    
risposta data 30.05.2014 - 16:00
fonte
0

Nella famiglia di linguaggi C, la famiglia di funzioni scanf () accetta una stringa di formato che sembra quasi la stessa della stringa di formato utilizzata per la famiglia di funzioni printf ().

int num = 5;
printf("%d", num);
scanf("%d", &num);

Per XML, XForm fa bind a doppio senso, anche se dovresti dichiarare i bind separatamente invece che all'interno del modello stesso, XForm può anche fare cose complesse come associazione in dati ripetuti / in loop . Ciò che rende questo possibile è dovuto all'uso di XPath per la descrizione dei dati associati.

Potresti anche sostenere che le espressioni regolari con più gruppi di cattura e findall () sono anche una sorta di linguaggi di modelli di input.

how did it work out?

In generale, l'analisi in XML, JSON o in altri linguaggi formattati non può essere eseguita con un linguaggio di modello di input basato su stringhe generico (ad esempio scanf, regex). XML e JSON hanno la loro idea su quali token sono significativi e quali token possono essere raccolti / ignorati (es. Spazio bianco), quindi un linguaggio di formattazione di input generale basato su stringhe sarà generalmente troppo macchinoso / troppo limitato per essere in grado di analizzare XML / JSON completamente . Se è necessario analizzare in XML, è necessario un linguaggio modello di input che comprenda la sintassi XML e così via.

    
risposta data 01.06.2014 - 05:57
fonte
0

Sì, è già stato fatto prima. Ad esempio, è possibile utilizzare gli stessi modelli di URL instradando un'applicazione Web e costruendo collegamenti:

/users/{id} + {id:123} -> /users/123 -- constructing a link
/users/123 + /users/{id} -> {id:123} -- routing requests

Si tenga presente che le rappresentazioni di input e output degli stessi dati sono solitamente asimmetriche. Ad esempio tramite REST rispondi con hypermedia e di solito richiedi con un semplice JSON, che è un'enorme differenza ...

Le rappresentazioni di input sono in genere molto più semplici e possono contenere dati di convalida, mentre le rappresentazioni di output sono più complesse e non contengono dati di convalida a meno che non descrivano campi di input. Quindi il tuo approccio ha i suoi limiti.

    
risposta data 01.06.2014 - 09:50
fonte

Leggi altre domande sui tag