-
Linguaggi e Traduttori: Easy Web Form – compilatore/traduttore basato su una grammatica CONTEXT FREE
L’obiettivo del progetto “EasyWebForm” è quello di semplificare la gestione dei moduli di registrazione online. Il traduttore dato un file di ingresso scritto in uno specifico linguaggio di programmazione produce in output:
- un file di scripting server side in linguaggio PHP contenente le istruzioni per:
- generare un FORM in linguaggio HTML
- reperire e validare i dati inseriti nel modulo dall’utente nel momento in cui si effettua il submit del form
- salvare i dati raccolti in una tabella del server di database opensource MySQL
- un file sql contenente i comandi DDL per la creazione della tabella che sarà poi popolata dal form di registrazione.
DESCRIZIONE DEL LINGUAGGIO DI INPUT
Il file di ingresso è suddiviso in tre sezioni:
- sezione configurazione parametri di connessione verso il database (obbligatoria)
- sezione definizione variabili (facoltativa)
- sezione definizione dei tag del modulo di registrazione (obbligatoria)
Ciascuna sezione è separata da un “#”.
E’ possibile mettere dei commenti nel formato /* */ esclusivamente nella prima sezione.Il linguaggio è case insensitive, tranne per i riferimenti alle variabili che sono case sensitive.
Formato Sezione Configurazione
La prima sezione definisce i parametri di connessione al server di database opensource MySQL ed è obbligatoria.
Un parametro di connessione al server è scritto nel modo seguente:
- @nomeparametro=”valore”;
Formato Sezione Definizione Variabili
La seconda sezione è costituita da una lista di dichiarazioni di variabili ed è facoltativa.
Le variabili supportano i seguenti tipi base: Real, String, Integer.
Le variabili prima di essere utilizzate devono essere dichiarate.
Formato:
Tipo identificatore=inizializzazione;
Esempio: Integer num=10;
Per far riferimento alle variabili dichiarate è necessario anteporre al nome della variabile il simbolo del $.
Esempio: Integer num=10; Integer num2=$num;
I nomi delle variabili sono case sensitive.
Note su inizializzazione: un limite è che una variabile non può essere inizializzata con un’espressione. Può essere inizializzata con un’espressione aritmetica nella istruzioni di assegnamento.Formato Sezione Definizione Tag Modulo di registrazione
Nella terza sezione si possono utilizzare variabili definite nella seconda sezione. Per poter far riferimento ad una variabile utilizzata nella prima sezione, al nome della variabile è necessario anteporre il simbolo del dollaro “$”. La terza sezione è racchiusa tra i tag <form></form>. Vincoli sulla sezione:
- è presente almeno un tag di tipo input|textarea|select.
- è presente almeno (e può essere uno solo) un tag input di tipo submit
Nella terza sezione è possibile utilizzare i costrutti if/for e la funzione print epurché siano racchiuse tra i tag
Descrizione attributi tag FORM / CODE
L’unico attributo supportato dal tag FORM è method, il quale può assumere solo i valori GET/POST. Il tag CODE non ammette nessun attributo.
Gli attributi possono essere definiti in un ordine qualunque.Gli attributi obbligatori del tag input sono: type e name. Gli altri attributi sono facoltativi.
Il Tag Code
Il tag CODE si può inserire solo dopo il tag di apertura <FORM> e prima il tag di chiusura </FORM> All’interno del tag code si possono inserire:
- il costrutto per il controllo di flusso if-then-else
- il costrutto for
- funzione print
Non si possono inserire istruzioni di assegnamento. Queste sono supportate dagli stmt possibili di un costrutto if.
I tag Code non possono essere annidati ma possono essere ripetuti più volte.
Costrutto IF-THEN-ELSE
Sintassi:
if(cond){ stmt; }else{ stmt; }Limiti Costrutto IF-THEN-ELSE
- Non sono supportati gli if annidati
- i possibili stmt possibili sono:
- istruzione print
- istruzione di assegnamento
Non sono amessi costrutti for all’interno di un if.
Costrutto FOR
Sintassi:
for($i=0 to 10){ print("Hello World"); }Limiti costrutto For
- non sono supportati i costrutti for annidati
- l’unico statement ammesso è la funzione print
Funzione PRINT
Descrizione: stampa sulla pagina quello che è contenuto all’interno della stringa.
Il traduttore converte la funzione print nella corrispondente funzione echo del php.
Sintassi
print(stringa);
Stringa non può essere una variabileESEMPIO
DATO IL SEGUENTE FILE IN INGRESSO
@TABLE="Anagrafica";
@db="mydb";
@user="root";
@pass="prova";
@server="localhost";
#
Integer len=100;
#<form method="POST"> <input maxlength="100" name="nome" type="text" /> <input maxlength="$len" name="cognome" type="text" /> <CODE>
if($len==100){
$len=101;
}else{
$len=99;
}
</CODE>
<input maxlength="$len" name="comune" type="text" /> <input maxlength="5" name="cap" type="text" /> <input name="password" type="password" /> <input maxlength="100" name="email" type="text" /> <input name="submit" type="submit" /> </form>Il programma produce in output:
- IL FILE manage.php
- IL FILE table.sql
CONTENUTO MANAGE PHP
if(isset($_POST['submit'])){
/*** Codice per la connessione al server MYSQL ***/
$connessione=mysql_connect("localhost","root","prova") or die("Connessione non riuscita: " . mysql_error());
mysql_select_db("mydb") or die("Selezione del database non riuscita");$valid_form=0; $nome=$_POST["nome"];
$cognome=$_POST["cognome"];
$comune=$_POST["comune"];
$cap=$_POST["cap"];
$password=$_POST["password"];
$email=$_POST["email"];
echo "
";if($nome==""){
$valid_form=1;
echo "
<strong>[ERRORE]</strong> Il campo nome è obbligatorio.";
}
if(!ereg("^[A-Za-z]+$",$nome)){
$valid_form=1; echo "
<strong>[ERRORE]</strong>: Il campo <span style="text-decoration: underline;">nome</span> non rispetta l'espressione regolare <strong> ^[A-Za-z]+$</strong>. ";
}
if($cognome==""){
$valid_form=1;
echo "
<strong>[ERRORE]</strong> Il campo cognome è obbligatorio.";
}
if(!ereg("^[A-Za-z]+$",$cognome)){
$valid_form=1; echo "
<strong>[ERRORE]</strong>: Il campo <span style="text-decoration: underline;">cognome</span> non rispetta l'espressione regolare <strong> ^[A-Za-z]+$</strong>. ";
}
if(!ereg("^[0-9]{5}$",$cap)){
$valid_form=1; echo "
<strong>[ERRORE]</strong>: Il campo <span style="text-decoration: underline;">cap</span> non rispetta l'espressione regolare <strong> ^[0-9]{5}$</strong>. ";
}
if(!ereg("^[a-z0-9][_.a-z0-9-]+@([a-z0-9][0-9a-z-]+.)+([a-z]{2,4})",$email)){
$valid_form=1; echo "
<strong>[ERRORE]</strong>: Il campo <span style="text-decoration: underline;">email</span> non rispetta l'espressione regolare <strong> ^[a-z0-9][_.a-z0-9-]+@([a-z0-9][0-9a-z-]+.)+([a-z]{2,4})</strong>. ";
}echo "";
if($valid_form==0){
$query="INSERT INTO Anagrafica(nome,cognome,comune,cap,password,email) VALUES('$nome','$cognome','$comune','$cap','$password','$email')";
mysql_query($query) or die("Query fallita: " . mysql_error());
echo "
";
echo "
<h1>Inserimento avvenuto correttamente.</h1>
<p class="info">Per tornare al MODULO di registrazione cliccare <a href="".$_SERVER["PHP_SELF"]."">qui</a></p>
";}else{
echo "
<p class="info">Impossibile Procedere. Ricompilare il <a href="".$_SERVER["PHP_SELF"]."">MODULO</a> rispettando i vincoli sui campi sopraelencati.</p>
";
}
}else{
echo "
<h1>Codice generato da easyWebForm</h1>
";
echo "
<form action="". $_SERVER["PHP_SELF"] ."" method="POST">";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
<table>
<tbody>
<tr>
<td class="label">Inserire Nome</td>
<td class="content">";
echo "
<input name="nome" type="text" /></td>
</tr>
<tr>
<td class="label">Inserire Cognome</td>
<td class="content">";
echo "
<input name="cognome" type="text" /></td>
</tr>
<tr>
<td class="label">Comune di Residenza</td>
<td class="content">";
echo "
<input name="comune" type="text" /></td>
</tr>
<tr>
<td class="label">CAP</td>
<td class="content">";
echo "
<input name="cap" type="text" /></td>
</tr>
<tr>
<td class="label">Indirizzo Email</td>
<td class="content">";
echo "
<input name="password" type="password" /></td>
</tr>
<tr>
<td class="label">Indirizzo Email</td>
<td class="content">";
echo "
<input name="email" type="text" /></td>
</tr>
<tr>
<td class="label">Salva Dati</td>
<td class="content">";
echo "
<input name="submit" type="submit" /></td>
</tr>
</tbody>
</table>
</form>";
}
?>Il file manage.php eseguito su un server web Apache produce in output:

