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!