Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: [C] Creare un parser

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    366

    [C] Creare un parser

    Ciao ragazzi,
    premetto che è da anni che non tocco più un linguaggio di programmazione, e l'unico di cui conosco almeno le basi è il C.

    Quello che dovrei fare, è realizzare un tool che prenda in input un file (è un file di testo, con un linguaggio proprietario per la descrizione di circuiti booleani) e lo converta in un altro file (sempre un file di testo, con la descrizione dello stesso circuito però usando un linguaggio diverso, questa volta standard).

    Praticamente, convertire da un formato in un altro (i due file sono comunque in plain text).

    Per caso sapete darmi qualche dritta, o meglio consigliarmi del materiale da cui imparare a creare un simile parser?

    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    esiste flex per questo scopo

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Il lavoro è abbastanza semplice, anche se richiede tante ore di programmazione. Il C va benissimo e ti permette di scrivere un applicativo in grado di fare un conversione molto veloce. In pratica dovrai leggere il file di testo per importare i dati sensibili in memoria (ad esempio una stringa numerica diventerà un valore di una variabile), poi tratti questi dati, li elabori se necessario, e li riscrivi secondo il formato che vuoi in un altro file di testo. Forse dovresti chiedere consiglio al forum su cosa non riesci a fare di queste operazioni.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    366
    Quote Originariamente inviata da Paulin Visualizza il messaggio
    Il lavoro è abbastanza semplice, anche se richiede tante ore di programmazione. Il C va benissimo e ti permette di scrivere un applicativo in grado di fare un conversione molto veloce. In pratica dovrai leggere il file di testo per importare i dati sensibili in memoria (ad esempio una stringa numerica diventerà un valore di una variabile), poi tratti questi dati, li elabori se necessario, e li riscrivi secondo il formato che vuoi in un altro file di testo. Forse dovresti chiedere consiglio al forum su cosa non riesci a fare di queste operazioni.
    si, all'inizio volevo inquadrare il problema e capire come partire/organizzarmi. Inizialmente pensavo di leggere il file un carattere per volta, e in base alla lettera che leggo, con eventuali if annidati, gestire eventuali azioni di scrittura su un nuovo file.

    E' forse un sistema un po' grezzo.. questo Flex dovrebbe semplificare le cose. Adesso mi leggo meglio il manuale e cerco di capire come usarla.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    No ... ti sconsiglio di operare carattere per carattere ... almeno leggi una riga e opera sulla riga ...

    Se posti qualcosa circa il file da trasformare e il nuovo formato, se ne può parlare meglio per qualche consiglio.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    Quote Originariamente inviata da lordalbert Visualizza il messaggio
    si, all'inizio volevo inquadrare il problema e capire come partire/organizzarmi. Inizialmente pensavo di leggere il file un carattere per volta, e in base alla lettera che leggo, con eventuali if annidati, gestire eventuali azioni di scrittura su un nuovo file.

    E' forse un sistema un po' grezzo.. questo Flex dovrebbe semplificare le cose. Adesso mi leggo meglio il manuale e cerco di capire come usarla.

    l'ho usato per un pò di tempo, garantito che ti semplifica la vita: scrivi le regole e ti ritrovi un parser

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    In realtà dipende tutto da cosa devi gestire...
    In una stringa di caratteri dove ogni byte codifica un'istruzione ad esempio andresti meglio a leggere carattere per carattere (ovviamente con un po' di buffering dietro per ragioni di performance).
    Poi dal lato opposto un (un generico) lex potrebbe non bastarti, ad esempio potresti dover aggiungere qualcosa tipo yacc et simila.

    Percui non è il caso di generalizzare, dovresti almeno presentare la struttura generica di questo linguaggio proprietario...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    366
    Si, meglio contestualizzare e spiegare meglio

    Il file di origine è questo:

    codice:
    0 input       
    1 input       
    2 input        
    3 input       
    4 gate arity 2 table [ 0 1 1 0 ] inputs [ 2 3 ]
    5 gate arity 2 table [ 0 0 0 1 ] inputs [ 2 0 ]
    6 gate arity 2 table [ 0 1 1 0 ] inputs [ 4 1 ]
    7 gate arity 2 table [ 0 1 1 0 ] inputs [ 5 6 ]
    8 output gate arity 1 table [ 0 1 ] inputs [ 7 ]   
    9 gate arity 2 table [ 0 1 1 0 ] inputs [ 0 1 ]
    10 gate arity 2 table [ 0 0 0 1 ] inputs [ 0 2 ]
    11 gate arity 2 table [ 0 1 1 0 ] inputs [ 9 3 ]
    12 gate arity 2 table [ 0 1 1 0 ] inputs [ 10 11 ]
    13 output gate arity 1 table [ 0 1 ] inputs [ 12 ]
    E' un linguaggio che descrive un circuito booleano. il primo numero di ogni riga identifica il "filo" del circuito.
    Quindi abbiamo 4 input. Il filo 4 è l'output del gate di arietà 2 che prende in input i fili 2 e 3. Tale gate ha la tabella di verità [0110] (uno xor)
    L'8 e il 13 sono i fili in output, cioè gli output finali dell'intero circuito/funzione.

    Devo trasformarlo in un formato standard


    codice:
    .model nomecircuito
    .inputs x0 x1 x2 x3
    .outputs y0 y1
    .names x2 x3 x4
    01 1
    10 1
    .names x2 x0 x5
    11 1
    .names x4 x1 x6
    01 1
    10 1
    .names x5 x6 x7
    01 1
    10 1
    .names x7 y0
    1 1
    .names x0 x1 x9
    01 1
    10 1
    .names x0 x2 x10
    11 1
    .names x9 x3 x11
    01 1
    10 1
    .names x10 x11 x12
    01 1
    10 1
    .names x12 y1
    1 1
    .end
    .inputs e .outputs indicano gli ingressi e le uscite del circuito. Ogni .names indica un gate (porta logica). I primi valori dopo .names indicano gli input di tale gate, mentre l'ultimo indica l'output del gate.
    Le righe sotto il .names indicano i valori in input per cui l'output di tale gate dovrà essere 1.

    Ad esempio prendiamo il primo:
    codice:
     .names x2 x3 x4
    01 1
    10 1
    L'output di tale gate sarà 1 solo quando gli input saranno 01 oppure 10 (cioè una porta xor)

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    direi che e' perfetto per flex

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    366
    Sto provando a buttare giù una bozza in flex. Per ora però ho un piccolo problema: Nel file di output che devo ottenere, gli output vengono definiti all'inizio, mentre nel file che do in ingresso allo scanner, gli output sono o in mezzo al file o comunque in fondo.

    Quindi, una volta che io dal file di origine ho letto la stringa

    codice:
    8 output gate arity 1 table [ 0 1 ] inputs [ 7 ]


    è "tardi" per copiare la relativa stringa nel nuovo file che devo creare, perchè in tal file la definizione degli output avviene prima della definizione dei gate (con relativa tabella di verità).
    Dovrei "tornare in dietro", ma credo non si possa proprio.

    Probabilmente una via possibile è fare due (o più) passate. Però... come faccio a spostare una riga, dal fondo del file, mettendola alla riga n°3?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.