Sartomiki.net

  • Aumenta dimensione caratteri
  • Dimensione caratteri predefinita
  • Diminuisci dimensione caratteri
Home Esercizi Jflex e CUP Esercizio 4 - JFlex+CUP - Programma logico

Esercizio 4 - JFlex+CUP - Programma logico

E-mail Stampa PDF
Valutazione attuale: / 0
ScarsoOttimo 

Testo:
Scrivere, utilizzando i programmi JFLEX e CUP, un parser che riconosca il linguaggio di seguito descritto e che sia in grado di indicare le strutture (regole, fatti o interrogazioni) errate.

Descrizione del Linguaggio:
Un programma logico è costituito da un insieme non vuoto di fatti, da un insieme, eventualmente vuoto, di regole, da una e una sola interrogazione e da un numero qualsiasi di commenti, tra loro inframezzati in qualsiasi ordine. Un fatto è costituito da un predicato seguito dal carattere ‘.’.
Una regola è costituita da un predicato seguito dal simbolo ‘:-’ seguito da una lista non vuota di predicati separati dal carattere ‘,’ e terminati dal carattere ‘.’. Un’interrogazione è costituita dal simbolo ‘?-’ seguito da una lista non vuota di predicati separati dal carattere ‘,’ e terminata dal carattere ‘.’.
Un commento è una stringa di caratteri racchiusa tra i simboli ‘/*’ e ‘*/’. Un predicato è costituito da un funtore seguito da una lista non vuota di argomenti separati dal carattere ‘,’ terminata dal carattere ‘)’; alternativamente un predicato è un semplice atomo. Un funtore è un atomo immediatamente seguito dal carattere ‘(‘. Un argomento è un predicato oppure una variabile. Un atomo è una stringa di lettere, numeri e ‘_’ il cui primo carattere sia una lettera minuscola, oppure un numero, intero o reale, con o senza esponente, con o senza segno. Una variabile è una stringa di lettere, numeri e ‘_’ il cui primo carattere sia una lettera maiuscola o il carattere ‘_’.
Il programma dovrà indicare riga e colonna in cui si è verificato un'errore.

Esempio:
Un possibile file di ingresso è il seguente:
/* Esempio di programma logico */
/* appartenenza ad una lista */
member(X,cons(X,_)).
member(X,cons(_,Y))
:- member(X,Y).
/* lista di partenza */
start_list(cons(a,cons(b,cons(c,nil)))).
/* interrogazione */
?- start_list(L), member(X,L), goal(X).
/* goal */
goal(c).

Scanner.jflex
import java_cup.runtime.*;

%%

%class Scanner
%cup
%unicode
%line
%column

permessi = [A-Za-z0-9\_]
numero = (\+|\-)?([0-9]+)(\.([0-9]+)((\E|\e)(\+|\-)?[0-9]+)?)?
linea = (\r|\n|\r\n)
scarta = [ \t]

%%

\(                            { System.out.println("APERTA_TONDA");  return new Symbol(sym.APERTA_TONDA, yyline, yycolumn); }
\)                            { System.out.println("CHIUSA_TONDA"); return new Symbol(sym.CHIUSA_TONDA, yyline, yycolumn); }
\,                            { System.out.println("VIRGOLA"); return new Symbol(sym.VIRGOLA, yyline, yycolumn); }
\.                            { System.out.println("PUNTO"); return new Symbol(sym.PUNTO, yyline, yycolumn); }

\:\-                            { System.out.println("DUEPUNTI_TRATTINO"); return new Symbol(sym.DUEPUNTI_TRATTINO, yyline, yycolumn); }
\?\-                            { System.out.println("DOMANDA_TRATTINO"); return new Symbol(sym.DOMANDA_TRATTINO, yyline, yycolumn); }

{numero}                        { System.out.println("NUMERO:" + yytext()); return new Symbol(sym.NUMERO, yyline, yycolumn); }
[a-z]{permessi}*                    { System.out.println("ID_MINUSCOLO:" + yytext()); return new Symbol(sym.ID_MINUSCOLO, yyline, yycolumn); }
[A-Z\_]{permessi}*                    { System.out.println("ID_MAIUSCOLO:" + yytext()); return new Symbol(sym.ID_MAIUSCOLO, yyline, yycolumn); }

"/*" ~"*/"                        { ; }
{scarta}+                        { ; }
{linea}                            { ; }

.                            { System.out.println("NON_AMMESSO:" + yytext()); return new Symbol(sym.NON_AMMESSO, yyline, yycolumn); }

Parser.cup
import java_cup.runtime.*;

action code {:
private boolean trovata_interrogazione = false;
:}

parser code {:
public void syntax_error(Symbol simbolo_attuale)
{
StringBuffer m = new StringBuffer("Errore");

if (simbolo_attuale.left != -1)
{
m.append(" in linea " + (simbolo_attuale.left+1));
m.append(", colonna " + (simbolo_attuale.right+1));
}

m.append(", simbolo: " + (simbolo_attuale));
m.append(" : Errore di Sintassi");
System.err.println(m);
}
:};

terminal NON_AMMESSO;
terminal APERTA_TONDA, CHIUSA_TONDA, VIRGOLA, PUNTO;
terminal DUEPUNTI_TRATTINO, DOMANDA_TRATTINO;
terminal NUMERO, ID_MINUSCOLO, ID_MAIUSCOLO;

non terminal programma, frasi, frase;
non terminal fatto, regola, interrogazione;
non terminal atomo, variabile, funtore, argomento, argomenti, predicato, predicati;

precedence left NUMERO, ID_MINUSCOLO;
precedence left PUNTO;

start with programma;

atomo ::= ID_MINUSCOLO | NUMERO;
variabile ::= ID_MAIUSCOLO;
funtore ::= atomo APERTA_TONDA;
argomento ::= predicato | variabile;
argomenti ::= argomento | argomenti VIRGOLA argomento;
predicato ::= atomo | funtore argomenti CHIUSA_TONDA;
predicati ::= predicato | predicati VIRGOLA predicato;

fatto ::= predicato;
regola ::= predicato DUEPUNTI_TRATTINO predicati;
interrogazione ::= DOMANDA_TRATTINO predicati {: if(trovata_interrogazione) parser.report_fatal_error("Interrogazione duplicata.", null); trovata_interrogazione = true; :};

frase ::= fatto PUNTO | regola PUNTO | interrogazione PUNTO | error PUNTO;
frasi ::= frase | frasi frase;
programma ::= frasi {: if(!trovata_interrogazione) parser.report_fatal_error("Interrogazione non presente.", null); :};


blog comments powered by Disqus
 

http://sartomiki.net/modules/mod_fuofb/assets/it/find-us-on-facebook-1.png

Follow me

Amici

Chi è online

 13 visitatori online

Siti amici

Banner

Notizie flash

Sono online un po' di appunti! A partire da calcolatori elettronici, proseguendo per introduzione alle reti telematiche e passando infine per sistemi operativi. Scrivetemi se trovate qualche errore... A breve saranno aggiunti nuovi appunti e completati quelli attuali!

PUBBLICITA'