Topic: Riformattare un assembler  (Letto 1001 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline pestatasti

  • python neanderthalensis
  • ****
  • Post: 405
  • Punti reputazione: 0
    • Mostra profilo
Riformattare un assembler
« il: Marzo 03, 2017, 14:35 »
Ciao gente.
È un po che ho messo da parte python :). Lo so sono incostante :D
Sto scrivendo un programma in assembler e alcune volte trovo pezzi di altri programmi. Ora il problema è che non si presentano come li vorrei vedere. Alla fine ho adottato di usare gli spazi al posto dei tabulatori :)
Vediamo il caso del topico.
Sto facendo con assembly per PIC, mi domando se esiste già qualcosa per scandire le linee.
In fondo una linea è divisa in 4 campi, il primo è l' etichetta, poi l' opcode, poi il valore ed infine il commento se esiste.

Vorrei riformattare che se inizia con un commento, salta. Se inizia dalla seconda colonna dopo un tab o uno spazio vieni controllato che sia un opcode e spostato alla colonna 12. Poi se esiste un operando viene spostato alla linea 19. Come ultimo se c'è un commento lo sposterei alla linea 31, verificando che non vada oltre alla 79ima colonna, altrimenti lo troncherei e messo nella linea dopo. Il commento inizia normalmente con punto-virgola.

La domanda, esiste già qualcosa che mi parsa le linee ?
In modo di poter fare il risultato in poche righe.
Cosa consigliate, un po di regex ?

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Riformattare un assembler
« Risposta #1 il: Marzo 04, 2017, 13:04 »
1. L'assembler e' il programma che converte un linguaggio di basso livello in codice nativo (o un altro bytecode... o insomma... la definizione e' fuzzy, ma resta il fatto che e' un *programma*). Scusa ma questa cosa mi riporta alla mente memorie di tanti anni fa e di quanto venivano perculati i niubbi quando appunto parlavano di "scrivere in assembler". Si andava avanti per giorni. Pero' adesso siamo adulti e mi limito a dire... non dire mai una cosa del genere nell'internet!

2. Ti rendi conto che mentre c'e' "un python", ci sono parecchi asm. Non solo ci sono tante architetture (con is completamente diversi), ma anche per la stessa architettura diversi assembler supportano diverse sintassi. Quindi la questione che ti devi porre e' "esiste un tool che mi parsa le linee *per il mio caso*"? E senza sapere quale sia il caso, non saprei dirti. Non posso manco cercarlo.  Se pero' sei sicuro che il tuo asm sia cosi' "facile" (da parsare), puoi fare tu. No, non usare le espressioni regolari. Scrivi un semplice parser. E' probabilmente uno dei parser piu' semplici che puoi avere.

Le istruzioni di quello che vuoi fare esattamente non sono molto chiare, ma non importa. Diciamo che e' piuttosto banale tirare su tutto in memoria in modo strutturato e ancora piu' banale riformattare tutto. Si, puoi anche usare le espressioni regolari. Ma tutte le volte che si usano le espressioni regolari per fare questo tipo di cose ci si fa male. Di solito le espressioni regolari sono usate massicciamente nel tokenizer, ma da li in poi si evita.

Offline pestatasti

  • python neanderthalensis
  • ****
  • Post: 405
  • Punti reputazione: 0
    • Mostra profilo
Re:Riformattare un assembler
« Risposta #2 il: Marzo 08, 2017, 10:41 »
Ciao Riko!!
Scusate il ritardo, ho anche altri pasticci che vorrei fare :D
Tutto sommato non sto cercando null' altro che riformattare il file come descrivevo sopra. Non è che poi lo vada a pubblicare sparato da qualche parte, in genere serve a soddisfare i miei gusti. Nel senso che cerco di uniformare i vari snippets che ho raccolto ed embeddarli nel nuovo sorgente.

L' asm capisce solo nei termini citati. Se la linea comincia con il punto-virgola è un commento, altrimenti è una etichetta. Dopo la prima colonna (siano spazi o tabulazioni) è considerato un opcode o una macro. Con lo stesso criterio si passa alla successiva parte che può essere nulla od un operando, infine un commento se c'è.
Pensavo che ci fosse già qualcosa che scandisce le linee, nei moduli di python.
Per esempio, molto alla larga, tokenizer, tabnanny, typing, non hanno qualche funzioncina da aiutarmi ?

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Riformattare un assembler
« Risposta #3 il: Marzo 09, 2017, 00:34 »
Sono drammaticamente confuso. Il problema che descrivi e' essenzialmente banale.
Lo fai con una decina di righe di codice raffazzonate anche. Cioe' puoi anche usare un tokenizer. Ma il linguaggio che mi hai descritto e' davvero banale.

