1. 4

Avete qualche riferimento utile, in particolare qualche articolo, progetto guidato o strumento utile per la realizzazione di parsificatori con regexp? Il mio caso d’uso specifico sono le [parsificazioni di linguaggi in Kakoune] che in alcuni casi trovo poco efficaci (e.g. Markdown).

P.S. Per chiarire il titolo: parlo di espressioni regolari riferendomi alle implementazioni più diffuse, non a quelle rudimentali che lavorano solo con linguaggi regolari.

  1.  

  2. 6

    Io ti aiuto pure ma non dire mai più parsificazioni.

    Quello che vuoi fare probabilmente non lo vuoi fare con una regexp. Ti consiglio di guardarti come costruire un parser vero e proprio, ci sono tutorial in quasi ogni linguggio, sopratutto legati all’introduzione allo sviluppo di compilatori, ma talvolta anche semplicementne come parser statici che è qualcosa che ti interessa di più.

    Io personalmente un lavoro del genere lo farei con i parser combinator di scala o haskell perché è un’astrazione che conosco, ma sicuramente in altri linguaggi trovi altre opzioni. Ma con le regexp ci muori mi sa.

    1. 1

      Concordo in toto. Fare un lavoro del genere con le espressioni regolari è probabilmente fattibile (o forse no, dipende da un po’ di fattori), ma il fatto che si possa fare non vuol dire sia una buona idea farlo. In questo caso, ci sono strumenti apposta che fanno il lavoro in modo più sano.

      1. 1

        Fare un lavoro del genere con le espressioni regolari è probabilmente fattibile

        No! Non è fattibile, leggi la mia risposta precedente. Non cercate per favore di razionalizzare pigrego. È impossibile, punto. Non c’è da cercare su StackOverflow, basta leggere un qualsiasi testo di informatica che tratti di queste cose.

        Per chi volesse approfondire l’argomento consiglio l’ottimo “Dragon Book”, di Aho, Sethi ed Ullman.

      2. 1

        Grazie del suggerimento, però ero già a conoscenza che non fosse l’approccio più comune e ragionevole. Ho aperto questa discussione proprio perché mi interessa il caso d’uso specifico delle espressioni regolari (con backreferences come suggerisce @fishinthecalculator), vuoi quando capita per limitazioni del software o vuoi per semplice curiosità.

      3. 2

        parlo di espressioni regolari riferendomi alle implementazioni più diffuse, non a quelle rudimentali che lavorano solo con linguaggi regolari

        Le espressioni regolari riconoscono solo i linguaggi regolari, cioè quelli di tipo 3, non esistono espressioni regolari rudimentali ed “evolute”, quello che hai scritto è una contraddizione in termini.

        Nello specifico nessun linguaggio regolare potrà mai riconoscere, ad esempio, il bilanciamento delle parentesi (es. tante aperte quante chiuse), per quello servono almeno delle grammatiche libere da contesto cioè di tipo 2.

        Sono le basi della teoria dei linguaggi formali.

        1. 3

          Per quanto la tua sia assolutamente la definizione da libro di testo, la maggior parte delle implementazioni di regex del nuovo millenio é in grado di riconoscere linguaggi piú espressivi di quelli regolari tramite la back-reference, vedi per esempio 0.

          Quindi forse OP (con molto sudore) può riuscire nel suo intento.

          1. 1

            Per me non sono più espressioni regolari ma, come scritto nell’articolo, espressioni regolari estese. Riconoscono un’altra classe di linguaggi, quindi non sono la stessa cosa.

            Un po’ come aggiungere le variabili ad un linguaggio funzionale e pretendere di continuare a chiamarlo linguaggio funzionale. Può essere etichettato come ibrido, ce ne sono tante di implementazioni di linguaggi misto imperativo-funzionali, ma non è un linguaggio funzionale puro, ha un altro nome.

            p.s.: io mi sono laureato in informatica nel vecchio millennio, perdonate la mia impostazione teorico-intransigente, sono cresciuto a pane e Dragon Book! :D Sono un informatico ortodosso ed alla soglia dei 50 anni me lo posso permettere :P

            1. 1

              Non c’entro (hai risposto al posto mio a @pietro), ma ti ringrazio per l’articolo perché non ho ancora visto come funziona formalmente.

          2. 2

            Non ho mai usato Kakoune ma se il tuo scopo é parsare codice per esempio per espandere degli snippets e se l’implementazione regex di Kakoune supporta l’operatore di back-reference con molta fatica potresti essere in grado di farlo.

            Ovviamente se puoi interfacciarti con un “vero” parser sarebbe la via piú comoda e meno error prone.

            1. 1

              È esattamente quello che avevo in mente, però non ho trovato risorse utili che suggerissero delle scorciatoie o tecniche comode per farlo (se non l’olio di gomito). Magari anche qualcosa che permetta di convertire da grammatiche libere a espressioni regolari con back-references.

              1. 2

                Ma perché invece non usi un banalissimo parser per grammatiche libere? Perché questo accanimento terapeutico sulle espressioni regolari? C’è un motivo “di business” alla base della tua ipotesi di soluzione (regex a tutti i costi)?

                Sono semplici domande le mie, magari hai un valido motivo per farlo.

                1. 1

                  A parte il caso d’uso citato (ma c’è già un plugin per LSP, e presumo prima si passerà a quel modello, o a tree-sitter) non ho dei motivi veramente validi, ho aperto la discussione per esplorare le possibilità, dato che ad una prima ricerca su internet la mia domanda non è stata soddisfatta.