Interpreter.PrologInterpreter
Class NewParser
java.lang.Object
|
+--Interpreter.PrologInterpreter.NewParser
- public class NewParser
- extends java.lang.Object
Analizzatore sintattico (AS) per linguaggio Prolog.
Un AS è un riconoscitore delle frasi del linguaggio. Oltre a riconoscere
le frasi del linguaggio, il Parser costruisce una rappresentazione interna
delle frasi stesse.
L'utilizzo normale prevede di utilizzare il comando feed per indicare al lexer da dove prendere l'input.
Dopo una feed si utilizza il metodo read() per farsi restituire la forma interna della prima frase.
Si richiama la read() per la frase successiva.
Il lexer è gestito direttamente dal parser.
Si può anche interrompere il parsing di una frase per iniziarne una nuova, poi
successivamente ripristinare il parsing interrotto.
Questo si può ottenere grazie ai metodi feed e reload.
Grammatica Prolog:
Clause ->
Read(1200) .
Read(N) ->
Op(N,M,fx) Read(M-1) Rest(N,M)
Op(N,M,fx) Read(M-1)
Op(N,M,fy) Read(M) Rest(N,0)
Op(N,M,fy) Read(M)
Term Rest(N,0)
Term
Rest(N,M) ->
Op(N,M1,xfx) Read(M1-1) Rest(N,M1) {M1>M}
Op(N,M1,xfx) Read(M1-1) {M1>M}
Op(N,M1,xfy) Read(M1) Rest(N,M1) {M1>M}
Op(N,M1,xfy) Read(M1)
Op(N,M1,yfx) Read(M1-1) Rest(N,M1)
Op(N,M1,yfx) Read(M1-1)
Op(N,M1,xf) Rest(N,M1) {M1>M}
Op(N,M1,xf)
Op(N,M1,yf) Rest(N,M1)
Op(N,M1,yf)
Term ->
Num
Var
List
Ident
Ident ( Args
NoArgs
( Read(1200) )
Num ->
un numero
Var ->
una stringa che inizi con una lettera maiuscola o con un _
List ->
[ ]
[ RestList
RestList ->
Read(999) , RestList
Read(999) | Read(999) ]
Read(999) ]
Ident ->
tutte le stringhe che non sono variabili o numeri
Args ->
Read(999) , Args
Read(999) )
NoArgs ->
!
not
nl
Op(N,M,T) ->
operatore di tipo T e priorità M, con T Î {fx, fy, xfx, xfy, yfx, xf, yf} e con M
- See Also:
read()
,
feed(Reader)
,
feed(String)
,
reload(PrologLexer)
Method Summary |
PrologLexer |
feed(java.io.Reader I)
Crea un nuovo lexer per fare il parsing dell'input preso da I. |
PrologLexer |
feed(java.lang.String s)
Crea un nuovo lexer per fare il parsing dell'input preso da s. |
protected NumToken |
leggiNum()
Legge un num e stacca il '.' finale. |
static void |
main(java.lang.String[] s)
Metodo main utilizzato per il debugging. |
Sexp |
read()
Restituisce la forma interna della successiva frase da analizzare. |
void |
reload(PrologLexer lexer)
Permette di ripristinare un analizzatore lessicale.
|
void |
reset()
Riporta il parser alla situazione iniziale svuotando il buffer del lexer. |
void |
setPrimitive(OpSexp prim)
Permette di aggiungere un nuovo comando od un nuovo termine predefinito. |
Methods inherited from class java.lang.Object |
clone,
equals,
finalize,
getClass,
hashCode,
notify,
notifyAll,
toString,
wait,
wait,
wait |
prefixOpSet
protected SexpHashtable prefixOpSet
- Tabella degli operatori prefissi.
Viene inizializzata durante la creazione di SetOps che avviene nel costruttore di questo parser.
postfixOpSet
protected SexpHashtable postfixOpSet
- Tabella degli operatori postfissi.
Viene inizializzata durante la creazione di SetOps che avviene nel costruttore di questo parser.
infixOpSet
protected SexpHashtable infixOpSet
- Tabella degli operatori infissi.
Viene inizializzata durante la creazione di SetOps che avviene nel costruttore di questo parser.
TermSet
protected SexpHashtable TermSet
- Tabella dei termini.
Viene inizializzata durante la creazione di SetOps che avviene nel costruttore di questo parser.
normalSpeech
public boolean normalSpeech
- Per modificare la lettura delle variabili.
Se false le variabili sono le stringhe che iniziano con la lettera maiuscola.
Così prevede prolog.
Se true le variabili sono le stringhe che iniziano con la lettera minuscola.
Così prevede il senso comune, infatti solitamente i nomi propri iniziano con la
maiuscola (Antonio, Marco, Francesco,...),
mentre i nomi comuni con la minuscola (professore, studente, ...).
Di default è false.
inRead
public boolean inRead
- Indica che stiamo facendo il parsing per il comando prolog read/1.
Deve essere settata a true se si utilizza il parser per leggere una stringa
immessa in seguito ad un comando prolog read/1.
Viene riportata a false automaticamente dal parser alla fine della lettura della stringa.
Il parser restituisce così un termine e non un DottedTermSexp.
Viene saltato anche il controllo sulle variabili single.
NewParser
public NewParser(OutputBuffer Out)
- Costruisce un nuovo NewParser.
- Parameters:
Out
- lo stream dove verranno stampati i warning relativi alle variabili singole nelle clausole.
reset
public void reset()
- Riporta il parser alla situazione iniziale svuotando il buffer del lexer.
setPrimitive
public void setPrimitive(OpSexp prim)
- Permette di aggiungere un nuovo comando od un nuovo termine predefinito.
- Parameters:
prim
- deve contenere i dati per il nuovo termine.- See Also:
OpSexp
feed
public PrologLexer feed(java.io.Reader I)
- Crea un nuovo lexer per fare il parsing dell'input preso da I.
- Parameters:
I
- stream da cui il lexer legge l'input.- Returns:
- il vecchio analizzatore lessicale.
- See Also:
reload(PrologLexer)
feed
public PrologLexer feed(java.lang.String s)
- Crea un nuovo lexer per fare il parsing dell'input preso da s.
- Parameters:
s
- stringa da cui il lexer legge l'input.- Returns:
- il vecchio analizzatore lessicale.
- See Also:
reload(PrologLexer)
reload
public void reload(PrologLexer lexer)
- Permette di ripristinare un analizzatore lessicale.
In genere si utilizza dopo aver completato l'analisi di un input per
ripristinare un lexer restituito da uno dei metodi feed.
- See Also:
feed(Reader)
,
feed(String)
read
public Sexp read()
throws InterpreterException
- Restituisce la forma interna della successiva frase da analizzare.
- Returns:
- la forma interna della frase analizzata, oppure EofToken in caso di end-of-file.
- Throws:
- InterpreterException - se la frase non è ben formata.
leggiNum
protected NumToken leggiNum()
throws InterpreterException
- Legge un num e stacca il '.' finale. Fa avanzare next.
main
public static void main(java.lang.String[] s)
throws InterpreterException
- Metodo main utilizzato per il debugging.
Codice realizzato da Francesco Geri & Marco Tamanti