Analyseur syntaxique

Pour accélérer le travail sur le projet, vous pouvez adapter la proposition suivante d'un analyseur syntaxique (Parser.java) à votre projet.

La fonction d'analyse d'un analyseur syntaxic est basé sur la grammaire concrète décrivant le langage tel qu'il se présente à l'utilisateur. La fonction de synthè est basé sur la grammaire abstraite produisant les arbres qui seront utilisés dans les phases de compilation suivants.

A chaque production de la syntaxe concrète correspond une méthode réalisant l'analyse et la synthèse correspondante. A l'appel d'une telle méhode, l'analyseur se trouve toujours sur le premier lexème d'une phrase. Par exemple, lors l'application de la fonction assign(), qui reconnait et traîte les assignations, sur a := b * 11, la variable symbol contient le lexème ID.

Exercice: (aussi pour ceux qui ne font pas le projet)
Quelle est la chaîne d'appels de méodes sur a := b * 11 en partant de stm(), et quel est l'arbre abstrait finalement construit? Quel serait l'abre concret (qui n'est désormais pas construit)?

Exemple: Les commandes.

Liste de commandes avec ";" comme séparateur. La liste n'est pas supposée à être vide. En rencontrant en ";", il faut avancer sur le lexème suivant.

    // Stms  -->  Stm { ";" Stm }
    public Tree[] stms() {
	Tree[] trees = new Tree[1];
	trees[0] = stm();
	while (symbol == SEMICOLON) {
	    next();
	    trees = appendToTrees(trees, stm());
	}
	return trees;
    }
    

Soit une méthode séparée pour chacune des options, soit une réalisation directement dans la fonction (voir données).

    // Stm  -->  ( Assign  |  Loop  |  While  |  Cond  |  Block )
    // fonctionne parce que toutes les options commencent par des
    // mots cle differents; sinon plus de "look-ahead" serait
    // necessaire
    public Tree stm() {
	if (symbol == ID) return assign();
	else if (symbol == LOOP) return loop();
	else if (symbol == WHILE) return whil();
	else if (symbol == IF) return cond();
	else if (symbol == LBRACE) return block();
	else if (symbol == ACTION) return action();
	else throw new Error("statement expected in line " + pos);
    }
    

Exemple: Les assignations.

La variable symbol devrait déjà contenir le lexème ID.

    // Assign  -->  id ":=" Exp
    public Tree assign() {
	if (symbol == ID) {
	    String id = chars;
	    next();
	    if (symbol == ASSIGN) {
		next();
		Tree right = exp();
		return make.Assign(pos, id, right);
	    } else throw new Error("assignment expected in line " + pos);
	} else throw new Error("identifier expected in line " + pos);
    }
    


Christine Röckl
Last modified: Tue May 21 16:29:13 DST 2002