Vuoi reagire a questo messaggio? Crea un account in pochi click o accedi per continuare.

[Python] Pseudo parser in via di sviluppo

2 partecipanti

Andare in basso

[Python] Pseudo parser in via di sviluppo Empty [Python] Pseudo parser in via di sviluppo

Messaggio  TTDH Dom Dic 06, 2009 1:01 am

Ecco il source del mio pseudo parser:
Codice:
import webbrowser
from string import replace

def bubblelol(array):
    for i in xrange(len(array)):
        for j in xrange(len(array)):
            try:
                if len(array[j]) < len(array[j + 1]):
                    temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp
            except:  pass
    return array

def trolla(string,simbol1, simbol2, cont1 = 0, cont2 = 0, a = []):
    if simbol2 != "":
        for i in xrange(len(string)):
            if ((string[i] == simbol1) and (cont2 == 0)):    cont1 = i; cont2 = 1
            elif ((cont2 == 1) and (string[i] == simbol2)):      a.append(string[ cont1 : i +1 ]); cont2 =0
            else: pass
    else:
        for i in xrange(len(string)):
            if ((string[i] == simbol1) and (cont2 == 0)):    cont1 = i; cont2 = 1
            elif ((cont2 == 1) and (string[i] == simbol1)):      a.append(string[ cont1 : i +1 ]); cont2 = 0
            else: pass
    return a

def parser(stringa, parola, colore, lol = "", cont = 0):
    for i in parola:
        if cont == 0:        lol = replace(stringa, i, "<font color=" + colore + ">" + i + "</font>"); cont = 1
        else: lol = replace(lol, i, "<font color=" + colore + ">" + i + "</font>")
    return lol


a = ["elif ","if ","while","for ","else","def ","pass","break","try","except","#!/usr/bin/env python","int(","ord(","print ","raw_input","from ","import ","input","in "]

def finalparser(stringa, parole, colore, colore2, cont = 0, se = ""):
    for i in trolla(stringa, "\"" , "\""):
        if cont == 0:        se = replace(stringa, i, "<font color=" + colore2 + ">" + i + "</font>"); cont = 1
        else:                      se = replace(se, i, "<font color=" + colore2 + ">" + i + "</font>")
    return  parser(replace(replace(se, "\n", "<br>"), "  ","  "), bubblelol(parole), colore)

e = open(raw_input("Inserire il percorso del file da prendere in input: "), "r")
w = e.read()
e.close()
aia = raw_input("Inserire il percorso del file di output: ")
aa = open(aia, "w")
lol = finalparser(w, a, "red", "orange")
aa.write(lol)
aa.close()
webbrowser.open(aia)

Questo semplice e piccolo programma non fa altro che prendere in input il il source di un vostro programma, lo parsa, ne evidenzia la sintassi e lo memorizza in un file con estensione ".html" e apre il file con il browser di default. (Per cambiare la sintassi, e quindi per parsare diversi linguaggi, basta modificare la variabile "a"). ricordo che questa è una versione ancora in vio di sviluppo, infatti devo riscrivere la funzione replace() e devo aggiungere alcune funzioni utili a migliorare l' intero programma.
TTDH
TTDH
Moderatore
Moderatore

Messaggi : 14
Data d'iscrizione : 11.11.09

Torna in alto Andare in basso

[Python] Pseudo parser in via di sviluppo Empty Re: [Python] Pseudo parser in via di sviluppo

Messaggio  C.N.69 Dom Dic 06, 2009 12:47 pm

Scusa per l'ignoranza, ma cosa significa "parsare"? Shocked
Inoltre non ho capito molto bene lo scopo del programma...
C.N.69
C.N.69
Founder
Founder

Messaggi : 52
Data d'iscrizione : 01.11.09

https://computerhouse.forumattivo.com

Torna in alto Andare in basso

[Python] Pseudo parser in via di sviluppo Empty Re: [Python] Pseudo parser in via di sviluppo

Messaggio  TTDH Dom Dic 06, 2009 7:55 pm

Ti rimando a wikipedia per la definizione di [Parsin].
Mentre per quanto riguarda il programma, ha lo scopo di analizzare e evidenziare la sintassi di un source.


Esempio:
Spoiler:
[Python] Pseudo parser in via di sviluppo 1zfttkw
TTDH
TTDH
Moderatore
Moderatore

Messaggi : 14
Data d'iscrizione : 11.11.09

Torna in alto Andare in basso

[Python] Pseudo parser in via di sviluppo Empty Re: [Python] Pseudo parser in via di sviluppo

Messaggio  C.N.69 Dom Dic 06, 2009 8:24 pm

Ho capito. Grazie TTDH e complimenti per le tue abilità coi linguaggi di programmazione Wink

p.s. Ti ho messo l'immagine di esempio sotto spoiler in quanto era bella grande. Spero che non ci sia nessun problema...
C.N.69
C.N.69
Founder
Founder