Nel momento in cui l’utente clicca su Salva, i dati nel form vengono validati e memorizzati nella tabella Anagrafica del database mydb.

Nel caso i dati non rispettino i criteri di validazione, il codice php segnala gli errori:

CONTENUTO TABLE.SQL
CREATE TABLE `Anagrafica`(
`ID_Anagrafica` INT NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(100) NOT NULL,
`cognome` VARCHAR(100) NOT NULL,
`comune` VARCHAR(101) ,
`cap` VARCHAR(5) ,
`password` VARCHAR(255) ,
`email` VARCHAR(100) ,
PRIMARY KEY(`ID_Anagrafica`)
);SCANNER
Il compito dello scanner è quello di svolgere un’analisi lessicale del file in ingresso. Si occupa di spezzare i vari elementi in token e di passarli al parser cup, il quale li analizzerà da un punto di vista sintattico e semantico. E’ stato implementato in JFLEX e segue la direttiva %ignorecase per dare all’utente la possibilità di scrivere i tag, gli attributi e i vari parametri sia in maiuscolo che in minuscolo. Notare che il parser è case-sensitive per quanto concerne le variabili quindi, ad esempio, $len è diverso da $LEN.
Lo scanner usa 7 stati esclusivi. Una nota riguardo agli stati è quella di dire che in realtà alcuni di loro potrebbero essere anche eliminati.- %xstate ID_PARAMETER : elabora gli elementi lessicali inerenti ai parametri della prima sezione.
- %xstate MANAGE_TAG : elabora gli elementi lessicali inerenti agli attributi di un tag.
- %xstate MANAGE_CODE : elabora gli elementi lessicali
- %xstate EMBEDDED_TAGS : elabora gli elementi lessicali del tag INPUT
- %xstate ATTRIBUTE_ENUMERABLE : elabora gli attributi ENUMERABILI
- %xstate ATTRIBUTE : elabora gli elementi lessicali inerenti al valore di un attributo
- %xstate COMMENT : elimina i commenti
- E’ stata definita la classe TagObject costituita da otto campi di tipo stringa(tagName,tagType,fieldName,type,size,required,regexp,label). Un oggetto di tipo TagObject serve per memorizzare il valore degli attributi definibili in un tag. Il programma crea un oggetto globale nominato tag che viene popolato man mano che gli attributi di un tag vengono letti ed elaborati. Nel momento in cui viene ridotta la regola che riconosce un tag di tipo input, la variabile globale tag viene inserita in una LinkedList chiamata listaCampi e successivamente viene azzerata per le elaborazione dei tag successivi.
- LinkedList listaCampi: è una lista contenente oggetti di tipo tagObject. Sarà principamente utilizzata dal metodo prepareOutputScripts per generare i file manage.php e table.sql.
- E’ stata definita la classe Dbparameters costituita da cinque campi di tipo stringa(username,password,dbname,server,tableName). Un oggetto di tipo Dbparameters serve per memorizzare i dati di interfacciamento verso il server di database opensource MySql. Il programma definisce un oggetto globale nominato dbcredential che contiene queste informazioni e sarà utilizzato per genere il codice php di connessione al server di db mysql.
- E’ stata definita la classe VariableObj composta da tre campi di tipo stringa(Name,Type,Value). Un oggetto di tipo VariableObj serve per memorizzare le informazioni inerenti alle variabili dichiarate.
- HashMap symbol_table contenente oggetti di tipo VariableObj: viene utilizzata per memorizzare il nome, il tipo e il valore delle variabili dichiarate. E’ una struttura dati che viene spesso interrogata per sapere se una variabile sia stata dichiarata o nel caso di assegnamento che i tipi di dati siano compatibili.
- public void addVariable(String name, String type, String value): aggiunge un oggetto di tipo VariableObj nella symbol table che ha come chiave il nome della variabile.
- public VariableObj evaluateExpression(VariableObj e1, VariableObj e2, String op): è soprattutto utilizzata dalla grammatica che riconosce le espressioni aritmetiche. Dati due oggetti di tipo VariableObj ed un operatore aritmetico(+,-,*,/) esegue l’operazione richiesta se e solo se i due oggetti hanno lo stesso attributo type che indica il tipo di dato(Real,Integer). Restituice un oggetto di tipo VariableObj con l’attributo value aggiornato.
- public String compareExpression(VariableObj e1, VariableObj e2, String op) : è sopratutto utilizzata dalla grammatica che risonoce il costrutto if-then-else per verificare se una condizione è vera. Dati due oggetti di tipo VariableObj ed un operatore relazionale esegue l’operazione richiesta se e solo se sono dello stesso tipo. Restituisce una stringa con valore true/false a seconda dell’esito del confronto richiesto.
- public void prepareOutputScripts(): scorre la LinkedList listaCampi per generare i file table.sql e manage.php.
- public void checkAndSetParameters(String paramType,String paramValue): controlla i parametri della prima sezione e aggiorna il contenuto della variabile globale dbcredential di tipo Dbparameters.
- public void setTagAttributes(String type,String val): aggiorna il contenuto della variabile globale tag di tipo TagObject.
- condizione costrutto for
- attributo tag non valido
- argomenti funzione print
- Type Checking sui tipi base Real, String, Integer: durante il processo di parsing si verifica che ad esempio non si possa assegnare ad una variabile di tipo Integer una stringa alfanumerica, oppure che non si possano sommare due espressioni di tipo diverso o confrontare dei dati che non siano dello stesso tipo.
- Controllo che le variabili utilizzate siano state prima dichiarate.
- Controllo che ci sia almeno un tag submit e input
- Controllo che un tag input abbia almeno gli attributi type text/password e name
- L’attributo del tag method sia GET/POST
- cartella samples: contiene degli esempi di file in input privi di errori sintattici o semantici.
- cartella errors: contiene degli esempi di file in input con errori sintattici o semantici.
- cartella output: è la cartella dove il traduttore crea il file manage.php e il file table.sql
- cartella samples: contiene degli esempi di file in input privi di errori sintattici o semantici.
- cartella errors: contiene degli esempi di file in input con errori sintattici o semantici.
- cartella output: è la cartella dove il traduttore crea il file manage.php e il file table.sql
PARSER
Implementato in CUP, il parser contiene le informazioni inerenti alla grammatica del linguaggio di ingresso. Nel suo workflow, il parser riceve i tokens dallo scanner e verifica che siano coerenti con la grammatica definita (Analisi Sintattica). Inoltre il parser associa alle varie regole della grammatiche delle azioni che permettono di analizzare il file di ingresso da un punto di vista semantico e, in caso di assenza di errori, di produrre in output i file manage.php e table.sql.
Strutture Dati Utilizzate nel parser
Funzioni/Metodi di supporto più rilevanti
Gestione Errori Sintattici
Gli errori sintattici all’interno del parser vengono gestiti attraverso il simbolo predefinito error che giustappunto indica una condizione di errore. Alcuni errori sintattici gestiti:
Gestione Errori Semantici
DOWNLOAD
Per compilare ed eseguire il programma, spostarsi nella directory base del progetto, ed eseguire dalla shell:
java java_cup.Main parser.cup
jflex scanner.jflex
javac *.java
java Main samples/example0.txtContenuto pacchetto zip:
- un file di scripting server side in linguaggio PHP contenente le istruzioni per:
Lascia un Commento
Link consigliati
Categorie
- Actionscript 3 – Trucchi e Segreti (9)
- Algoritmi e Programmazione Avanzata (3)
- Analisi di Basi di Dati (10)
- Assembler 8086 (2)
- Base di dati (1)
- Codifiche (1)
- Data Mining (4)
- E-learning (2)
- Flash (9)
- Grafica 3D (1)
- HTML5 (1)
- Intelligenza Artificiale (1)
- Lego Mindstorms NXT (6)
- Linguaggio C++ (1)
- Linux (8)
- Microsoft Office (7)
- news (1)
- Objective C (3)
- PHP (8)
- Progetti Politecnico (11)
- Programmazione ad Oggetti (Java) (1)
- Programmazione in C (16)
- Realtà Aumentata (1)
- Red5 (6)
- Seminari (3)
- SEO (3)
- Server (3)
- Sicurezza dei Sistemi Informatici (17)
- Siti Amici (1)
- Strategia e Innovazione (19)
- Tecnologie delle Basi di Dati (2)
- Utilità (11)
- web design (2)
Articoli Recenti
- Gli Active Record di Yii: un design pattern per rappresentare le tabelle del database in un modo orientato agli oggetti.
- Come creare un pulsante dinamicamente in Objective-c – Iphone SDK
- Actionscript 3 versus Objective-C: vediamo le principali differenze a livello di sintassi del codice
- Firewall: IP Tables un esempio su Linux
- Una piccola introduzione al framework php Yii (Yes It Is!) – installazione e creazione di una semplice applicazione web 2.0
- NetBeans IDE: JVM Creation Failed vediamo come risolverlo
- I sistemi esperti basati su regole
- I protocolli in Objective C sono molto simili alle interfacce di Java
- 19 – Strategia e Innovazione – Benefici della diversificazione: matrice BGC
- 18 – Strategia e Innovazione – Scelta del tempo di ingresso nel mercato – I FIRST MOVER
- 17 – Strategia e Innovazione – I mercati “WINNER TAKE ALL”
- 16 – Strategia e Innovazione – Standard e Disegno Dominante
- 15 – Strategia e Innovazione – Ciclo di vita dell’innovazione tecnologica e affermazione di un disegno dominante
- 14 – Strategia e Innovazione – Trend di diffusione di una nuova tecnologia
- 13 – Strategia e Innovazione – Sviluppo scientifico e paradigmi dominanti – Dinamiche dell’innovazione
Tags
Acrobat Writer Gratis
Actionscript 3
addEventListener
API disegno flash
appunti del corso di strategia e innovazione
AS3
Audio Streaming
Cancellare un'immagine da un PDF
cicli ed iterazioni in c
context free grammar
esercitazioni svolte in linguaggio c
esercitazioni svolte sui trigger oracle
esercizi svolti assembler 8086
eventi in actionscript 2
eventi in actionscript 3
file system linux
Formati Video HTML5
forward-chaining
gestione della memoria dinamica in c
gestione delle liste in c
getURL
Guida Visual Basic For Application - VBA
HTML5
indicizzare un sito sui motori
jflex
LEGO MINDSTORMS NXT 2.0 - BLUETOOTH - C#
linguaggi e traduttori
Modificare un file PDF
moveTo
navigateToURL
Oracle Database 10g Express Edition
Primo programma in c
programmare robot
root
scelte ed alternative in c
setChildIndex
streaming real time
swapDepths
TextField buttonMode
vettori in c
video in as2
video in as3
Video Streaming
XML
XMLList
