Guide pas à pas : créer un compilateur TPC avec flex, bison et NASM

Telechargé par hocise1891
Guide pas à pas : de zéro au compilateur tpcc


Avant de commencer


Le point bloquant : la grammaire du TPC





Installer les outils
 nasm -f elf64 

 --platform linux/amd64 

sudo apt update
sudo apt install build-essential flex bison nasm gdb make git

uname -m # doit afficher x86_64
gcc --version
flex --version
bison --version
nasm -v
Critère de réussite
Vue d'ensemble : ce que fait un compilateur


Guide pas à pas (de zéro)
Page 1 of 26
Analyse lexicale (flex) int x = 3;
 INT  IDENT(x)  = NUM(3)  ;
Analyse syntaxique (bison)

Arbre abstrait (AST)
Analyse sémantique
 return 
Génération de code
 .asm
Assemblage et édition de liens nasm  .o  ld 


source : x = 1 + 2 * 3;
tokens : IDENT(x) = NUM(1) + NUM(2) * NUM(3) ;
arbre : =
/ \
x +
/ \
1 *
/ \
2 3



Étape 1 : un analyseur lexical avec flex (1 jour)
La notion. .l 
 lex.yy.c  yylex() 

la plus longuepremière règle
La pratique. lexer.l 
Guide pas à pas (de zéro)
Page 2 of 26
%{
#include <stdio.h>
%}
%option noyywrap
%option yylineno
%%
[0-9]+ { printf("NOMBRE(%s)\n", yytext); }
[a-zA-Z_][a-zA-Z0-9_]* { printf("IDENT(%s)\n", yytext); }
[-+*/=;] { printf("SYMBOLE(%s)\n", yytext); }
[ \t\n]+ { /* on ignore les blancs */ }
. { fprintf(stderr, "Erreur lexicale ligne %d :
'%s'\n", yylineno, yytext); }
%%
int main(void) {
yylex();
return 0;
}
 %%  %{
 %}  yytext 
yylineno 

flex lexer.l
gcc lex.yy.c -o lexer
echo "x = 12 + y;" | ./lexer
Exercices.
 int  char  void  if  else  while  return 

 /* ... */  // ...

 \n  yyleng 
Critère de réussite @

Étape 2 : flex + bison sur une calculatrice (2 jours)
La notion.grammaire

 + .y  calc.tab.c 
Guide pas à pas (de zéro)
Page 3 of 26
 yyparse()  yylex() 

 $1  $2  $3  $$ 

La pratique.
calc.l 
%{
#include <stdio.h>
#include <stdlib.h>
#include "calc.tab.h"
%}
%option noyywrap
%%
[0-9]+ { yylval = atoi(yytext); return NOMBRE; }
[-+*/()\n] { return yytext[0]; }
[ \t]+ { /* blancs ignorés */ }
. { fprintf(stderr, "Caractère illégal : %s\n", yytext); }
%%
calc.y 
%{
#include <stdio.h>
int yylex(void);
void yyerror(const char *msg);
%}
%token NOMBRE
%left '+' '-'
%left '*' '/'
%%
ligne : %empty
| ligne expr '\n' { printf("= %d\n", $2); }
;
expr : NOMBRE
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '(' expr ')' { $$ = $2; }
;
%%
void yyerror(const char *msg) { fprintf(stderr, "Erreur : %s\n", msg); }
int main(void) { return yyparse(); }
Guide pas à pas (de zéro)
Page 4 of 26
 calc.l  calc.tab.h 
bison -d calc.y
flex calc.l
gcc calc.tab.c lex.yy.c -o calc
echo "1+2*3" | ./calc # affiche = 7
 %left 

 bison -v calc.y 
 calc.output
Exercices.
 -3  %prec
 %left 
 %define parse.error verbose  %locations  yyerror 

Critère de réussite 1+2*3  (1+2)*3  1+ 

Étape 3 : écrire la grammaire du TPC (2 à 3 jours)
L'objectif.

Attention.



Les tokens à produire dans le lexer


TYPE
int  char
VOID
void
IF  ELSE  WHILE  RETURN

IDENT

NUM

Guide pas à pas (de zéro)
Page 5 of 26
1 / 26 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!