check this out, è commerciale, ma sembra un giocattolo divertente:
http://dpg.zenithlab.com/
Ma, in realtà: per Nexus non hai bisogno di un parser complicata.
Un po 'di codice di controllo della posizione e alcuni conteggio delle stringhe e delle parentesi, e l'hai scritto.
vorrei analizzare utilizzando un semplice parser token-at-a-time come questo:
- file di caricamento in un TStringList.
- per ogni riga, prendi un token alla volta per determinare il tipo di linea.
hanno un tipo enumerato per questo tipo di linea.
- la prima linea non vuota valida deve essere rilevata come tag #nexus valido.
- successivo all'area dell'intestazione (saltato per lo più sembra)
- begin è il primo e parola chiave sulla linea.
- le righe seguenti all'interno del blocco iniziale sembrano quasi un comando DOS e i relativi parametri della riga di comando e sono separate da spazi e terminano con il punto e virgola. praticamente come pascal, ma parentesi.
Per quanto sopra vorrei codice per me un piccolo set di aiutanti, e, infine, una delle cose che potrebbero aver bisogno di scrivere è un po 'funzione di splitting del token in questo modo:
funzione GetToken (var inputString: String; outputToken: String; const Separators: TStrings; Parole chiave: TStrings; ParenFlag: Boolean): Boolean;
GetToken restituisce true quando è stato in grado di trovare e restituire una stringa di token da inputString, salta gli spazi bianchi iniziali e termina quando trova un separatore. I separatori sono oggetti come spazio o virgola.
ParenFlag: True significherebbe che il token successivo che ottengo dovrebbe essere un intero elenco di articoli con parentesi. Una volta ottenuta l'intera lista parentesi (((a, b), (c, d), (e, f))), chiamerei un'altra funzione che decomprimerebbe il contenuto di quella lista in una struttura dati per le liste/array.
Non è consigliabile il motore parser grande e il comando grammaticale BNF consente di scrivere il codice se si scrive una grammatica BNF prima di scrivere il parser. Ma non c'è niente di così brutale qui da non poterlo analizzare.
Ci si aspetta che faccia query/trasformazioni su questo? Pensi di aver bisogno di convertirlo in json o xml per lavorare ulteriormente con esso?
fonte
2010-07-21 01:11:13
Sto controllando GOLD Parser ora. – Daisetsu
Solo una FYI supporta solo BNF e non EBNF, il che rende piuttosto doloroso lavorare con. – Daisetsu
Sì, sono d'accordo, il supporto EBNF lo renderebbe più semplice. :( –