Parserizzazione e compilazione in VB
Enrico Granata  atgrana@tin.it

[Prima parte]

Bentornati, stavolta scopriremo come scrivere IsIdentifier() e quindi anche la tabella dei simboli che è indispensabile

Tabella dei Simboli?

Osserviamo

1 Dim X$
2 Dim Y%

3 Dim Z@

4 X$="S2"

5 Y%=45

->6 Z@="Ciao a tutti"

Come sappiamo @ è il carattere di dichiarazione del Currency, noto per essere il più grande tipo numerico, per cui una stringa non è valida come Input per tale tipo di variabile, ma come fa VB a sapere ciò?

Nome

Tipo

Valore

X

String

""

Y

Integer

0

Z

Currency

0

Questo avviene da linea 1 fino a linea 3

Linea 4:

Nome

Tipo

Valore

X

String

"S2"

Y

Integer

0

Z

Currency

0

Linea 5:

Nome

Tipo

Valore

X

String

"S2"

Y

Integer

45

Z

Currency

0

Linea 6:

Nome

Tipo

Valore

X

String

"S2"

Y

Integer

45

Z

Currency

0

Come 0?

Si, 0 poichè VB fa quanto segue

Scansione(Tabella.Nome) finche Vale(Z) o finisce

Continua

Se Vale(Z) Allora
Se Tipo è Valido per NuovoValore Allora

Valore Vale(NuovoValore)
Altrimenti

FaiErrore "Valore Non Valido"

Termina Se

Termina Se

Ovvero, cerca Z in tutta la tabella dei simboli, ma ne cambia il valore solo se il valore desiderato è compatibile con il tipo, ovvero se il valore del tipo A è utilizzabile con il tipo B

Si, ma come?

La scelta più ovvia è usare DAO, ma DAO è lento

Chiaro allora che la tabella dei simboli sarà un vettore di oggetti di classe Simbolo

Esso conterrà fino a 200 elementi, cioè 200 variabili, per il nostro esempio più che sufficienti

Come scriveremo class Simbolo in VB?

Dim Nome$
Dim Tipo%

Dim Valore

Notate Dim Valore, esso è un Variant, adatto sia a stringhe che a numeri, che ad oggetti, insomma a tutto

Nel nostro Form scriveremo poi

Dim TabellaSimboli(199) As Simbolo

Ecco la funzione Create() di Simbolo da richiamare dopo

Set TabellaSimboli(n)=New Simbolo

Public Sub Create(MyNome$, MyTipo%)

Nome$=MyNome$

Tipo%=MyTipo%

End Sub

Il valore sarà settato dalla apposita funzione SetValue()

Public Sub SetValue(MyValue)

Select Case Tipo

Case TYP_STRING

If Not IsObject(MyValue) Then

Value=MyValue

Else

MsgBox "Impossibile compilare",16,"Tipo non corrispondente"

End If

Case TYP_NUM

If IsNumeric(MyValue) Then

Value=MyValue

Else

MsgBox "Impossibile compilare",16,"Tipo non corrispondente"

End If

End Select

End Sub

Adesso è facile scrivere la IsIdentifier(), ci basta un GetName() in Simbolo per ottenere la verifica dellÆesistenza dellÆIdentificatore passato

Public Function GetName$() : GetName$=Nome$ : End Function

Public Function IsIdentifier(Token$) As Boolean

Dim N%
For N%=0 To 199

If TabellaSimboli(N%) Is Nothing Then Goto 1

IsIdentifier=(Token$=TabellaSimboli(N%).GetName())

If IsIdentifier Then Exit Function

1 Next

End Function

E così la tanto difficile IsIdentifier() è in realtà di meno di 10 linee, e se omettessimo Option Explicit(cosa non consigliata) la ridurremmo di unÆaltra linea, poichè N% sarebbe dichiarata implicitamente

Esatto, anche più esatto, ma ora?

Ora passiamo alle espressioni, tale parte richiede che un sistema sia(quasi) intelligente, poichè dalla parte di S relativa ai token adesso deve interpreare tali token in un contesto N(C è Codice)

EÆ come imparare lÆItaliano

Prima:

Poi

senza soggetto, ma tra questo e capire

Sarei stato felice di venire, ma non ho potuto a causa della pioggia che ha reso le strade di napoli impraticabili fino a tarda notte visto che solo allora qualcuno ha pensato che fosse ora di intervenire per asciugare il fango che vi si era formato

