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)

Field Summary
protected  SexpHashtable infixOpSet
          Tabella degli operatori infissi.
 boolean inRead
          Indica che stiamo facendo il parsing per il comando prolog read/1.
 boolean normalSpeech
          Per modificare la lettura delle variabili.
protected  SexpHashtable postfixOpSet
          Tabella degli operatori postfissi.
protected  SexpHashtable prefixOpSet
          Tabella degli operatori prefissi.
protected  SexpHashtable TermSet
          Tabella dei termini.
 
Constructor Summary
NewParser(OutputBuffer Out)
          Costruisce un nuovo NewParser.
 
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
 

Field Detail

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.

Constructor Detail

NewParser

public NewParser(OutputBuffer Out)
Costruisce un nuovo NewParser.
Parameters:
Out - lo stream dove verranno stampati i warning relativi alle variabili singole nelle clausole.
Method Detail

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