iteri sulle linee del file:
    se inizia per ; "salta" (qualunque cosa voglia dire saltare in questo contesto)
    se il primo carattere e' " " o "t"
        spezza la righa per spazi, prendi il primo token,
        controlli che sia un opcode,
                e a quel punto fai print con qualche trucco di format (o di %)ma anche semplicemente  stampandogli davanti gli spazi opportuni.
                poi butti fuori 19 - len(opcode) - 12 spazi e suddetto operando


La gestione del commento e' vagamente piu' complicata. Intanto sembra assurdo metterlo "alla riga 31". Comunque si fa, eh... al limite invece che stampare direttamente schianti tutto in una lista e poi piazzi un .insert(31, comment) e tanti saluti.

Fare il rewrap a 72? Usi il modulo textwrap. Tutto nella libreria standard.

Dopo di che, io sono convinto che la specifica del linguaggio sia imprecisa. Ci sono alcune cose che non mi tornano, ma magari non le hai spiegate perche' non sono rilevanti.

Ma davvero: normalmente ti direi che se devi parsare un linguaggio devi fare le cose per bene. Tipo se conoscessi yacc o qualcosa del genere ti suggerirei di usalro (o pylex o uno di quei cosi li, quello che va piu' di moda ora). Pero' se non lo conosci, il problema e' sufficientemente semplice da gestirlo senza grossi patemi a mano e alla fine fai prima. Certo, la prossima volta che hai un problema con un linguaggetto un po' piu' complicato riparti da 0.

Offline pestatasti

  • python neanderthalensis
  • ****
  • Post: 405
  • Punti reputazione: 0
    • Mostra profilo
Re:Riformattare un assembler
« Risposta #4 il: Marzo 09, 2017, 07:30 »
Citazione da: riko
Il problema che descrivi e' essenzialmente banale.
In generale, credo, che questa è la sintassi di un assembler. Ma non ho nessuna intenzione di fare un programma di pubblico dominio :D
Serve a me per vedere il listato con più ordine. Siccome alcuni sorgenti usano tabulazioni ed alcuni usano spazi, non si riesce con un editore, anche decente, a vedere incolonnato a modo. Immagina che magari qualche snippet va bene al mio scopo (per iniziare) e poi ne trovo un altro (che fa al caso) ma impaginato diversamente, la risoluzione è abbastanza noiosa.

Citazione da: riko
Lo fai con una decina di righe di codice raffazzonate anche. Cioe' puoi anche usare un tokenizer. Ma il linguaggio che mi hai descritto e' davvero banale.

Se lo dici tu, allora ci credo. Non sto neanche tanto a cercare la funzioncina
Citazione da: riko
La gestione del commento e' vagamente piu' complicata. Intanto sembra assurdo metterlo "alla riga 31". Comunque si fa, eh... al limite invece che stampare direttamente schianti tutto in una lista e poi piazzi un .insert(31, comment) e tanti saluti.

Fare il rewrap a 72? Usi il modulo textwrap. Tutto nella libreria standard.
Alla linea 31 in generale va bene, quando i commenti sono parsimoniosi. Poi avrò da vedere quelle linee che sforano la 76 linea, se mandare tutto il commento a capo oppure spezzarlo in due linee o più. Non ricordo bene, a che punto si spezzano le emails, mi sembra che 72 sia tanto, sbaglio ?
Forse dovrei valutare se la frase del commento è leggermente lunga allora la sposterei in un nuova riga, altrimenti la dividerei.
Un altro caso sarebbe quello di convertire tabulazioni dietro ai commenti, che non è divertente aggiungere solo tot spazi. Ma quello gli lascio il tempo che trova, lo passo in secondo luogo.

Riguardo a pylex non ne sono a conoscenza quindi mi reinvento la ruota, e senza cuscinetti :D :D

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Riformattare un assembler
« Risposta #5 il: Marzo 09, 2017, 10:12 »
Giuro, non sono abbastanza intelligente per dare un senso ai tuoi messaggi.
Tipo a me sembra che ad un certo punto cominci a chiamare "linea" quello che prima chiamavi "colonna". Non ti seguo piu'.
Quello che dovevo suggerire lo ho fatto, buona fortuna.

Offline pestatasti

  • python neanderthalensis
  • ****
  • Post: 405
  • Punti reputazione: 0
    • Mostra profilo
Re:Riformattare un assembler
« Risposta #6 il: Marzo 11, 2017, 02:17 »
Hai ragione, mi sono espresso sballatamente.
Comunque da quello che dici, non c'è altro che farsi le funzioni sul momento.