Ho bisogno di sviluppare un parser. Posso usare Lex e Yacc per lo scopo?

1

Ho bisogno di estrarre dati molto particolari da file di log (di tipi e formati diversi). Dal momento che sono un passante del college recente; la mia mente correva a usare Lex e Yacc per lo scopo. Ora ho seguenti domande

1. Sarà legale farlo? (Questo prodotto a cui sto lavorando appartiene a una delle più grandi aziende tecnologiche del mondo.)

2. Inoltre; Mi piacerebbe sapere se ho troppa paura di scrivere il mio parser?

3. Come posso utilizzare Lex e Yacc se il mio prodotto è basato su Windows?

Per favore, dimmi se hai bisogno di chiarimenti o informazioni extra.

    
posta Chani 19.05.2011 - 16:03
fonte

5 risposte

10

Prima di rispondere alle tue domande, permettimi innanzitutto di dire che esistono due classi principali di linguaggi informatici:

  • Lingue normali : la maggior parte dei file di registro segue questo formato. Ogni riga è un'espressione completa e può essere analizzata separatamente. In sostanza, tutte le tue esigenze possono essere soddisfatte solo da un lexer o da espressioni regolari.
  • Lingue sintattiche : esiste una grammatica specifica e regole che circondano ciò che rende la sintassi corretta (o la struttura della frase). La maggior parte dei linguaggi di programmazione e persino alcuni linguaggi di marcatura seguono questo formato. Essenzialmente hai bisogno sia di un lexer che di un parser.

Se è necessario analizzare i file di registro, è probabile che si riesca a leggerli riga per riga e utilizzare un'espressione regolare per ottenere i campi. Se la linea di log è molto semplice, puoi facilmente far girare il parser ed evitare la sintassi delle espressioni regolari. Ho fatto entrambi gli approcci ed è un lavoro abbastanza veloce.

Se hai bisogno di qualcosa di un po 'più robusto, puoi usare ANTLR, Flex, Yacc, ecc. a seconda delle esigenze della tua piattaforma. Comprendi che ANTLR, pur essendo uno strumento Java, può generare codice C / C ++ e C # così come codice Java.

Ora per le tue domande una per una:

  1. È legale? Assolutamente. La maggior parte dei generatori di parser inserisce esplicitamente nelle proprie licenze che la licenza non si applica al codice generato. Se il codice sorgente è proprietario, lo è anche il codice generato che proviene da esso.
  2. Ho solo paura di scrivere il mio parser? Solo tu puoi rispondere. Tuttavia, il buon senso dice che se c'è uno strumento che ti aiuti a risparmiare tempo ed evitare errori, dovresti probabilmente usarlo. Tanto più se non costa soldi extra. Assicurati che lo strumento scelto corrisponda al lavoro. Se tutto ciò che devi analizzare è una lingua normale, non optare per i generatori di parser completi.
  3. Yacc e Lex su Windows? Puoi usare un'alternativa come ANTLR , oppure puoi usare Cygwin strumenti basati, o Bumble-Bee port. Hai opzioni.
risposta data 19.05.2011 - 19:02
fonte
8

Oggi sono disponibili strumenti molto più semplici da imparare e più potenti.

  1. ANTLR questo è uno degli strumenti più facili da usare e meglio supportati sul mercato. Grandi libri su come usarlo anche dall'autore.
  2. PyParsing è utile per le attività più leggere e le attività di prototipazione che puoi quindi implementare in ANTLR .
risposta data 19.05.2011 - 17:01
fonte
3
  1. Sì, lo è. L'uso del software GPL non ti impone alcun obbligo, tranne che se estendi il codice GPL e distribuisci il programma risultante, devi anche distribuire il codice sorgente esteso. Quindi per uso interno la GPL è irrilevante. Inoltre, se non estendi flex o yacc, ma solo usali , non hai alcun obbligo (ma sii consapevole che la domanda "Che cosa costituisce un'opera derivata ? "è controverso.)
  2. Probabilmente. Non è così difficile, anche se l'analisi dei file di log è di solito abbastanza semplice da rendere le espressioni regolari ancora più semplici e veloci.
  3. Perché non dovresti? Ottieni le versioni Cygwin o una porta Windows dedicata (come ad esempio Bumble-Bee) e sei bravo. Le poche chiamate di cui hai bisogno possono essere facilmente integrate nella tua build se usi Make / Ant o Eclipse / Visual Studio / qualunque IDE.
risposta data 19.05.2011 - 16:21
fonte
1

Penso che se si utilizza un generatore di parser, sarebbe un modo ragionevole e pratico per costruire un parser. Questo ha i suoi vantaggi in quanto è più semplice lavorare con una grammatica BNF piuttosto che con un sacco di codice.

Detto questo, è anche a volte molto educativo scrivere il proprio parser. Si può iniziare ad apprezzare lex e yacc e la scienza dietro di esso una volta che si affronta l'analisi delle sfide direttamente.

Scrivere il parser può anche avere altri vantaggi. In primo luogo, può essere migliorato con la base di codice esistente (se lo si progetta in quel modo). Secondo, potresti vedere prestazioni migliori con il tuo tokenizzatore codificato a mano se è scritto in modo pragmatico (piuttosto che, ad esempio, regexando ogni token).

    
risposta data 19.05.2011 - 18:44
fonte
1

Impara il Perl. Perl è la versione super deluxe del Swiss Armyknife di conflitti di file di testo, e avendo alcune espressioni regolari con parentesi che segnano ciò di cui hai bisogno, è molto spesso possibile eseguire anche l'estrazione di file di registro in poche righe di Perl.

    
risposta data 19.05.2011 - 19:08
fonte

Leggi altre domande sui tag