Messaggi : 52
Data d'iscrizione : 01.11.09

https://computerhouse.forumattivo.com

Torna in alto Andare in basso

[Python] Pseudo parser in via di sviluppo Empty Re: [Python] Pseudo parser in via di sviluppo

Messaggio  TTDH Dom Dic 06, 2009 8:29 pm

No no nessun problema.

Codice:
import webbrowser

def find(frase, parola, int, lol = ""):
    for i in range(len(frase) - len(parola) + 1):
        if frase[i: i + len(parola)] == parola:  lol += str(i) + "/" + str( i + len(parola)) + "/"
    if ((lol != "") and (int == 1) or (int == "1")):    return "true  posizione: %1s"  %  (lol)
    else:  return lol


def onesplit(frase, separatore, a = [], c = 0):
    for i in range(len(frase)):
        if str(frase[i]) == str(separatore):     
            a.append(frase[c : i])
            c = i + 1
    if frase[len(frase) - 1] != separatore:    a.append(frase[c : len(frase)])
    return a

def split(stringa, separatore):
    lulz, c, lol, contatore = [], 0, find(stringa,separatore,3), 0
    for i in onesplit(lol, "/"):
        if contatore % 2 == 0:       
            lulz.append(stringa[c : int(i)])
            contatore += 1
        else:      c, contatore = int(i), contatore + 1
    if stringa[- len(separatore) : len(stringa)] != separatore:      lulz.append(stringa[c : len(stringa)])
    return lulz


def replace(stringa, old, new, a = ""):
    for i in stringa.split(old):        a += i + new
    if stringa[- len(old) : len(stringa)] != old:      return  a[: - len(new)]
    else:          return a

def bubblelol(array):
    for i in xrange(len(array)):
        for j in xrange(len(array)):
            try:
                if len(array[j]) < len(array[j + 1]):
                    temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp
            except:  pass
    return array

def trolla(stringa, simbol1, simbol2, lol = "", d = 0, a = []):
    if simbol2 != "":
        for i in range(len(stringa)):
            try:
                if ((stringa[i : i + len(simbol1)] == simbol1) and (d == 0)):      c = i + len(simbol1);    d = 1
                elif ((stringa[i : i +len(simbol2)] == simbol2) and (d !=0)):    a.append(simbol1 + stringa[c : i] + simbol2); d =0
            except: pass
    else:
        for i in range(len(stringa)):
            try:
                if ((stringa[i : i + len(simbol1)] == simbol1) and (d == 0)):      c = i + len(simbol1);    d = 1
                elif ((stringa[i : i +len(simbol1)] == simbol1) and (d !=0)):    a.append(simbol1 + stringa[c : i] + simbol1); d =0
            except: pass
    return a

def parser(stringa, parola, colore, lol = "", cont = 0):
    for i in parola:
        if cont == 0:        lol = replace(stringa, i, "<font color=" + colore + ">" + i + "</font>"); cont = 1
        else: lol = replace(lol, i, "<font color=" + colore + ">" + i + "</font>")
    return lol


a = ["elif ","if ","while","for ","else","def ","pass","break","try","except","#!/usr/bin/env python","print ","raw_input","from ","import ","input","in ","return "]

b = [chr(34)+",""","','"]


def finalparser(stringa, sintassi, sintassip, colore, colore2, cont = 0, se = ""):
    for j in sintassip:
            for i in trolla(stringa, split(j,",")[0] ,split(j,",")[1]):
                if cont == 0:        se = replace(stringa, i, "<font color=" + colore2 + ">" + i + "</font>"); cont = 1
                else:                      se = replace(se, i, "<font color=" + colore2 + ">" + i + "</font>")
    return  parser(replace(replace(se, "\n", "<br>"), "  ","  "), bubblelol(sintassi), colore)

e = open("Inserire il percorso del file di input: ", "r")
w = e.read()
e.close()
see = raw_input("Inserire il percorso del file di output: ")
aa = open(see, "w")
lol = finalparser(w, a, b, raw_input("Inserire il colore 1: "), raw_input("Inserire il colore2: "))
aa.write(lol)
aa.close()
webbrowser.open(see)
Ho riscritto le funzioni split, find, replace,e trolla. Quindi ora mi rimane solamente da modificare il source per leggere la sintassi, da evidenziare e analizzare, da un file.
TTDH
TTDH
Moderatore
Moderatore

Messaggi : 14
Data d'iscrizione : 11.11.09

Torna in alto Andare in basso

[Python] Pseudo parser in via di sviluppo Empty Re: [Python] Pseudo parser in via di sviluppo

Messaggio  Contenuto sponsorizzato


Contenuto sponsorizzato


Torna in alto Andare in basso

Torna in alto


 
Permessi in questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum.