ANALYSE SYNTAXIQUE L`objectif de ce TP est de programmer un
Transcription
ANALYSE SYNTAXIQUE L`objectif de ce TP est de programmer un
ANALYSE SYNTAXIQUE PROJET DE COMPILATION L’objectif de ce TP est de programmer un analyseur syntaxique LL(1) pour le langage L. La construction de l’analyseur suit les principes vus en cours. En particulier, tout symbole non terminal de la grammaire correspond à une fonction dans l’analyseur. Vous pouvez remplir le fichier syntaxe xml.c fourni. L’analyseur syntaxique fait appel à l’analyseur lexical pour accéder aux lexèmes du fichier à traiter. Chaque appel à la fonction yylex() renvoie le prochain lexème. La fonction yylex() renvoie des entiers correspondant à des types de lexèmes ou aux lexèmes eux-mêmes (comme expliqué dans le TP précédent). La correspondance entre les lexèmes ou types de lexèmes et les entiers est définie dans un fichier lexemes.h qui est partagé par l’analyseur lexical et l’analyseur syntaxique. Un exemple (possiblement incomplet) de grammaire, duquel vous pourrez vous inspirer est représenté ci-dessous. Attention, l’exemple n’est pas LL(1) : pourquoi ? Les conventions utilisées dans cet exemple : – La barre verticale | représente la disjonction. La règle X → α(β|γ)δ correspond aux deux règles X → αβδ et X → αγδ. – La grammaire utilise les méta-caractères [ et ] pour indiquer l’optionnalité. La règle X → α[β]γ indique que β est optionnel. En d’autre terme, la règle précédente correspond en fait aux deux règles suivantes : X → αβγ et X → αγ. – De la même manière, { et } indiquent l’optionnalité itérée, X → α{β}γ indique que β est optionnel mais peut être présent plusieurs fois. Programme Corps ListeDeclVar DeclVar Type → → → → → DeclProcFun DeclProcedure DeclFunction ListeDeclArg → → → → Instruction AffectInstr AppelProcedure AppelFunction ListeParam IfInstr WhileInstr BlocInstr Expression Relation Simpleexpression OpAdd Facteur RelationUnaire OpMult Predicat Variable PROGRAM ID ’;’ Corps ’.’ [ ListeDeclVar ] { DeclProcFun ’;’ } BlocInstr VAR DeclVar ’;’ { DeclVar ’;’ } ID { ’,’ ID } ’:’ Type INTEGER | BOOLEAN | ARRAY ’[’ NUMERAL ’..’ NUMERAL ’]’ OF Type DeclProcedure | DeclFunction PROCEDURE ID [ ’(’ ListeDeclArg ’)’ ] ; Corps FUNCTION ID ’(’ ListeDeclArg ’)’ ’:’ Type ’;’ Corps DeclVar { ’;’ DeclVar } → AffectInstr | AppelProcedure | IfInstr | WhileInstr | BlocInstr | Empty → Variable AFFECT Expression → ID [ ’(’ ListeParam ’)’ ] → ID ’(’ ListeParam ’)’ → Expression { ’,’ Expression } → IF Expression THEN Instruction [ ELSE Instruction ] → WHILE Expression DO Instruction → BEGIN Instruction { ’;’ Instruction } END → → → → → → → → Simpleexpression [ Relation Simpleexpression ] ’<’ | ’=’ | ’>’ | INFEG | DIFF | SUPEG Facteur [ OpAdd Simpleexpression ] ’+’ | ’-’ | OR [ RelationUnaire ] Predicat [ OpMult Facteur ] ’-’ | NOT ’*’ | DIV | MOD | AND AppelFunction | NUMERAL | Variable | ’(’ Expression ’)’ → ID [ ’[’ Expression ’]’ ]