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înement return 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-clef return 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-clef yield alors qu’un bloc procédural n’a pas cette obligation. Les deux peuvent éventuellement renvoyer une valuer en utilisant le mot-clef return.
  • 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)