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 ’]’ ]