Professional Documents
Culture Documents
ااي
khatibe_30@hotmail.fr
ها ا
ب و ي أو ا
ة
آ
...ا ) (Compilerة ة 2010
dV2!0آ
O 02ا /2و أ V,و *lض mدوات ا ز :
روا V
) oو آ
,V
$0)
Wذ^ @2Qق إ 'ل !
oاVف 9 +0ح ادوات
ا! 67 2هRا ا23ب
O d30ا23ب 9 67ح آ
@` */2
Wة @Uة و
@ا !@.
ا?وري /ا أن )
r oت aا 67 +
20 VQ C++هRا
ا23ب 7;uإ 7و إن آ a
@ tQا :
2أو )ف .6
2
( ة ةCompiler) ا...
آ 2010
ا
س
4 ..................................................................................................O .1
22 ......................................................................................*/2 ا .3
3
( ة ةCompiler) ا...
آ 2010
ه1 ل أو3 أو ا6!* ا/2* آ/2 67
ت37 d ه...*/2ا
ول0 و,d
2!
?
ه
!
و أd/=؟ أ, أن اO2) dت؟ هaا
.
a, */2 ; `@اتQ ب ذن ا& أن23ا اR ه67
#$% .1
R
W02 مO
+Q7 ف ابVW a اR هtQ إذا آ, W ب23 cQ 0
د3 اd
) =
7 ف ابVW
1 cQ اa tQ أ إذا آ,ة9 cQا
اR ه,(code cible) ,م ف ابVW ( إ آدtexte source) ر$ا
a ر إ$ a آد/2 مO
a ب23 cQ * ه/2 ا,/2)! ا
.eا
:L’analyse lexicale (1
4
( ة ةCompiler) ا...
آ 2010
( وه رةtable des symboles) ول از/ ء0 مOQ د3 اd
) ة و9
:6)eن آ3
وtoken d آ$` d) )آ
ت
5
( ة ةCompiler) ا...
آ 2010
:L’analyse syntaxique (2
- ي0 اd
2 ا/U2!
ا0ة اY ا-
:62 اd3Y ا7 ن3) VQ7 0 ا ادOأ ا
inst ->
|…
| entier
| reel | …
6
( ة ةCompiler) ا...
آ 2010
:L’analyse sémantique (3
:Génération de code (4
7
( ة ةCompiler) ا...
آ 2010
K
ت اMNO وBISON وLEX .2
د اQ d , ذا,/2 اdا ا/ ة$2U ا و/
O ^) tQآ
ةQ 6O0 ي0ي و ا0 و ا6 اd اt أQ وVU2!0 62 اaا
.BISON وLEX
و ه2V
) أدا
?
( و
ف أAnalyseur syntaxique) يQ d C a ةW9 0
YACC أوBISON
60
وscanner د اـO اtokens اـd
2 a ا اBison d2!
,parser ـ
:YACC وLEX ون
اـ2
اW
رة آ$ اR هd') ,
Q ة9 V
d
7 bas.l ¢ أ اparser ـ¢, وd
bas.y ¢ ا!¡ اd3Yإذا و != ا
$) اR وهtokens اـ¢
) و
يYACC
اـy.tab.h ¢ ا,scanner ـ¢,و
:y.tab.h ¢ ا67 tokens أ اـ
8
( ة ةCompiler) ا...
آ 2010
cQ اd$0 y.tab.c وlex.yy.c d* آ/2Q C aت ا/2 ل أ2و
.0
QV) ...
* ا/2 و ه اbas.exe 6V0ا
http://www.4shared.com/file/227985692/6671fd89/TC30.html
http://www.mediafire.com/?iyjt4zoej2m
http://www.snapdrive.net/files/618263/CompilerLesson/TC30.zip
http://www.4shared.com/file/227982793/8d639f91/Lex_Yacc.html
http://www.mediafire.com/?52ym5eyydom
http://www.snapdrive.net/files/618263/CompilerLesson/Lex_Yacc.zip
$
,D:\ صO ا67 Lex_Yacc !¸ اQ واLex_Yacc.zip ¢ اoa?^ اW *
.ن !ح ااث3
يR واD:\Lex_Yacc\exemples
^ ا
9
( ة ةCompiler) ا...
آ 2010
.C ¿ أآاد+ `صQ V7 اOت و اW
2 أ ا,C a
رة آدWاوال ا
%{
#include<stdlib.h>
#include"D:\Lex_Yacc\exemples\expy2.h"
%}
blanc [ \t]+
chiffre [0-9]
entier {chiffre}+
و%{
2
ا02^ آR وC a آد7; إ إ02 اO ,تW
2 ا23 0
¢ ا+Q V7 expy.2h ¢ 02 أ ا,stdlib.h 23ج إ دا ا20 ,%}
^R
7 BISON
¢^ اR7 ¡O) < ,
7 tokens ت اـW
) ي
يRا
+
7 0 -@ر ا`
ة3- 6Q' اء ا,تW
2 ذ^ اء اول ا,نe ا2< ) اه
؟60) ذا,ر$د ا3 اtokens
اـW$2 V2!0 62ا= اO
¿ ا$2
:entier وchiffre وblanc ,= ث اl 0
:V
Q ا= وOء اYQu V2!Q 62ول وف ا/ اRه
. \n ء0'2 افdآ
\n
/ @
* V O! أو أآ' ارة اU!Q W,
10
( ة ةCompiler) ا...
آ 2010
رةM
ا ت%O
ا
abc abc
abc* ab,abc,abcc,abccc,…
abc+ abc,abcc,abccc,…
a(bc)+ abc,abcbc,abcbcbc,…
a(bc)? a,abc
[abc] a,b,c
[a-z] z وa
أي ف
[a\-z] a,-,z
[-az] -,a,z
[A-Za-z0-9]+ ( ذ^ ااد67 )'ف أو أآ
[ \t\n]+ ت1اWا
[^ab] b وa ء0'2 ء69 أي
[a^b] a,^,b
[a|b] a,|,b
a|b b أوa
}%
#include<stdlib.h<
#include"D:\Lex_Yacc\exemples\expy2.h"
{%
blanc [ \t]+
chiffre [0-9]
entier {chiffre}+
%%
11
( ة ةCompiler) ا...
آ 2010
{blanc}
{entier} {
yylval=atoi(yytext);
return(NOMBRE);
}
"+" return(PLUS);
"*" return(MULT);
"-" return(MOIN);
"/" return(DIVS);
"^" return(PUIS);
"(" return(PARG);
")" return(PARD);
"=" return(FIN);
\n {}
%%
dW
ذا, ة11 ك0 ه,%% و%%
2 ا و ه
اO صU اء ا0W;أ
... KV إ... ت$ إذا و: 67 اO اUQ ! d3 ؟LEX اـ
تW
scanner أي أن اـ,(ء69 <) KV{ إblanc} ت$ إذا و,ة اوO' ا
.+
7 و !ب+2/2 مO0 يR ا¢ ا67 دة/ت ا1اWا
, * ر6 وهV
0$ 62 اtoken اـ+
7
Q return(NOMBRE) ; 6Q'ا!@ ا
¢ ا67 Q/ ' إذا و,parser ي أو0 اd( إ اentier)مU2!= اO!= ا
, 3 وNOMBRE 6
ه هQ token ن أولr7 5+5=
ا+`!= ا0 يRا
مOQ parser ره إ اـ0 وscanner اـ+
' يR اNOMBRE ج إ
اـ20
dW و,parser و اـscanner
اـd, وه رة هة وyylval
a2ده إ ا0
3Y ! اوف اd
يR اyytext
a2 ا67 دة/
ا7
اOل اQ ^ذ
.stdlib.h 23 اd`دة دا/ اatoi ل اا2
, ` )@¡ إ دe
12
( ة ةCompiler) ا...
آ 2010
D:\Lex_Yacc\exemples ا!ر67 د3 ذا ؟ `ن ا,scanner اـ¢,ن وe اQ
VQأ
67 OQ < 2 ,scanner ـC آدLEX
FLEX expl2.l ل ا2 و,expl2.l *
:
2= اوا ا2ة و اآ3W ا2W * = ا23Q ة اوس وR7Q 2WQ ةdآ
FLEX expl2.l
Pause
^
آd دو,D:\Lex_Yacc\exemples ا67 FLEX_2.bat * ¢ اW* أl
:
2
ا20 اd$2 flex_2.bat 67 ا¢ا
ا ؟؟؟R ه
13
( ة ةCompiler) ا...
آ 2010
ه62 اtokens اـd') وف آ
ة23ت ا3 ا,ء69< اغ أو7 60
£ ا
.(symboles non-terminaux)
VQ
1 رز6V7 ت3 ا6 أ, scannerاـ
¡O) 5+5*9= !! اd ' ه, 'ل:2) 6 هO!ا اO* اVW O
!أ
ا!¡؟grammaire وط اـ9
Input -> Input Line
-> Input
-> Exp FIN
-> Exp PLUS Exp FIN
-> Exp PLUS Exp MULT Exp FIN
-> NOMBRE PLUS NOMBRE MULT NOMBRE FIN
-> 5 + 5 * 9 =
ة
ه37 ^
@
اR ه,Input @Q إ5+5*9= إ ارة0,إذا و
.O< VU2!0 62ا اOا
%{
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "d:\lex_yacc\exemples\expl2.c"
%}
%token NOMBRE PLUS MOIN MULT DIVS PUIS PARG PARD FIN
%left PLUS MOIN
%left MULT DIVS
%left NEG
%right PUIS
%start Input
14
( ة ةCompiler) ا...
آ 2010
¡ ))
= اـO2ء ا0l أV0 أQ 62ة اO ا+
7 دQ %start Input
`ا!@ ا
.scanner د اـO اtokens
:$
¡!د ا3
اaQ ,ا ا زO ا2 آ6
هQ'ا ا
%{
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "d:\lex_yacc\exemples\expl2.c"
%}
%token NOMBRE PLUS MOIN MULT DIVS PUIS PARG PARD FIN
%left PLUS MOIN
%left MULT DIVS
%left NEG
%right PUIS
%start Input
%%
Input:
|Input Line
;
Line :FIN
|Exp FIN {printf("=%d\n",$1);}
;
15
( ة ةCompiler) ا...
آ 2010
ةO ا, ةd¡ آO) 0 dW
ذاparser ا و إ`ر اـO ا2 ه آ07 dآ
اغ أو7 إ,
Á
9 6@2 Input ,
@ ااOQ 6 وه,Input : Input Line | ; 6او ه
.; وواV ,Input Line
¢,ى و2! اف "=" آ ه ف6 )وهFIN 0
@) إ,Line ,
Q'ة اOا
ذا,printf("=%d\n",$1) ; ل2
!
ا
ا2Q =23Q 0 وه,Exp FIN ( أوLEX
؟$1 ا60
0 وه,0O
67 هQ 62 اtokens
* از و اـR`rQ و6@Q أن003
¡O2ء ا0lأ
6V7 V2 إQ إذا أردFIN
أ,$1 ـ7 6 وهExp
9Y= ا230
.اR3 وه$2
Q3د
* أو اءة
* از ا0u و,!
أ¢$Q أ
و¢$Q ك0 ة هd آ67
:$x d2!Q 0Q7 ةO
:
`
راتQl أ0
@) Exp ,Exp ب,Uة ا'' اO إ اdO20Q
ل2 Exp
ا* إ6@Q ,o
! 7 Exp -> NOMBRE 67 •
. آ أذآAction sémantique اآ ا`
ةـR و )! ه,$$=$1 ;
ةO اR ه$OQ ,
/ ء69 ك0 هExp -> MOINS Exp 67 •
V 6V7
ا@حV!WQ 6 هt!
0 )^ ا3 و,-112 ' 6W0 ا
NEG
أوV
@Q اRV و,< أو-5 =!Q 0Q7 -5/6 Q/ ' إذا و,ى$
أو
Exp – إExp
O وا; وه إ@ء ا6 أ ا,prec NEG%
2ل ا2
. $$ = $2 ;ل2 ا
!ر62ا
( و3^2=9)ةO إ ا:7 اV $O07 Exp -> Exp PUIS Exp !0 •
6
آmath.h 23 ا67 دة/ اpow ل اا2 V!0
.$$=pow($1, $3) ;
16
( ة ةCompiler) ا...
آ 2010
main()
!
ح اا ا$Q أن0 6O ,parser ـ,Uا اO !* ا6V0Q 0إ ه
:
W !* اوال ا67 اRوه
%{
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "d:\lex_yacc\exemples\expl2.c"
%}
%token NOMBRE PLUS MOIN MULT DIVS PUIS PARG PARD FIN
%left PLUS MOIN
%left MULT DIVS
%left NEG
%right PUIS
%start Input
%%
Input:
|Input Line
;
Line :FIN
|Exp FIN {printf("=%d\n",$1);}
;
17
( ة ةCompiler) ا...
آ 2010
{
printf("input.txt not found !\n");
getch();
return;
}
yyparse();
getchar();
}
18
( ة ةCompiler) ا...
آ 2010
¢ ل2< @!ا اRك ه0 هexpl2.l Q3! ا¢, و¢ 6W7 آR) t0 و إذا آscannerاـ
:tokens ت اـW
)
%{
#include<stdlib.h>
#include"D:\Lex_Yacc\exemples\expy2.h"
%}
expy2.h إ+
اa0 ,3Y t!
!! expy2.h
وexpy2.tab.h + ا3و
. اV2Qوا
D:\TC\BIN\TC.EXE D:\Lex_Yacc\exemples\expy2.c /b
pause
* يR
W0) ¢ d$2 د و3 ا/) *22 وcompile.bat ¢ اRWQ
0 < زQ –
/ ¢ ¢; أ0
2Q ىQ 63 و6V0 اcQ وه اEXPY2.EXE
19
( ة ةCompiler) ا...
آ 2010
d
input.txt * -D:\Lex_Yacc\exemples ى ا2! dQ O0 و
: ' ,V!
Q 62 ¿ ا
ت ا+
ا¢?0 ا` ت و
5+5=
10*55=
3+2^2=
-5+(11*8)-16=
:
20 اR هd$2 وEXPY2.EXE
ا0Q نe اRWQ
ء < أه69 اR أن هO2) < ,input.txt ¢ ا67 دة/ ا
ت اd م !ب آO
¢
ن آe اt?)ن اؤ
ا3)
= أن,0 صU* ا/2 أول `@ة اRV7 +
-ا ادةO ا: ¡7ا2) < أو ى- Á`
=230 ,ا$7 نe اR0 d0
:$
input.txt ¢
ا1 ,
20ى ا0
5+5=
10*55=
3+2^2=
-5++(11*8)-16=
:
20 اR هd$0 EXPY2.EXE R
W0) ,r@U أ
اt< O
أآ
20
( ة ةCompiler) ا...
آ 2010
:o اواRم أ هU2ا ا'ل اRي ه2
يR اexemples اd
2
http://www.4shared.com/file/227983170/36d8f872/exemples1.html
http://www.mediafire.com/?gqniqohtmyz
http://www.snapdrive.net/files/618263/CompilerLesson/exemples1.zip
21
( ة ةCompiler) ا...
آ 2010
Y
ا# .3
مU2!0 ,VU2!0 62 اa أول
= )
ه ا,*/2أ اQ 0 ه
:02a وآ'ل,Algorithmes اـ23 d2! ا0 اWQ
algorithme alg
entier resultat,a;
debut
ecrire "Entrer a = ";
lire a;
resultat<-5;
a<-resultat*10 ;
ecrire !,"a = ",a;
lire a;
fin.
02a
,
/ @ 67
= ا اا2 أي أآ,
/ @ 60
+Q¡ أW2Q (!) ا
. و اءة2د و آ0 إoO7 ,تO ي2) < ا
ة
ج2) a اR ه,Compilateur d’algorithmes را ـ$2` اcompalg */2ا اR ه6!0
آa0 وgrammaire ا اـRV أ0 )ده و62ا اO أو اgrammaire إ
:
ة/ ة7; إQأرد
22
( ة ةCompiler) ا...
آ 2010
%{
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include"d:\lex_yacc\exemples\compalg.h"
int line=1;
%}
يR
و ا7 BISON
يR ه اcompalg.h ¢ ا,=)3 )^ اdج آ20
د$ Q يR ا6 ا!@ اd'
line
a2 ا, ا زtokens
اـ$2
ي ا
ف0 اR @ و هd
آVQ 0 ¸2
0 و+0 tokens اج اـU2 و ا+
)
.; وا, r@` 07د, إذا0
:درس3 اtokens اج اـU2< ا= ا زOن اeف ا0
blanc [ \t]+
nbr [0-9]+
entier {nbr}
reel {entier}\.{nbr}
ident [a-zA-Z_]([0-9a-zA-Z_])*
a [aA]
b [bB]
c [cC]
d [dD]
e [eE]
f [fF]
g [gG]
h [hH]
i [iI]
j [jJ]
k [kK]
23
( ة ةCompiler) ا...
آ 2010
l [lL]
m [mM]
n [nN]
o [oO]
p [pP]
q [qQ]
r [rR]
s [sS]
t [tT]
u [uU]
v [vV]
w [wW]
x [xX]
y [yY]
z [zZ]
ة واة9 إ1 اادd آd'
nbr ' ,V!WQ حY) O!ا= اO أن اO2أ
.=O إ ذ^ ا620) 14522 ' +Q أي أ,' أو أآd ا
' nbr.nbr رة+Q إذ أ,
¢2U
7 reel =O أ ا,nbr +!WQ هentier =Oا
.=Oا اR هt) رج0) 62
اO
O
ه ااد ا1 و12.11
رة أ اوف+2
ن ا327 -y_10 أوx d'–
اتa2 اd'
يR اident =Oا
+
) *l , [a-zA-Z_] =! اR( و ه-) [ أو افA-Z] [ أوa-z] إ ال620) 62ا
6Q' ا¢$0 ا,(_) [ أو0-9] [ أوA-Z] [ أوa-z] ; ن3) 62 أ`ى اوف ا
.([0-9a-zA-Z_])* ا ـR هQن و د3
< ن أو3
أن3
a2ا
V' 02a 67
ة3ن اوف ا3) 2 oO7 ه02 اO7 z إa =اO
اO أ
' ,
ةa$
ة و ا3ق
اوف اW) < 62ل ا3 a ) آ,
ةa$ اوف اd'
.A أوa ن3
أن3
a =Oا
...d7 إ...ت/ إذا وd3Y ا62ا اO ا¢ ) و ه6Q' إ اء اdO200
%%
"\""."\"" return(CARA);
"\""(.)+"\"" return(CHAINE);
{a}{l}{g}{o}{r}{i}{t}{h}{m}{e} return(ALGO);
{d}{e}{b}{u}{t} return(DEBUT);
{f}{i}{n} return(FIN);
{e}{n}{t}{i}{e}{r} return(DEC_ENTIER);
{r}{e}{e}{l} return(DEC_REEL);
{c}{a}{r}{a}{c}{t}{e}{r}{e} return(DEC_CARA);
{c}{h}{a}{i}{n}{e} return(DEC_CHAINE);
{l}{i}{r}{e} return(READ);
{e}{c}{r}{i}{r}{e} return(WRITE);
24
( ة ةCompiler) ا...
آ 2010
"!" return(NEW_LINE);
\. return(POINT);
; return(POINT_VER);
, return(VER);
\n {line++;}
"<-" return(AFFECT);
"(" return(PARG);
")" return(PARD);
"+" return(PLUS);
"-" return(MOIN);
"*" return(MULT);
"/" return(DIVS);
"^" return(PUIS);
{ident} return(IDENT);
{reel} return(REEL);
{entier} return(ENTIER);
{blanc}
%%
.
20 آlex.yy.c ¢ اd$) FLEX_2.bat ^
آdدو
27 ا,L’analyseur syntaxique وه ار أوcQ ا6Q' ا¢$0ء ا0 إdO200
: =2ة و أآ3Wا
%{
#include<conio.h>
#include<math.h>
#include "d:\lex_yacc\exemples\lcompalg.c"
int errors=0;
%}
+!WQ V7 lcompalg.c ¢ !0 )= أ3ج إ دوال )^ ا20 ,د2آ
!ب د ا`@ءerrors
a2 اd2!0 ,-O< +2
!)
a0– lex.yy.c ¢ا
:تW
2
ا ا¢
?Q ^ ذ,Algorithm ي
ي اـR ا¢ ا67 دة/ا
%token IDENT
25
( ة ةCompiler) ا...
آ 2010
%token ENTIER
%token REEL
%token CHAINE
%token CARA
%token ALGO DEBUT FIN POINT POINT_VER VER
%token DEC_ENTIER DEC_REEL DEC_CARA DEC_CHAINE
%token AFFECT READ WRITE REEL PARG PARD
%token PLUS MOIN MULT DIVS PUIS NEW_LINE
07
2 @ر ا: ار67 , ا زtokens
اـ$2 0 @ر او:!2 ا67
...
;ح,@ قQ<@ اOQ d') 62ة اO ا+
7
` ا!@ ا,
!
dأو
آ
%%
prog:ALGO IDENT declaration debut
;
declaration:
|decl_type ident POINT_VER declaration
;
decl_type:DEC_ENTIER
|DEC_REEL
|DEC_CARA
|DEC_CHAINE
;
ident:IDENT
|IDENT VER ident
;
debut:DEBUT command_seq
;
command_seq:
|command_seq FIN POINT
|affect POINT_VER command_seq
|READ read POINT_VER command_seq
|WRITE write POINT_VER command_seq
;
affect: IDENT AFFECT fexpr
26
( ة ةCompiler) ا...
آ 2010
0OW)ي اR اgrammaire اـ+!WQ د ا!¡ ه3 ا,0
هO) ¡OQ Q
ه+Q BISON أ¡ ام3 60) < ,
a) +39 إ< أنO +2ا
. grammaire ـd3Yا اR
ه
27
( ة ةCompiler) ا...
آ 2010
*
ا/
7 دW ¢; و أcompalg.y * ¢ 67 ¡!د ا3ن `ن اeا
:ا اR ه+
7 =2 و أآBISON_2.bat
BISON -d compalg.y
28
( ة ةCompiler) ا...
آ 2010
و,COMPALG.EXE وه6V0 اcQ اd$0 compile.bat ¢ اR
W0) ,إذن
اR*
¡ ه/2 آ` تtest.alg ¢ل ا2 0 ار¢, و2ء آ0lأ
:@!ا
//…
if((yyin=fopen("d:\\lex_yacc\\exemples\\test.alg","r"))==NULL)
//…
يR اAlgorithme اـQ +
7 =2 و اآtest.alg * ¢ 6YQ أ,*/2 اR
W0) d ذ^ و
:د3ا ه اR وه,+2/) د$ Q
algorithme alg
entier resultat,a;
debut
ecrire "Entrer a = ";
lire a;
resultat<-5;
a<-resultat*10 ;
ecrire !,"a = ",a;
lire a;
fin.
:R
W02
ا2Q 6 هR ه,*/2 اW2
2 COMPALG.EXE */2 اcQ RWQ ^ ذ
29
( ة ةCompiler) ا...
آ 2010
^R ار و¢,ء و0lا اد أO ¡@ +Q أ/د و و3 اW2 */2 م اO
: $
U
ا!@ ا1 ' ,Î` Algorithme 2ب آ0 ,(Ok) ض ر
algorithme alg
entier resultat,a;
debut
ecrire "Entrer a = ";
lire a,;
resultat<-5;
a<-resultat*10 ;
ecrire !,"a = ",a;
lire a;
fin.
ن32 O هQ د62 اa ا ا: ¡@0
< اR و أن ه,
7; إ,7 ك0ه
:
20ا
وL’analyseur lexicale d ا أ/ ;ة وا37 ^
tQ3) +Qآ أÍ ا
.(Scanner & Parser) L’analyseur syntaxique
30
( ة ةCompiler) ا...
آ 2010
d
2 أو
اL’analyseur sémantique 6 أ< وه,
2ن إ ا اe اdO20Q
: إ-test.alg ¢ى ا2 - +2/) اادAlgorithme
اـaQ ,ي0ا
algorithme alg
entier resultat,a;
reel r;
caractere c;
chaine s, r;
debut
ecrire "Entrer a = ";
lire a;
lire r;
c<-"a";
s<-"chaine s";
c<-s;
c<-"hhhh";
resultat<-5;
a<-resultat*10 ;
ecrire !,"a = ",a;
a<-r;
a<-0.5;
x<-150;
lire a;
fin.
cQ 67 =23Q 0! وQ oO7 07 V 0 < ,
ت2
ت و ا$2 ¿ ا0W;أ
,
7 ! V7 s
a2 أ ا,ع فQ c
a2 واr 6O
O
اa2 ا0W; أ,ذو هف
د؟3 ا6 67 أ`@ء/
d رأ
^ ه
فr
a2 ا5@! ا67 ' ,(Des erreurs sémantiques)
0 ك أ`@ء0 هd/أ
عQ
a2
إ7 ! د0 إ003
< 13 و12 @! ا67 وreel +Q أd O!
67 و,
,
a2 67
O
O ! :; و003
< 17 و16 @! ا67 ?
أ,caractere
نe إ ا, 3 ,d +0 ح$Q * 0Q أ: x
a2
د0 0 إذ18 @!ا
cQ اda9 وtest.alg ¢ `ن ا, ا`@ءR ه¢Y3 ا:
@2!
< */2ا
.L’analyseur sémantique دور6)r
0 ه, أ`@ء/
< :^ لO
وCOMPALG.EXE
ات وa2 اd آV
7 نU0 ,ول از/ أوla table des symboles ء0 0
=
0ه
اd` داSYMB_TAB.H *
/ ¢ ¢; أ,0V) V
,VاQأ
.د ا زم3 ا23 أ0 و+27 و اD:\Lex_Yacc\exemples
31
( ة ةCompiler) ا...
آ 2010
+!WQ
a2ر ا0 ,IDENT 6
و هa2 اd') 62 اtoken إ< اـYACC <
ر ـ
67 *32 ا0Q3 ,*V
< ! char[]
وint +Q 3 وyylval
ازa2
¡ ا
.+Q
ن:
?2 t.Tstr
ن7 t.Tint
ـQ0* ذ^ أl t.Tstr د
ـ0 0 إذا
a2
أآU2 اآة ا زR ا6* وهV اآة ازةR ا67 رآنY2
ات ا' ثa2ا
.t
128 !و
ـ6 ه0و ه
67 :@Oا اR ه+
إ¢; و أcompalg.y ¢ ا27ع؟ ا0 إ ذ^ ا620
yylval dQ ¢
آ
:
ن ا3ا
%{
#include<conio.h>
#include<math.h>
#include "d:\lex_yacc\exemples\lcompalg.c"
%}
%union{
char Tstr[128];
int Tint;
float Tfloat;
}
%token IDENT
//…
32
( ة ةCompiler) ا...
آ 2010
إa2ر ا* اQ أن0 6O ,+/2Q يRع ا0 إ اyylval عQ Q
1 ن3Q اRVو
:lcompalg.l ¢ى ا2! اR وهQ/ آ وYACC
//...
"^" return(PUIS);
{ident} {
strcpy(yylval.Tstr,yytext);
return(IDENT);
}
{reel} return(REEL);
//...
YACC
إa2
ا2 0 YACC إtoken d39 IDENT
Q أنd إذن و
a2 ا67 هQ ¡@) d أن
آO 0 ,yylval.Tstr 67 VU!0 اRو ه
.
@ة ااU إ اdO200 وlcompalg.l ¡1 و أW أ,yytext از
r
a2 ا:
ات آ ثa2
ا$2ار ا3) ي اول و ه0 اr@Uأ ا0
:د3ا اR ه7; أ0 وSYMB_TAB.H ¢ ا27 ا,¡! ا'ل ا67
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
sym_node *sym_table=NULL;
0 و ه,ع0 اWQ
آ2 9Í
وa2 ا* اQ32 اsym_node
آ2 ا07
0, ^ ذ,
a2 ا* اoO7 0V
,
اتa2
ا3
0
ء دYQ إQأرد
عQ
آ2 9Í 6 و ه0
ات هa2ول ا/ d') 62 اO ا6 وهsym_table
د3 ذ^ ا60
ذاdV) t0 و آC aا أ
ت ا ـR ه,sym_node
.ب23ا اR ه67 أO) t0آ
Q' أ ا,O ا67
/
a2 t') 62 واput_sym او,
2 دا¢
?0 ,d30
ادa2 )ي ا62آ
ا2 9Í
إ2 VQ أc202!Q V و اget_sym
:d t'
1
a2 إذا آن اNULL
2 أو2 راd39
33
( ة ةCompiler) ا...
آ 2010
34
( ة ةCompiler) ا...
آ 2010
,
اتa2
ا$2 اd39 V دQ 62 ا6 هdeclaration -> … ةOن ا7 آ )ون
ك
= أن0 ه,
a2
ا$2 ,W ع2
a2
أوa2 إ0
@) ident 0
و
35
( ة ةCompiler) ا...
آ 2010
67
ات وa2ول ا/ 67
a2 اt
'2 مO) 62 اsetup_sym() اا62!Q
ظW ن3
LEX دمO
اa2 إ* ا,r@` ض2
a2 اWQ
$2ار ا3)
.BISON ! ـ0 $1 67 وLEX ! ـ0 yylval.Tstr 67
V@ sym_check ااV ` 62!Q des actions sémantiques 0W; أ,;ا وا
.2 راd39
a2ا* ا
36
( ة ةCompiler) ا...
آ 2010
$2ار ا32
O2 اAlgorithme اـ67
ااردr@U ا¢Y2 اآO ,d/أ
d V0
$2* ا2
*
اتa2 ل2
ات و اa2ا
د0
أو إ,
a2
O
O
د0 إ6
ا`@ء وهO ¢Y3Q أن0 6O
6W230 3
و0ك ا
ا`@ء ا0 أآ
ه,char عQ
a2
7 !
. ¡ ذآoO7
و6O
O
و ا$ع ا0 اd آd') chr_ وstr_ وfloat_ وint_ tاl : أرQد
62آ
ا2 `- dO 7; 0 آ,6ا2 اوف و اوف ا
ة اd
.
a2ع اQ d'
يR و اtype
و هa2 ت اd)
37
( ة ةCompiler) ا...
آ 2010
:$2 اول67
a2 اt') 62 اput_sym اا67 ?
أa0
//...
sym_node *put_sym(char *sym_name, int sym_type)
{
sym_node *ptr;
ptr=(sym_node*)malloc(sizeof(sym_node));
strcpy(ptr->name,sym_name);
ptr->type=sym_type;
ptr->next=(sym_node*)sym_table;
sym_table=ptr;
return ptr;
}
//...
¢
?0 ,ا$7 نe ا+ إ ا7;
إa2ع اQ نU0 ,
عQ V
إ0W; إذ أSYMB_TAB.H ¢ ا67 دة/ اput_sym اا67 Q
1 0Q أ
:$2 compalg.y 67 دة/ اsetup_sym اا67
a2
= ا+Q7
a2ا
//...
void setup_sym(char* sym_name, int type)
{
sym_node *sym;
sym=get_sym(sym_name);
if(sym==NULL) put_sym(sym_name, type);
else
{errors++;printf("Erreur: %s est deja definie : ligne
%d.\n",sym_name,line);}
}
//...
38
( ة ةCompiler) ا...
آ 2010
//...
int errors=0;
int current_type;
//...
d آ67 current_type
µ
) 0
=
3 ,+ ا:
a2ع اQ نUQ ,إذا أ
:ةO اRى ه2! *2
اR ه,
/ عQ
$2* ا2
ة
//...
decl_type:DEC_ENTIER {current_type = _int;}
|DEC_REEL {current_type = _float;}
|DEC_CARA {current_type = _chr;}
|DEC_CHAINE {current_type = _str;}
;
//...
39
( ة ةCompiler) ا...
آ 2010
¡؟O2Q ¢
آ,¡!د ا3 ا67 ء69
أيaQ * Q
:ةO اR ' هR`r0
affect : IDENT AFFECT fexpr
< وإIDENT عQ : ¡7ا2 fexpr عQ ¡ أنO2
= اIDENT إfexpr د0ء إ0lأ
اتa2ول ا/ +Q ل$ ا:
@2!Q ^R
وa2 هIDENT ,r@` ض رQ
+
ل$ ا0
=
7 fexpr عQ ! إ0 أ,get_sym_type ل اا2
:
2ة اOا
fexpr : REEL
| ENTIER
| IDENT
Q' ا ا67 ,fexpr إfloat_ ع0 ا:/Q fexpr -> reel 0 أي, ا او67
: ¡7
اa2ع اQ WQ fexpr إ:/Q '' ا ا67 وfexpr إint_ :/Q
int ن3
= أنVQ ع إذا0
اfexpr و أن..اO
اO : d3Q اR3 و هIDENT
:د3 إ ا7;u اRV ^د ذQ وsexpr ! ـ0 ء6Y اWQ ^Rو آ
//...
%union{
char Tstr[128];
int Tint;
float Tfloat;
}
%type <Tint> fexpr
%type <Tint> sexpr
%token <Tstr> IDENT
//...
40
( ة ةCompiler) ا...
آ 2010
ا إ/ مVWد ا3ا اR ه7; اR وهsexpr وfexpr عQ
) ن هe ا+WQ إذا أول
: اهdآ
//...
writed_expr:NEW_LINE
|fexpr {/** ه/}
|sexpr {/** ه/}
;
fexpr:REEL {$$=_float;}
|ENTIER {$$=_int;}
|IDENT {
if(sym_check($1))
$$ = get_sym_type($1);
}
|fexpr PLUS fexpr {
if(($1 == _int) && ($3 == _int))
$$ = _int;
else
$$ = _float;
}
|fexpr MOIN fexpr {
if(($1 == _int) && ($3 == _int))
$$ = _int;
else
$$ = _float;
}
|fexpr MULT fexpr {
if(($1 == _int) && ($3 == _int))
$$ = _int;
else
$$ = _float;
}
|fexpr DIVS fexpr {$$ = _float;}
|MOIN fexpr %prec NEG {$$=$2;}
|fexpr PUIS fexpr {$$=$1;}
|PARG fexpr PARD {$$=$2;}
;
sexpr:CHAINE {$$=_str;}
|CARA {$$=_chr;}
;
//...
41
( ة ةCompiler) ا...
آ 2010
sexpr وfexpr عQ dل آ$ ا0@2ن اe ا,اO ا6 d3Q اR3وه
:^ ذdW0 ,
اتa2
ا$) وÍ!ة اO ا67 VاU2<
//...
affect:IDENT AFFECT fexpr {
if(sym_check($1))
{
int sym_type = get_sym_type($1);
if((sym_type==_int) && ($3==_float))
{
printf("Erreur:imposible de converter (reel
a entier) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_str) && ($3==_float))
{
printf("Erreur:imposible de converter (reel
a chaine) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_chr) && ($3==_float))
{
printf("Erreur:imposible de converter (reel
a caractere) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_chr) && ($3==_str))
{
printf("Erreur:imposible de converter
(chaine a caractere) : ligne %d.\n",line);
errors++;
}
42
( ة ةCompiler) ا...
آ 2010
}
}
|IDENT AFFECT sexpr {
if(sym_check($1))
{
int sym_type = get_sym_type($1);
if((sym_type==_chr) && ($3==_str))
{
printf("Erreur:imposible de converter
(chaine a caractere) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_int) && ($3==_str))
{
printf("Erreur:imposible de converter
(chaine a entier) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_float) && ($3==_str))
{
printf("Erreur:imposible de converter
(chaine a reel) : ligne %d.\n",line);
errors++;
}
}
}
;
//...
IDENT
a2د ا/ أو< و0OO) affect -> IDENT AFFECT fexpr ةO ا67 , '
نUQ وsym_type *
/
a2 ح$Q دا/ إذا آن,(sym_check($1 امU2
¡O2أ
اQ ^ و ذget_sym_type ام ااU2 IDENT
a2ع اQ +
7
0Q7 _float هfexpr عQ _ وint هIDENT عQ و آ'ل إذا آن,fexpr وIDENT عQ ¡7)ا
.
Oا اR3
( و ه, إ6O
O d
2 ا3
<) لO) r@` ض رQ
43
( ة ةCompiler) ا...
آ 2010
COMPALG.EXE
* ا/2 اcQ RWQ وO t) * آ/2ن )
اeأ ا
:
20 اR هd$2
44
( ة ةCompiler) ا...
آ 2010
Q 0Q اR و هAssembleur 32 bit ج إ2Q ,oO7 Assembleur 16 bit اـ: d20
( وles interruptions) تO اoO7 2Q أن+
7 ول0 و0 ه6V0د ا3ا
d39 o!ن أ3
د
= أن3 إذ أن اles appels système اوال اهة أو: d2Q
hello world م @ اO
assembleur د3 ا 'لR ه,e اa إd39 و أب
:9Y ا
.MODEL small
.stack 100h
.data
msg db " Hello, World!",13,10,"$"
.code
start:
mov ax,@data
mov ds,ax
mov ax,0C07h
int 21h ; : ح: 789 23 أن5ر إ01ا
<=$>! ا
=
ب23
اO *VW2 , ' WinAsm Studio آـAssembleur أيd2 ا+2/) إذا أردت
.6' :
2 اa d
ن إ ع و3) أن
45
( ة ةCompiler) ا...
آ 2010
.
46
( ة ةCompiler) ا...
آ 2010
//...
#include "d:\lex_yacc\exemples\SYMB_TAB.H"
#include "d:\lex_yacc\exemples\CODE_GEN.H"
//...
:
!
ى اا ا2! اRد ا و ه3 ا+
7 =230 يR ا¢ اÁ
V) 0
=
//...
main(int argc,char *argv[])
{
clrscr();
if((yyin=fopen("d:\\lex_yacc\\exemples\\test.alg","r"))==NULL)
{
printf("test.alg not found !\n");
getch();
return;
}
Init_Code("d:\\lex_yacc\\exemples\\test.asm");
yyparse();
Dispose_Code();
if(!errors) printf("Ok");
getch();
return;
}
//...
47
( ة ةCompiler) ا...
آ 2010
car<-"a";
resultat<-5;
a<-resultat*10+5;
ecrire !,"a = ",a;
lire a;
fin.
.MODEL small
.stack 100h
.DATA
.CODE
start:
mov ax,@data
mov ds,ax
end start
.د3
اO
) d,ا0 , ا67 ة3W ^ اt?)ن اeا
:
2ة اO اt) رج0
^ن ذ7
اتa2
ا$2 ا67
ident:IDENT {setup_sym($1, current_type);}
|IDENT VER ident {setup_sym($1, current_type);}
;
entier a; a dw 6 dup(?)
reel r; r dw 6 dup(?)
caractere car; car db ?
chaine s; s db 56 dup(‘ ‘)
48
( ة ةCompiler) ا...
آ 2010
49
( ة ةCompiler) ا...
آ 2010
جU) VQ و أdV )و أVQ ecrire أ ـ0 ,ecrire وlire ص ـUد ا3
ا2 أ0
.ى0 ,int 21h Oم اU2!0 0Q7 9Yص ا$Q
7 ! tQ إذا آ,
7 !
أوa2 إ2 راd39 R`r) ecrire اا
: ' ,9Y إ اV/UQ *l تQ
!* ا67 < أوV0 ح$Q
= أن7
.DATA .CODE
_msg_1 db "Entrer a = ","$"; mov dl, "c"
.CODE mov ah,2
mov dx,offset msg int 21h
mov ah,9
int 21h
50
( ة ةCompiler) ا...
آ 2010
}
"\""(.)+"\"" {
strcpy(yylval.Tstr,yytext);
return(CHAINE);
}
//...
char data_section[1024];
char code_section[8192];
FILE *fcode;
int data_counter = 0;
char *strtemp;
int current_op;
//...
:_msgX_
a2
ة/
ع/م رO)
ة/ ف دا0 نeا
//...
char* GenStrIdent()
{
char *temp = (char*)malloc(sizeof(char)*8);
char string[3];
itoa(data_counter++, string, 10);
sprintf(temp, "_msg%s_", string);
return temp;
}
//...
51
( ة ةCompiler) ا...
آ 2010
ةO
إ ا2 وcompalg.y ¢ إ اQ وCODE_GEN.H ¢ اW¡ و ا1أ
:ecrire ااd3Y اد
//...
%token <Tstr> CHAINE
%token <Tstr> CARA
//...
write:writed_expr
|writed_expr VER write
;
writed_expr:NEW_LINE
|{current_op = _WRITE;}fexpr {}
|{current_op = _WRITE;}sexpr {}
;
//...
sexpr:CHAINE {
$$=_str;
if(current_op == _WRITE)
{
strtemp = GenStrIdent();
Add_Data(strtemp);
Add_Data("\tdb\t");
Add_Data($1);
Add_Data(",\"$\"\r\n");
Add_Code("\r\n;ecrire ");
Add_Code($1);
Add_Code("\r\n");
Add_Code("mov dx, offset ");
Add_Code(strtemp);
Add_Code("\r\n");
Add_Code("mov ah, 9\r\n");
Add_Code("int 21h\r\n");
}
}
|CARA {
$$=_chr;
if(current_op == _WRITE)
{
Add_Code("\r\n;ecrire ");
Add_Code($1);
Add_Code("\r\n");
Add_Code("mov dl, ");
Add_Code($1 );
Add_Code("\r\n");
52
( ة ةCompiler) ا...
آ 2010
53
( ة ةCompiler) ا...
آ 2010
if(sym_check($2))
{
int sym_type = get_sym_type($2);
if((sym_type==_chr) && ($4==_str))
{
printf("Erreur:imposible de converter
(chaine a caractere) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_int) && ($4==_str))
{
printf("Erreur:imposible de converter
(chaine a entier) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_float) && ($4==_str))
{
printf("Erreur:imposible de converter
(chaine a reel) : ligne %d.\n",line);
errors++;
}
}
}
;
_er:{current_op = _AFFECT;}
;
//...
اR
وه2Q TEST.ASM ¢ ^
@
+a9 *l
/ COMPALG.EXE */2أ )
ا
:ا2
//...
_msg0_ db "Entrer a = ","$"
_msg1_ db "a = ","$"
.CODE
start:
mov ax,@data
mov ds,ax
54
( ة ةCompiler) ا...
آ 2010
mov ah, 9
int 21h
;ecrire "c"
mov dl, "c"
mov ah, 2
int 21h
//...
writed_expr:NEW_LINE {
Add_Code("mov dx, offset _NEWLINE_\r\n");
Add_Code("mov ah, 9\r\n");
Add_Code("int 21h\r\n");
}
|{current_op = _WRITE;}fexpr {}
|{current_op = _WRITE;}sexpr {}
;
55
( ة ةCompiler) ا...
آ 2010
//...
-
, VQ
أO
O
ات اa2 اdQ أن0OW) إO–
,
a2أ إذا آن ا
:9Y
ا,
اa2 )ض62د ا3@ اO اR هd2!0!7
ten dw 10
zero equ 0
N db 6 dup(0)
mov dx,0
56
( ة ةCompiler) ا...
آ 2010
mov ax,145 ;!%` ('& اK" L3 يH اa8$د أو اLا
mov cx,0
lea bx,N
next0:
div ten
cmp ax,zero
jz ax0
jmp cont0
ax0:
cmp dx,0
jz end0
cont0:
add dx,48
mov [bx],dx
inc cx
inc bx
mov dx,0
jmp next0
end0:
dec bx
print0:
mov al,[bx]
dec bx
mov ah,0Eh
int 10h
loop print0
57
( ة ةCompiler) ا...
آ 2010
void GenLabelIncCounter()
{
write_int_counter++;
}
//...
GenLabel("next") ;
.GenLabelIncCounter اا62!Q next1 أو62ى ا2! إ اdO200 و
:compalg.y ¢ إل ا
//...
fexpr:REEL {$$=_float;}
|ENTIER {$$=_int;}
|IDENT {
if(sym_check($1))
{
$$ = get_sym_type($1);
if(current_op == _WRITE)
{
Add_Code("\r\n;ecrire ");
Add_Code($1);
Add_Code("\r\n");
if($$ == _str)
{
Add_Code("mov dx, offset ");
58
( ة ةCompiler) ا...
آ 2010
Add_Code($1);
Add_Code("\r\n");
Add_Code("mov ah, 9\r\n");
Add_Code("int 21h\r\n");
}
else if($$ == _chr)
{
Add_Code("mov dl, ");
Add_Code($1);
Add_Code("\r\n");
Add_Code("mov ah, 2\r\n");
Add_Code("int 21h\r\n");
}
else if(($$ == _float) || ($$ == _int))
{
Add_Code("mov dx,0\r\n");
Add_Code("mov ax,");
Add_Code($1);
Add_Code("\r\nmov cx,0\r\n");
Add_Code("lea bx,_N_\r\n");
Add_Code(GenLabel("next"));
Add_Code(":\r\n");
Add_Code("\tdiv _TEN_\r\n");
Add_Code("\tcmp ax,_ZERO_\r\n");
Add_Code("\tjz ");
Add_Code(GenLabel("ax"));
Add_Code("\r\n");
Add_Code("\tjmp ");
Add_Code(GenLabel("cont"));
Add_Code("\r\n");
Add_Code(GenLabel("ax"));
Add_Code(":\r\n");
Add_Code("\tcmp dx,0\r\n");
Add_Code("\tjz ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");
Add_Code(GenLabel("cont"));
Add_Code(":\r\n");
Add_Code("\tadd dx,48\r\n");
Add_Code("\tmov [bx],dx\r\n");
Add_Code("\tinc cx\r\n");
Add_Code("\tinc bx\r\n");
Add_Code("\tmov dx,0\r\n");
Add_Code("\tjmp ");
59
( ة ةCompiler) ا...
آ 2010
Add_Code(GenLabel("next"));
Add_Code("\r\n");
Add_Code(GenLabel("end"));
Add_Code(":\r\n");
Add_Code("\tdec bx\r\n");
Add_Code(GenLabel("print"));
Add_Code(":\r\n");
Add_Code("\tmov al,[bx]\r\n");
Add_Code("\tdec bx\r\n");
Add_Code("\tmov ah,0Eh\r\n");
Add_Code("\tint 10h\r\n");
Add_Code("\tloop ");
Add_Code(GenLabel("print"));
Add_Code("\r\n");
GenLabelIncCounter();
}
}
}
}
//...
أو, دV رQ 62 ا ا6 و هecrire ااU
7 ك أ`
ة0 هt زا
وfexpr ->REEL ةO اd2!0 ,ecrire 114 ; ' ,2ة آرا9 6O
O
2
اa) :
$
ات اa2 ا: آد+!WQ V7 د3 !0 أ,fexpr: ENTIER
إVQ 0Q7
O
O
اO !0 أ,mov ax,$1 إmov ax, _var_name_
) د3 اWQ d2!0 0Q و أ3, ' int i = (int)$1 ; ل2 < أوO
O
WriteNum_Code ااR ه32 ,د3را ! ا$2`
ة ا/ داÎY00 0Q7
`أ
,V@0 62
اO
أو اa2 ا* ا2 راd39 R`r2 وCODE_GEN.H ¢ ا67
:<
//...
char strtemp1[12]; // وفd اX ed `.G fCg: a8:
Cg:
//...
void WriteNum_Code(char *value)
{
Add_Code("mov dx,0\r\n");
Add_Code("mov ax,");
Add_Code(value);
Add_Code("\r\nmov cx,0\r\n");
Add_Code("lea bx,_N_\r\n");
Add_Code(GenLabel("next"));
Add_Code(":\r\n");
60
( ة ةCompiler) ا...
آ 2010
Add_Code("\tdiv _TEN_\r\n");
Add_Code("\tcmp ax,_ZERO_\r\n");
Add_Code("\tjz ");
Add_Code(GenLabel("ax"));
Add_Code("\r\n");
Add_Code("\tjmp ");
Add_Code(GenLabel("cont"));
Add_Code("\r\n");
Add_Code(GenLabel("ax"));
Add_Code(":\r\n");
Add_Code("\tcmp dx,0\r\n");
Add_Code("\tjz ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");
Add_Code(GenLabel("cont"));
Add_Code(":\r\n");
Add_Code("\tadd dx,48\r\n");
Add_Code("\tmov [bx],dx\r\n");
Add_Code("\tinc cx\r\n");
Add_Code("\tinc bx\r\n");
Add_Code("\tmov dx,0\r\n");
Add_Code("\tjmp ");
Add_Code(GenLabel("next"));
Add_Code("\r\n");
Add_Code(GenLabel("end"));
Add_Code(":\r\n");
Add_Code("\tdec bx\r\n");
Add_Code(GenLabel("print"));
Add_Code(":\r\n");
Add_Code("\tmov al,[bx]\r\n");
Add_Code("\tdec bx\r\n");
Add_Code("\tmov ah,0Eh\r\n");
Add_Code("\tint 10h\r\n");
Add_Code("\tloop ");
Add_Code(GenLabel("print"));
Add_Code("\r\n");
GenLabelIncCounter();
}
//...
:
//...
fexpr:REEL {
61
( ة ةCompiler) ا...
آ 2010
$$=_float;
if(current_op == _WRITE)
{
sprintf(strtemp1, "%d", (int)$1);
Add_Code("\r\n;ecrire ");
Add_Code(strtemp1);
Add_Code("\r\n");
WriteNum_Code(strtemp1);
}
}
|ENTIER {
$$=_int;
if(current_op == _WRITE)
{
sprintf(strtemp1, "%d", $1);
Add_Code("\r\n;ecrire ");
Add_Code(strtemp1);
Add_Code("\r\n");
WriteNum_Code(strtemp1);
}
}
//...
:0آ2 ا: *
O
ا0 lcompalg.l ¢ إ ا0و
//...
{reel} {
yylval.Tfloat = atof(yytext);
return(REEL);
}
{entier} {
yylval.Tint = atoi(yytext);
return(ENTIER);
}
//...
62
( ة ةCompiler) ا...
آ 2010
r7 */2
ا20 و إذا أردت رؤ
اecrire ص اUد ا3 )
ا6V0Q اRV و
:test.asm ¢ ا27 و ا+a9 )
و
.MODEL small
.stack 100h
.DATA
_NEWLINE_ db 13,10,"$"
_TEN_ dw 10
_ZERO_ equ 0
_N_ db 6 dup(0)
;...
.CODE
start:
;...
;ecrire a
mov dx,0
mov ax,a
mov cx,0
lea bx,_N_
next0:
div _TEN_
cmp ax,_ZERO_
jz ax0
jmp cont0
ax0:
cmp dx,0
jz end0
cont0:
add dx,48
mov [bx],dx
inc cx
inc bx
mov dx,0
jmp next0
end0:
dec bx
print0:
mov al,[bx]
dec bx
mov ah,0Eh
int 10h
loop print0
end start
63
( ة ةCompiler) ا...
آ 2010
عQ
a2 أو67
a2 إ2 راd39 R`r2 62 و اlire ن إ ااe اdO20Q
: Q o
! 7
7
ات اa2 !0 ,6O
O
أو,
a2
أو7 !
64
( ة ةCompiler) ا...
آ 2010
65
( ة ةCompiler) ا...
آ 2010
}
;
//...
_ENTER_ equ 13
mov cx,0
next0:
mov ah,00h
int 16h
mov ah,0eh
int 10h
cmp al,_ENTER_
je end0
cmp al,'0'
jb end0
cmp al,'9'
ja end0
push ax
mov ax,cx
mul _TEN_
mov cx,ax
pop ax
mov ah,0
sub al,48
add cx,ax
jmp next0
end0:
mov a, cx //وؤة#$! اF#` اV eG يH اa8$ ه اa
66
( ة ةCompiler) ا...
آ 2010
2 مO2 62 واWriteNum_Code ـVY اReadNum_Code اا¢
?Q ^Rوآ
:2 راd39 @
اa2 ه0!
و,
أO
:
) آد
//...
void ReadNum_Code(char *var)
{
Add_Code("mov cx,0\r\n");
Add_Code(GenLabel("next"));
Add_Code(":\r\n");
Add_Code("\tmov ah, 00h\r\n");
Add_Code("\tint 16h\r\n");
Add_Code("\tmov ah, 0Eh\r\n");
Add_Code("\tint 10h\r\n");
Add_Code("\tcmp al,_ENTER_\r\n");
Add_Code("\tje ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");
Add_Code("\tcmp al,'0'\r\n");
Add_Code("\tjb ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");
Add_Code("\tcmp al,'9'\r\n");
Add_Code("\tja ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");
Add_Code("\tpush ax\r\n");
Add_Code("\tmov ax,cx\r\n");
Add_Code("\tmul _TEN_\r\n");
Add_Code("\tmov cx,ax\r\n");
Add_Code("\tpop ax\r\n");
67
( ة ةCompiler) ا...
آ 2010
Add_Code("\tmov ah,0\r\n");
Add_Code("\tsub al,48\r\n");
Add_Code("\tadd cx,ax\r\n");
Add_Code("\tjmp ");
Add_Code(GenLabel("next"));
Add_Code("\r\n");
Add_Code(GenLabel("end"));
Add_Code(":\r\n");
Add_Code("\tmov ");
Add_Code(var);
Add_Code(",cx\r\n");
GenLabelIncCounter();
}
دات0Õ ¡7د اا3 )
اoO7 6O ,lire ص اUد ا3 )
ا6V0Q اRV
:
2ة اOن ا3)
اا,
;
ا
ت ا!
ا6
* وO
ات و اa2ا
68
( ة ةCompiler) ا...
آ 2010
:
2
¡ ا67
a2 د ف إ0 مO0 إذ, اوف: d2 Qأ
69
( ة ةCompiler) ا...
آ 2010
mov car, al
:al d! اd`
اف دا:?Q ن أنe اO
,
a2 ه ا* اcar µ
//...
sexpr:CHAINE {
//...
}
|CARA {
//...
else if(current_op == _AFFECT)
{
Add_Code("mov al, ");
Add_Code($1);
Add_Code("\r\n");
}
}
;
//...
_msg2_ db "0123456789","$"
70
( ة ةCompiler) ا...
آ 2010
//...
sexpr:CHAINE {
//...
else if(current_op == _AFFECT)
{
strtemp = GenStrIdent();
Add_Data(strtemp);
Add_Data("\tdb\t");
Add_Data($1);
Add_Data(",\"$\"\r\n");
Add_Code("mov di,offset ");
Add_Code(strtemp1);
Add_Code("\r\n");
Add_Code("mov si,offset ");
Add_Code(strtemp);
Add_Code("\r\n");
Add_Code("mov cx,[si+1]\r\n");
Add_Code(GenLabel("next"));
Add_Code(":\r\n");
Add_Code("\tmov al,[si]\r\n");
Add_Code("\tcmp al,0\r\n");
Add_Code("\tjz ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");
Add_Code("\tmov byte ptr [di],al\r\n");
Add_Code("\tinc si\r\n");
Add_Code("\tinc di\r\n");
Add_Code("\tdec cx\r\n");
71
( ة ةCompiler) ا...
آ 2010
Add_Code("\tcmp cx,0\r\n");
Add_Code("\tjz ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");
Add_Code("\tloop ");
Add_Code(GenLabel("next"));
Add_Code("\r\n");
Add_Code(GenLabel("end"));
Add_Code(":\r\n");
GenLabelIncCounter();
}
}
//...
3 ,67
a2 إ67
a2 د0 آد إ0 O
@ اW0 , Q V ^آن ذ
/
a2 7; إ0
=
7 fexpr -> IDENT ةO ا67 :O2)
اتa2 اdو أن آ
ةO ا67 د/ اIDENT
a2
ا+
إ0!0 يR
اa2ع اQ
)دd
¢ ا
ا67 +0 ح$0 وAffectIdentType
a2ا اR ه6!0 ,fexpr -> IDENT
:compalg.y
%{
#include<conio.h>
#include<math.h>
#include "d:\lex_yacc\exemples\lcompalg.c"
#include "d:\lex_yacc\exemples\SYMB_TAB.H"
#include "d:\lex_yacc\exemples\CODE_GEN.H"
int errors=0;
int current_type;
int AffectIdentType;
//...
//...
affect:_er IDENT AFFECT {Add_Code("\r\n;");Add_Code($2);Add_Code("
<-
...\r\n");strcpy(strtemp1,$2);AffectIdentType=get_sym_type($2);}fex
pr {
//...
}
|_er IDENT AFFECT {Add_Code("\r\n;");Add_Code($2);Add_Code("
<-
72
( ة ةCompiler) ا...
آ 2010
...\r\n");strcpy(strtemp1,$2);AffectIdentType=get_sym_type($2);}sex
pr {
//...
}
;
//...
73
( ة ةCompiler) ا...
آ 2010
Add_Code("\tloop ");
Add_Code(GenLabel("next"));
Add_Code("\r\n");
Add_Code(GenLabel("end"));
Add_Code(":\r\n");
GenLabelIncCounter();
}
}
}
//...
ه+W0 d آ,67
a2 إ67
a2 V
7 0!Q 62! أ
? ا ا0Q
:al d! ا67 د0 ااد إ67
اa2
ا:;و
//...
fexpr:REEL {
//...
}
|ENTIER {
//...
}
|IDENT {
//...
else if(current_op == _AFFECT)
{
else if(AffectIdentType == _chr)
{
Add_Code("mov al, ");
Add_Code($1);
Add_Code("\r\n");
}
}
}
//...
اR
ه ن هف ه1 وstrcat وstrcpy اوف آـd
*2) 62 ا
ت اdه20
:
2 )
آد ا6V0Q 0 و ه, إ ا
ء¢* ا/2
و6
) ب23ا
.
7
ات اa2 اوف إ اd
و7
ات اa2د ا0 صUا
74
( ة ةCompiler) ا...
آ 2010
//...
affect:_er IDENT AFFECT {/*…*/}fexpr {
if(sym_check($2))
{
//...
if((sym_type==_int) || (sym_type==_float))
{
Add_Code("mov ");
Add_Code($2);
Add_Code(",ax\r\n");
}
//...
}
}
//...
وfexpr 67 دة/
ا!ت اO *O0 و0V
V7 +
و اa2ن أ اe! ا00
إd
int عQ CurrentOp +!0
وa2 ج إ2Q ,ax d!ه إ ا0!0
O ا0!0 U اR ه67 أي
و0
/
< +Q أ60) 62 و اNULL
Oا
PLUS ' CurrentOp
a2
اtQ أ إذا آ,mov ax, 112 ة9 ax
إUا
:add ax, 112 أي,: ا6 أن ا
ا
ه60
اRV7
//...
int errors=0;
int current_type;
int AffectIdentType;
int CurrentOp = NULL;
//...
75
( ة ةCompiler) ا...
آ 2010
|IDENT {
//...
}
|fexpr PLUS {CurrentOp = PLUS;} fexpr {
if(($1 == _int) && ($4 == _int))
$$ = _int;
else
$$ = _float;
}
|fexpr MOIN {CurrentOp = MOIN;} fexpr {
if(($1 == _int) && ($4 == _int))
$$ = _int;
else
$$ = _float;
}
|fexpr MULT {CurrentOp = MULT;} fexpr {
if(($1 == _int) && ($4 == _int))
$$ = _int;
else
$$ = _float;
}
|fexpr DIVS {CurrentOp = DIVS;} fexpr {$$ = _float;}
|MOIN fexpr %prec NEG {$$=$2;}
|fexpr PUIS {CurrentOp = PUIS;} fexpr {$$=$1;}
|PARG fexpr PARD {$$=$2;}
;
//...
^R و آfexpr -> REEL وfexpr -> ENTIER اOى ا2! +207 d ا6 أ
إCurrentOp
ع/ا ا' ث
= إرO ة اd
آVQ 67 وfexpr -> IDENT
:NULL
//...
fexpr:REEL {
//...
CurrentOp = NULL;
}
|ENTIER {
//...
CurrentOp = NULL;
}
|IDENT {
//...
CurrentOp = NULL;
76
( ة ةCompiler) ا...
آ 2010
}
//...
:
ه2 ا23 د اد3 ا,PLUS وNULL 6 هCurrentOp ! ـ0 ا<تdVأ
//...
fexpr:REEL {
//...
if(CurrentOp == NULL)
{
Add_Code("mov ax, ");
Add_Code(strtemp1);
Add_Code("\r\n");
}
else if(CurrentOp == PLUS)
{
Add_Code("add ax, ");
Add_Code(strtemp1);
Add_Code("\r\n");
}
}
CurrentOp = NULL;
}
|ENTIER {
//...
else if(current_op == _AFFECT)
{
sprintf(strtemp1, "%d", (int)$1);
if(CurrentOp == NULL)
{
Add_Code("mov ax, ");
Add_Code(strtemp1);
Add_Code("\r\n");
}
else if(CurrentOp == PLUS)
{
Add_Code("add ax, ");
Add_Code(strtemp1);
Add_Code("\r\n");
}
}
CurrentOp = NULL;
}
|IDENT {
77
( ة ةCompiler) ا...
آ 2010
if(sym_check($1))
{
//...
else if(current_op == _AFFECT)
{
//...
else if((AffectIdentType == _int) ||
(AffectIdentType == _float))
{
if(CurrentOp == NULL)
{
Add_Code("mov ax, ");
Add_Code($1);
Add_Code("\r\n");
}
else if(CurrentOp == PLUS)
{
Add_Code("add ax, ");
Add_Code($1);
Add_Code("\r\n");
}
}
}
}
CurrentOp = NULL;
}
//...
d` دا6
O ا:; مO0 ,6*10
' ا0
tQ إذا آ,MULT
إ اdO200
؟dWQ ذا,CurrentOp
a2 ا67 MULT
ا0 أ0 ^ ذ,ax d!ا
...ي
ا?بQ ^ ذsub ax,6 امU2 AX d! ا6
O@ح ا0
0 ا!ن ))ه67 c اt و:; * أ6Q أ: c اt ;ا إهارا واRن ه3
67
2 د ا!¡ و3 ا67
a0 ,(Optimisation du code د أو3
)!
ا
.CurrentOp
a2 NULL ا
d ,ا$7 نe اax d! اd` دا6
اa2
ا
أو اO ا:; مOQ
* إd)
7 ! ن3
يR اTempReg * tÍ
a2 67 V; مO0
ة/
027د, ذ^ و إذا,
@ أاف ا
اY
اO
أو اa2ا
¢
?Q 0Q7
ة/
ك أي0 ه3) * أ إذا,TempReg ى2 : V
0 0Q7
:6)e اا
آ67 ax d!
اW$) ?
و أaffect ةO
اVQ 67 ax إTempReg
//...
int CurrentOp = NULL;
78
( ة ةCompiler) ا...
آ 2010
char TempReg[16];
//...
affect:_er IDENT AFFECT {/*...*/ Add_Code("mov ax,0\r\n");}fexpr
{
if(sym_check($2))
{
//...
if((sym_type==_int) || (sym_type==_float))
{
Add_Code("add ax,");
Add_Code(TempReg);
Add_Code(",ax\r\n");
Add_Code("mov ");
Add_Code($2);
Add_Code(",ax\r\n");
}
//...
}
}
//...
//...
fexpr:REEL {
//...
else if(current_op == _AFFECT)
{
sprintf(strtemp1, "%d", (int)$1);
if(CurrentOp == NULL)
{
strcpy(TempReg, strtemp1);
}
//...
}
CurrentOp = NULL;
}
|ENTIER {
//...
else if(current_op == _AFFECT)
{
sprintf(strtemp1, "%d", (int)$1);
if(CurrentOp == NULL)
79
( ة ةCompiler) ا...
آ 2010
{
strcpy(TempReg, strtemp1);
}
//...
}
CurrentOp = NULL;
}
|IDENT {
if(sym_check($1))
{
//...
else if(current_op == _AFFECT)
{
//...
else if((AffectIdentType == _int) ||
(AffectIdentType == _float))
{
if(CurrentOp == NULL)
{
strcpy(TempReg, $1);
}
//...
}
}
}
CurrentOp = NULL;
}
//...
push ax
mov ax, 6
mov bx, 10
mul bx
mov cx, ax
pop ax
80
( ة ةCompiler) ا...
آ 2010
//...
int CurrentOp = NULL;
int PrevOp = NULL;
//...
fexpr:REEL {
//...
else if(current_op == _AFFECT)
{
sprintf(strtemp1, "%d", (int)$1);
if(CurrentOp == NULL)
{
strcpy(TempReg, strtemp1);
}
else if(CurrentOp == PLUS)
{
if(PrevOp == MULT)
{
Add_Code("add ax, cx\r\n");
}
Add_Code("add ax, ");
Add_Code(strtemp1);
Add_Code("\r\n");
}
else if(CurrentOp == MULT)
{
if(PrevOp == MULT)
{
Add_Code("push ax\r\n");
Add_Code("mov ax, cx\r\n");
Add_Code("mov bx,");
Add_Code(strtemp1);
Add_Code("\r\n");
Add_Code("mul bx\r\n");
Add_Code("mov cx,ax\r\n");
Add_Code("pop ax\r\n");
}
else
{
Add_Code("push ax\r\n");
Add_Code("mov ax,");
Add_Code(TempReg);
Add_Code("\r\n");
Add_Code("mov bx,");
Add_Code(strtemp1);
81
( ة ةCompiler) ا...
آ 2010
Add_Code("\r\n");
Add_Code("mul bx\r\n");
Add_Code("mov cx,ax\r\n");
Add_Code("pop ax\r\n");
}
}
}
PrevOp = CurrentOp;
CurrentOp = NULL;
}
|ENTIER {
//...
else if(current_op == _AFFECT)
{
sprintf(strtemp1, "%d", (int)$1);
if(CurrentOp == NULL)
{
strcpy(TempReg, strtemp1);
}
else if(CurrentOp == PLUS)
{
if(PrevOp == MULT)
{
Add_Code("add ax, cx\r\n");
}
Add_Code("add ax, ");
Add_Code(strtemp1);
Add_Code("\r\n");
}
else if(CurrentOp == MULT)
{
if(PrevOp == MULT)
{
Add_Code("push ax\r\n");
Add_Code("mov ax, cx\r\n");
Add_Code("mov bx,");
Add_Code(strtemp1);
Add_Code("\r\n");
Add_Code("mul bx\r\n");
Add_Code("mov cx,ax\r\n");
Add_Code("pop ax\r\n");
}
else
{
82
( ة ةCompiler) ا...
آ 2010
Add_Code("push ax\r\n");
Add_Code("mov ax,");
Add_Code(TempReg);
Add_Code("\r\n");
Add_Code("mov bx,");
Add_Code(strtemp1);
Add_Code("\r\n");
Add_Code("mul bx\r\n");
Add_Code("mov cx,ax\r\n");
Add_Code("pop ax\r\n");
}
}
}
PrevOp = CurrentOp;
CurrentOp = NULL;
}
|IDENT {
if(sym_check($1))
{
//...
else if(current_op == _AFFECT)
{
//...
else if((AffectIdentType == _int) ||
(AffectIdentType == _float))
{
if(CurrentOp == NULL)
{
strcpy(TempReg, $1);
}
else if(CurrentOp == PLUS)
{
if(PrevOp == MULT)
{
Add_Code("add ax, cx\r\n");
}
Add_Code("add ax, ");
Add_Code($1);
Add_Code("\r\n");
}
else if(CurrentOp == MULT)
{
if(PrevOp == MULT)
{
83
( ة ةCompiler) ا...
آ 2010
Add_Code("push ax\r\n");
Add_Code("mov ax, cx\r\n");
Add_Code("mov bx,");
Add_Code(strtemp1);
Add_Code("\r\n");
Add_Code("mul bx\r\n");
Add_Code("mov cx,ax\r\n");
Add_Code("pop ax\r\n");
}
else
{
Add_Code("push ax\r\n");
Add_Code("mov ax,");
Add_Code($1);
Add_Code("\r\n");
Add_Code("mov bx,");
Add_Code(strtemp1);
Add_Code("\r\n");
Add_Code("mul bx\r\n");
Add_Code("mov cx,ax\r\n");
Add_Code("pop ax\r\n");
}
}
}
}
}
PrevOp = CurrentOp;
CurrentOp = NULL;
}
//...
د0 +
7 مOQ يRد ا3
إ ا2 وaffect ةO
اVQ د إQ ن أنe ا0
67 دة/
اO ا¢
?Q ,د$O
اa2 إ اAX d! ا67 دة/
ا20ا
د < )ي0u آن
ا67 oO7 d , ا<تd آ67 AX d! إ اtempReg
:NULL !و
ـPrevOp
أي أن,
اVQ/ 6
;
أي
ت ر
84
( ة ةCompiler) ا...
آ 2010
//...
affect:_er IDENT AFFECT {/*...*/}fexpr {
if(sym_check($2))
{
//...
if((sym_type==_int) || (sym_type==_float))
{
if(PrevOp == NULL)
{
Add_Code("add ax,");
Add_Code(TempReg);
Add_Code("\r\n");
}
Add_Code("mov ");
Add_Code($2);
Add_Code(",ax\r\n");
}
//...
}
}
//...
//...
void Dispose_Code()
{
fprintf(fcode, ".MODEL small\r\n.stack 100h\r\n.DATA\r\n");
fprintf(fcode, "_NEWLINE_\tdb\t13,10,\"$\"\r\n");
fprintf(fcode, "_TEN_\tdw\t10\r\n");
fprintf(fcode, "_ZERO_\tequ\t0\r\n");
85
( ة ةCompiler) ا...
آ 2010
20 آTEST.ASM ¢ اd$0 +
aY) وCOMPALG.EXE */2 إدة )
ا
:test.alg ¢ ا67 د/* ا!¡ ا2
رa ا/2
.MODEL small
.stack 100h
.DATA
_NEWLINE_ db 13,10,"$"
_TEN_ dw 10
_ZERO_ equ 0
_N_ db 6 dup(0)
_ENTER_ equ 13
a dw 6 dup(?)
resultat dw 6 dup(?)
_msg0_ db "Entrer a = ","$"
_msg1_ db "a = ","$"
.CODE
86
( ة ةCompiler) ا...
آ 2010
start:
mov ax,@data
mov ds,ax
;lire a
mov cx,0
next0:
mov ah, 00h
int 16h
mov ah, 0Eh
int 10h
cmp al,_ENTER_
je end0
cmp al,'0'
jb end0
cmp al,'9'
ja end0
push ax
mov ax,cx
mul _TEN_
mov cx,ax
pop ax
mov ah,0
sub al,48
add cx,ax
jmp next0
end0:
mov a,cx
87
( ة ةCompiler) ا...
آ 2010
mov resultat,ax
;a <- ...
mov ax,0
add ax,resultat
mov a,ax
mov dx, offset _NEWLINE_
mov ah, 9
int 21h
;ecrire a
mov dx,0
mov ax,a
mov cx,0
lea bx,_N_
next1:
div _TEN_
cmp ax,_ZERO_
jz ax1
jmp cont1
ax1:
cmp dx,0
jz end1
cont1:
add dx,48
mov [bx],dx
inc cx
inc bx
mov dx,0
jmp next1
end1:
dec bx
print1:
mov al,[bx]
dec bx
mov ah,0Eh
int 10h
loop print1
88
( ة ةCompiler) ا...
آ 2010
mov ax,0C07h
int 21h
89
( ة ةCompiler) ا...
آ 2010
ل37 ,ن3) < أنVQده إ< أ/ و إن * أ< و62`@ء اm رةR ا/
أرV0 ا67
ر67 *آ2) أ,& ذن اV, 62^ ا0 /رr7
lك أ`@ء آر0 هtQ و إن آ,&
.+)* و ر ا& وآ3
و ا! م+W ا& و
:o اواR أ ه:)ب إ23ا اR ه67 0* ا/2 آد اd
2
http://www.4shared.com/file/231365377/3f824ec0/exemples.html
http://www.mediafire.com/?zy2eynn1gaj
http://www.snapdrive.net/files/618263/CompilerLesson/exemples.zip
90
( ة ةCompiler) ا...
آ 2010
bا
ا
91