cÆè di mezzo il Grande Oceano Pacifico, poichè la lunghissima frase che ho scritto richede una intelligenza ovvero richiede

Che il sistema I(S è sintassi) sia in grado di fornire una interpretazione N(I è Sistema) dellÆespressione E basata su più token validi T

Cioè che BailOut corrisponda ad End

Questa era la tabella delle espressioni

Sintassi per il token T

Tipo di Token di T e descrizione di esso

Token VBT per VB

Set x=y

Parola chiave con 2 parametri, un identificatore e un numero

Let x=y

Message x,y,z

Parola chiave con 3 parametri, 2 stringhe ed un numero

MsgBox x,z,y

BailOut

Parola chiave senza parametri

End

TempBailOut

Parola chiave senza parametri

Stop

Print x

Parola chiave con 1 parametro, una stringa

Print x

SymbolNew x,y

Parola chiave con 2 parametri, due identificatori

Dim x as y

TellMeWhat x,y

Parola chiave con 2 parametri, una stringa ed un identificatore

y=InputBox(x)

Adesso, come fare per sapere cosa ci serve?

Esistono due metodi, noi adotteremo il più ovvio, una variabile globale che contenga il tipo di Token che ci serve dopo per interpretare lÆespressione

Public ProssimoTokenTipo%

Se gradite, Global al posto di Public sortirà il medesimo effetto

Adesso, la funzione GetTokenType() farà anche lÆutile lavoro di settare la variabile globale che ci serve(Questo è compito vostro), adesso aggiungiamo però le seguenti variabili

Dim EspressioneE$

Dim ProssimoSimboloLibero%

La prima serve a contenere lÆespressione in fase di interpretazione, la seconda a contenere il numero di indice libero successivo, adesso ci servirebbe un qualcosa tipo....tipo....

InterpeterCurrentExpression()?

Proprio, essa leggerà lÆespressione corrente e la interpeterà secondo la nostra sintassi, prima di tutto cercherà la parola chiave, poi se ha dei parametri li troverà, li estrarrà e tradurra tutto in ciò che vuole

If Mid(EspressioneE$,1,7)="BailOut" Then

Print#2,"End"

End if

If Mid(EspressioneE$,1,5)="Print" Then

Print#2,"Print " & Mid(EspressioneE$,7)
End If

E questa è più o meno la nostra interprete logica e funzione di scrittura dati di output, dopo tanto leggere siamo finalmente arrivati alla conclusione del nostro viaggio attraverso la parserizzazione dei dati, un "last but not least tip" vi va?

E nel caso delle funzioni?

Una funzione è una variabile di tipo di dati Function e con valore il suo codice, da interpetare a parte prima della sua scrittura, questo affascinante compito spetta ovviamente a voi, e al vostro intuito la scelta di come ricordare a VB che cÆè anche quella funzione da interpretare

Dim IndexOfNextFunctionToInterpeter%

se i caratteri sono meno di 40 nel nome IndexOfNextFunctionToInterpeter potrete usarla per ottenere la locazione del prossimo simbolo funzione non interpretato nella tabella

Conclusioni, e poi lÆaddio

EÆ inevitabile, alla fine della nostra serie sul parsing viene il momento dellÆaddio finale, ma prima un piccolo ripasso

Token:insieme di caratteri che presentino un significato allÆinterno di S

S:lettera usata per le sintassi

Sintassi:insieme di regole per lÆinterpetazione logica e grammaticale di un insieme di token

Ad esempio la lingua italiana è basata su una sintassi per la quale:

io sono un bel bambino

io sono un bambino bello

sono equivalenti poichè

aggettivo nome=nome aggettivo

Espressione:insieme di token che abbiano un significato logico in S

E:lettera usata per le espressioni

Tipo di token:in una sintassi S vengono definite delle classi di token che permettono di esprimere espressioni generiche, quali

nome aggettivo che è usata per bambino bello

Parsing:attività di codifica di un input in base ad una sintassi S ben definita

Tabella dei simboli:può anche essere detta A(t=token) ed è la tabella che contiene le informazioni necessarie allÆuso di un identificatore I incluso in essa, le informazioni N incluse in A sono dipendenti dalla struttura di S

Al prossimo sorgente!