Sto scrivendo un lexer (con re2c) ed un parser (con limone) per un formato di dati un po 'contorto: CSV-like, ma con specifici tipi di stringhe in luoghi specifici (caratteri alfanumerici, caratteri alfanumerici e segni meno, eventuali char tranne virgolette e virgola ma con parentesi graffe, ecc.), stringhe all'interno di parentesi graffe e stringhe che assomigliano a chiamate di funzione con parentesi di apertura e chiusura che possono contenere parametri.Linee guida di progettazione per parser e lexer?
Il mio primo colpo a era un lexer con molti stati, ciascuno Stato ristorazione al formato stringa specifica. Ma dopo molti messaggi di "inaspettato input" non desiderati dal lexer (che è diventato molto grande) ho capito che forse stava cercando di fare il lavoro del parser. Ho scartato la mia prima prova e sono andato con un lexer con un solo stato, molti token di caratteri e un parser che combina i token con i diversi tipi di stringa. Funziona meglio, ottengo più errori di sintassi utili dal parser quando qualcosa non funziona, ma non sembra ancora abbastanza corretto. Sto pensando di aggiungere uno o due stati al lexer, ma iniziando gli stati dal parser, che ha una "panoramica" molto migliore su quale tipo di stringa è richiesto in una determinata istanza. Complessivamente mi sento un po 'stupido :(
Non ho un background CS formale e timido un po' lontano dalla teoria della matematica.Ma forse c'è un tutorial o un libro da qualche parte che spiega cosa un lexer dovrebbe (e non dovrebbe) fare e quale parte del lavoro del parser dovrebbe fare. Come costruire buoni modelli simbolici, quando utilizzare lexer stati, quando e come utilizzare le regole ricorsive (con un parser LALR), come evitare le regole ambigua. un libro di cucina pragmatico che insegna le nozioni di base: "Lex and YACC primer/HOWTO" è stato bello, ma non abbastanza: dato che voglio solo analizzare un formato dati, i libri sulla compilazione del compilatore (come il libro del drago rosso) sembrano un po 'troppo grandi per me
O forse qualcuno mi può dare alcune regole semplici qui.
Grazie, questo è utile. Sono sempre tentato di creare espressioni regolari intelligenti per i miei terminali. Quindi, in futuro, userò più regole di produzione nel mio parser. – chiborg