Compilation Project class 2014/2015
Introduction
Cette page est organisée comme une FAQ sur le cours ‘Projet Compilation’ enseigné à Polytech Paris-Sud, spécialité Informatique. Elle contient aussi des nombreuses explications et des liens utiles.
Si vous avez une question qui n’est pas couverte, n’hésitez pas à me contacter par mail.
Questions liées au projet
Équipe enseignante
Résponsable du cours – Frédéric Voisin Chargé du TP – Oleksandr Zinenko
Subtilités de l’énoncé
- Contrairement à l’exemple donné en cours, la déclaration d’une classe ne
contient pas de mot-clef
is
. La grammaire de la déclaration de classe est définie dans l’énoncé. - L’expression peut contenir un mot-clef
return
suivi par une autre expression. L’enchînementreturn return return 42
est donc autorisé par la grammaire. Vous pouvez l’interdire au niveau des vérifications contextuelles. - L’instruction
return;
est iterdite parce que le mot-clefreturn
doit obligatoirement être suivi par une expression et cette dernière ne peut pas être vide. - La différence entre un bloc-procédural et un bloc-fonctionnel est la suivate.
Le bloc fonctionnel doit obligatoirement renvoyer une valeur (
void
compris) en utilisant le mot-clefyield
alors qu’un bloc procédural n’a pas cette obligation. Les deux peuvent éventuellement renvoyer une valuer en utilisant le mot-clefreturn
. - Puisque le mot-clef
yield
est suivi par une expression, cette clause ne contient pas de point-virgule à la fin.
C language
Structures et unions
forward declarations
strings and memory management
Installation and environment
Required packages
Flex
Bison
Warning for OS X users
OS X developer tools come with an older version of Bison. Follow the installation process to get a new version.
Configure environment
The following lines may be added to the .profile
or .bashrc
file in your
home directory. After restarting terminal emulator or reentering shell, you
will be able to use programs installed locally.
GNU/Linux
export PATH=$HOME/usr:$PATH
export LIBRARY_PATH=$HOME/usr:$LIBRARY_PATH
export LD_LIBRARY_PATH=$HOME/usr:$LD_LIBRARY_PATH
OS X
export PATH=$HOME/usr:$PATH
export LIBRARY_PATH=$HOME/usr:$LIBRARY_PATH
export DYLD_LIBRARY_PATH=$HOME/usr:$DYLD_LIBRARY_PATH
a) Regular expressions
- greedy/non-greedy regular expressions
- difference between bison regexps and c++11 / java
- line-by-line match in regexp
- regexp for string literals
- regexp for comments
b) Flex / lexical analysis
- input: char *, output: stream of tokens
- passing data from flex to bison; yylval (dont forget strdup where appropriate)
- allowing to use certain symbols directly in bison as ‘;’ (Symbol rule + token number vs character codes; may not work for Unicode)
- ambiguity resolution
- why a .* rule breaks everything
- lexical errors
- debugging lexical analysis, extending text_lex.c
c) Bison / syntax analysis
- input: stream of tokes; output: abstract syntax tree
- ascending parser, tree construction in rules
- snippets for “optional”, “possibly empty list of something”, “joiner (argument list)”
- %union aka YYSTYPE, token and rule types
- file *_y.output, shift/reduce conflit management
- binary precedence %left, %right;
- %nonassoc
- unary precedence, %prec
- debugging syntax analysis (printf in every rule)
- recovery from errors, ‘error’ rule
- treating ‘this’ and ‘super’ as identifier or keywords
d) Syntax trees, variables scopes and lifetime / semantic analysis
- input: abstract syntax tree; output: abstract syntax tree with types
- list is a special case of a tree
- labeling every node
- deducing type of an expression
- maintaining a context of variables
- ‘this’ and ‘error’ in the context
- strong/weak, dynamic/static typing
e) Code generation
- virtual method tables
- virtual base class tables
- single static assignment form
- dynamic memory allocation
- memory allocation for static fields
- garbage collection overview
- dead code elimination overview
f) Interpretation
- extending context of variables with types and values
- result of interpretation: observable changes to global state (standard input and output)