%class "ParserLambda"; // Portion de code inserer dans la classe ParserLambda %embed {: // Cette classe etend la classe Events de beaver destinee a gerer les messages d'erreurs static class Events extends beaver.Parser.Events { // Redefinition d'une des fonctions utilisees pour le rapport d'erreur // voir beaver-rt/src/main/java/beaver/Parser.java public void syntaxError(Symbol token) { System.err.format("Erreur de syntaxe en ligne %d, colonne %d. Token inattendu: %s\n", Symbol.getLine(token.getStart()), Symbol.getColumn(token.getStart()), Terminals.NAMES[token.getId()]); } } :}; // Cette partie est execute juste apres l'instanciation de l'objet ParserLambda %init {: // Instanciation de l'objet report pour les messages relatifs aux erreurs de syntaxe // remplacant celui par defaut report = new Events(); :}; %terminals LAMBDA, POINT, IDENT, LPAR, RPAR, NEWLINE; // Type de l'attribut de certains terminaux // ici, on ne s'interesse qu'au niveau d'un lambda terme, voir src/Lambda.java %typeof LambdaSimple, LambdaTerm = "Lambda"; %goal S; // Cette grammaire n'est pas complete mais reconnait certains lambda termes S = InputList | InputList NEWLINE ; InputList = InputItem | InputList NEWLINE InputItem ; InputItem = LambdaTerm.n {: System.out.format("Profondeur de %d\n", n.val); return new Symbol(0); :} ; LambdaTerm = LambdaSimple.n {: return n; :} | LambdaSimple.n1 LambdaSimple.n2 {: return new Lambda(Math.max(n1.val, n2.val)+1); :} | LAMBDA IDENT POINT LambdaTerm.n {: return new Lambda(n.val+1); :} ; LambdaSimple = IDENT {: return new Lambda(1); :} | LPAR LambdaTerm.n RPAR {: return n; :} ;