S → L |
L → let id = L in L L → E |
E → P E → E + P E → E - P |
P → F P → P * F P → P / F |
F → int F → ( L ) |
Instit
il faut exposer au monde extérieur le
constructeur Instit et la méthode parse, ils
pourront être qualifiés par public
si on souhaite exposer
ces fonctionalités au delà du package courant
(nous y reviendront à la question suivante).private
).
Cela s'applique indiscutablement aux champs tok et à la méthode
step, afin de contrôler strictement l'usage du tampon de un
lexème.Lexer
provient du monde extérieur).private
).package
expr
, en tête des fichiers
Token.java, Lexer.java et Instit.java que
les classes Token
, Lexer
et Instit
appartiennent bien au package expr.
Lexer
(et son constructeur) et
Instit
(et son constructeur, et la méthode
parser) de publiques, sinon, on ne pourra même pas en
parler !.
Main
suivante qui exploite
les méthodes publiques du package expr.
import java.io.* ; import expr.* ; // « importer » toutes les classes publiques du package expr class Main { public static void main(String [] argv) { Lexer lexer = new Lexer (new StringReader (argv[0])) ; Instit i = new Instit (lexer) ; i.parse() ; } } |
import
permet de
désigner les classes Lexer
et Instit
par leurs
noms abrégés (autrement, il faudrait les qualifier complètement
expr.Lexer
et expr.Instit
).
void parseF() { switch (tok.nature) { case Token.OPAR: step() ; parseL() ; if (tok.nature != Token.CPAR) error(")", tok) ; step() ; return ; case Token.ID: case Token.INT: step() ; return ; default: error("entier ou identificateur", tok) ; return ; // Not Reached } } … // parseP et parseE inchangées void parseL() { if (tok.nature == Token.LET) { step() ; if (tok.nature != Token.ID) error("identificateur", tok) ; step() ; if (tok.nature != Token.EQ) error("=", tok) ; step() ; parseL() ; if (tok.nature != Token.IN) error("in", tok) ; step() ; parseL() ; } else { parseE() ; } } void parse() { parseL() ; if (tok.nature != Token.EOF) error("EOF", tok) ; } |