You are on page 1of 91

‫‪2010‬‬

‫ﻛﻴﻒ ﺗﺒﺮﻣﺞ ﻣﺘﺮﺟﻤﺎ‪...‬‬


‫  ا
 )‪(Compiler‬ة ة‬


ااي‬
‫‪khatibe_30@hotmail.fr‬‬

‫ها ا
ب  و   ي  أو ا
ة ‬
‫آ
 ‪   ...‬ا  )‪ (Compiler‬ة ة‬ ‫‪2010‬‬

‫ا & رب ا 


وا‪ $‬ة و ا! م  اث ا
ر  
 إ ‬
‫ا& و  ‪ +-‬و ‪ +,‬و * )!
 آ'
ا‪.‬‬

‫ ا‪  *1‬أن ا‪ 23‬ا


 ‪/ 
01‬ا   ا‪ $‬در ‪ 29 67‬اا;
‪ :‬ر‪ /‬أن‬
‫ا@ = ?

 :‬ر‪7‬ف ا‪  =23‬و< إ  د ا‪ 23‬ب ا‪ = 0‬إ< أن ا‪ =23‬ا‪ 02) 62‬ول ;ع‬
‫ا‪ (La compilation) /2‬و )‪ ,  O‬و ‪  67‬و ‪ *
2‬ا‪ 23‬ا
 ‪OQ‬م ‪ *3‬ه‪R‬ا‬
‫ا‪ 23‬ب ا‪R‬ي ‪Y‬ح @ ‪ V O‬و ‪ VW‬ا‪@U‬ات ا
 ‪*/2  
W
3‬‬
‫)‪ ` (Compilateur‬ص ^‪ *V < ,‬أن )‪3‬ن ‪ V‬ه‪R‬ا ا‪ /) */2‬أآاد ‪ O2 a‬إ‬
‫‪ a‬ا‪ 3 d e‬إ ‪ 2‬ل ا‪ 23‬ب  ا‪) c‬ل اآاد  ‪ a‬إ أ`ى‪ ,‬و ‪  d‬‬
‫أز ا' اا‪ c‬ا‪Y20‬ة ا‪) 62‬ل  ا‪ C a‬إ ‪ PASCAL‬أو إ ‪ JAVA‬و ‪
1‬ه ‪.‬‬

‫ ‪ dV2!0‬آ‪    O 0 2‬ا‪ /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

4 ......................................................(L’analyse lexicale) 6‫ ا‬d‫( ا‬1

6 .....................................................(L’analyse syntaxique) ‫ي‬0‫ ا‬d‫( ا‬2

7 ..................................................(L’analyse sémantique) ‫ي‬0‫ ا‬d‫( ا‬3

7 ...........................................................(Génération de code ) ‫د‬3‫( )


 ا‬4

8 ................................................................d‫@ ت ا‬2 ‫ و‬BISON ‫ و‬LEX .2

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 +Q7 ‫  ف ا ب‬VW a‫ ا‬R‫ ه‬tQ ‫ إذا آ‬,  W ‫ب‬23 c Q 0 
‫د‬3‫ ا‬d ) =
7 ‫  ف ا ب‬VW 
1 c Q‫ ا‬a tQ ‫ أ إذا آ‬,‫ة‬9  c Q‫ا‬

‫ ا‬R‫ ه‬,(code cible) ,‫م  ف ا ب‬VW ‫( إ آد‬texte source) ‫ر‬$‫ا‬
a ‫ر إ‬$ a  ‫ آد‬/2 ‫م‬O  a ‫ب‬23 c Q ‫* ه‬/2‫ ا‬,/2‫)! ا‬
.e‫ا‬

– c Q /) d‫ ا‬-

./2‫ ا‬d‫”ة    ا‬Q 6O0

:L’analyse lexicale (1

!) 62‫ ت و ا‬3‫اج ا‬U2  0‫* ه‬/2‫م ا‬O ,d


2‫ا او  ا‬
:‫ر‬$‫د ا‬3‫ا ا!@  ا‬R‫ <˜ ه‬, ' ,‫@ —  !  اوف‬Q‫ ا‬tokens

for i := 1 to vmax do a := a+i;

4
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

: tokens ‫ ا!!  اـ‬R‫ج ه‬U2!Q

for (mot clé)‫آ زة‬


i (identificateur) ‫ف‬
:= (affectation) ‫ د‬0 ‫إ‬
1 (entier) Ž
,
to (mot clé) ‫آ زة‬
vmax (identificateur) ‫ف‬
do (mot clé) ‫آ زة‬
a (identificateur) ‫ف‬
:= (affectation) ‫ د‬0 ‫إ‬
a (identificateur) ‫ف‬
+ (opérateur arithmétique) 
; ‫
 ر‬
1 (identificateur) ‫ف‬
; (séparateur) d, 7

‫( وه  رة‬table des symboles) ‫ول از‬/ ‫ ء‬0 ‫م‬OQ ‫د‬3‫ ا‬d
)  ‫ة و‬9 
:6)e ‫ن آ‬3 ‫ و‬token d‫ ž آ‬$` d) ‫ —    )آ
 ت‬

Numéro de Token Type de token Type de


symbole variable
1 for mot clé …
2 to mot clé …
2 do mot clé …
3 ; séparateur …
... … … …

‫ر و‬$‫د ا‬3‫ ا‬d


2 (L’analyseur lexicale) 6‫ ا‬d‫م ا‬O O @‫ ا‬RV
d‫ن ا‬7 ,t”< — t0‫@ ت – و إن آ‬$‫ ا‬/) t, ‫ول از –إن‬/ ‫ ء‬0
‫! ـ‬0   ) Ž
, 6 2‫ن ا!@ ا‬7 ^R ‫ و‬tokens ‫)
= اـ‬2 *2V < 6‫ا‬
:analyseur lexical
for for for i := := 10 do for a a;

.l’analyse syntaxique ‫ي أو‬0‫ ا‬d


2‫ دور ا‬6)r 0‫ه‬

5
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

:L’analyse syntaxique (2

*/2   Q 62‫ ا‬a‫ ا‬¢ 2 ¡7‫ ا‬tokens ‫¡ أن ))


= اـ‬O2Q ‫ ا‬R‫ ه‬67
   — @Q‫ا إ‬R‫ن ه‬3 ‫ و‬W  ‫ ص‬U‫ ا‬0‫¡  ا‬O2Q 0Q‫ل أ‬OQ ‫ أن‬:
@2!Q , V
‫ام اـ‬U2  (arbre) ‫ة‬9 ‫ ء‬0 ‫ي‬0‫ ا‬d‫م ا‬O ,grammaire !  ‫ا أو‬O‫ا‬
:6‫ ا‬d‫ه ا‬7 62‫ ا‬tokens

for i := 1 to vmax do a := a+i;

- ‫ي‬0‫ ا‬d
2‫  ا‬/U2!‫  ا‬0‫ة ا‬Y‫ ا‬-

:6 2‫ ا‬d3Y‫  ا‬7 ‫ن‬3) VQ7 0 ‫ا اد‬O‫أ ا‬

prog -> debut inst fin point

inst ->

| ident affectaion expression

|…

expression -> ident

| entier

| reel | …

6
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

:L’analyse sémantique (3

 ‫ه‬0!0 62‫


 ا‬O‫آ ' أن ا‬r2Q (L’analyse sémantique) ‫ي‬0‫ ا‬d
2‫ ء ا‬0l‫أ‬
.‫ا‬R3‫
Ž و ه‬, 
a2 
O
O !— ‫ د‬0 ‫ إذ < = إ‬,
a2‫ع ا‬Q ‹WQ  ‫ن‬3) ‫
ات‬a2‫ا‬

:Génération de code (4

:e‫ ا‬a   — a ‫د‬3 ‫ا ' ل‬R‫ و ه‬:


2‫ ا‬a ‫ أو‬e‫ ا‬a ‫ ج آد‬2Q 0‫م ه‬OQ

var_a A0000 ; les étiquettes des variables


var_i A0001
var_vmax A0002
; le code du programme
mov var_i,1
loop :
mov A0, (var_i) ; comparaison i >= vmax
jge A0, (var_vmax), finFor ; si vrai aller en finFor
mov A0, (var_a) ; calcul de a+i
add A0, A0, (var_i)
mov var_a,A0 ; a := a+i
mov A0, (var_i) ; on incrémente i
add A0, A0, 1
mov var_i, 1
jmp loop ; et on continue la boucle
finFor :
...

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
)‫ أدا‬

Scanner ‫( أو  ! ـ‬Analyseur lexicale) 6 d 


2 ‫م‬O) ‫ أداة‬6‫ ه‬LEX
67 ‫دة‬/‫
 ا‬7‫ ا‬d !‫ ا‬O @ (patterns) =‫ —ا‬LEX d2! ,C a  ‫ب‬23
‫ن‬3) tokens ‫ اـ‬,‫ي‬0‫ ا‬d‫ إ ا‬V ‫* إر‬l  ‫ و‬tokens ‫ إ‬V ) ‫ر و‬$‫د ا‬3‫ا‬
d  +Q7 x 
a2‫  ' ا‬0 scanner ‫ أي أن اـ‬,2 l  ‫ ت د‬7  ‫ رة‬

 و‬a2‫ إ * ا‬+ d  ? ‫ و أ‬IDENT 32 ‫
ات و‬a2 '‫ ا‬token ‫ي اـ‬0‫ ا‬d
 ‫
ه‬1 ‫ و‬+0‫ آ‬+$ $`

) ‫ و‬table des symboles ‫ول از‬/ ‫ إ‬+ `‫م د‬O


.ž $U‫ا‬

? ‫( و ف أ‬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 ‫أ اـ‬

#define IDENT 102

lex.yy.c (YACC d + Y ‫ و ه‬BISON d2!0 ) YACC ‫ و‬LEX  d‫ آ‬0  ^‫ ذ‬


.(parser) ‫ي‬0‫ ا‬d‫( و ا‬scanner) 6‫ ا‬d‫)
= ا‬2‫ و ه  ا‬y.tab.c ‫و‬

8
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

c Q‫  ا‬d$0 y.tab.c ‫ و‬lex.yy.c  d‫* آ‬/2Q C a‫ ت ا‬/2 ‫ ل أ‬2 ‫و‬
. 0
Q V) ... ‫* ا‬/2‫ و ه ا‬bas.exe 6 V0‫ا‬

‫ ذ^؟‬dW ‫ ج  أدوات‬20 ‫ ذا‬

: o‫ اوا‬R‫ا أ ه‬R‫  ه‬TURBO C++ 3.0 d


2 *— <‫أو‬

http://www.4shared.com/file/227985692/6671fd89/TC30.html

http://www.mediafire.com/?iyjt4zoej2m

http://www.snapdrive.net/files/618263/CompilerLesson/TC30.zip

 tQ‫  أ‬,D:\TC\BIN :6)e ‫ آ‬bin ‫ن ! ر ا‬3 µ


 D:\ ‫ص‬O‫ ا‬67 +2
'2 *—
¡ !‫ ا! ر ا‬67 t
' +Q‫ن  أ س أ‬3
‫ح‬Y‫ ا‬3 ‫ ن و‬3 ‫ أي‬67 +2
') 67
.C ‫ أآاد‬/2 D:\TC\BIN\TC.EXE c Q‫ ا‬d2!0 0Q

:o‫ اوا‬R‫  أ ه‬V ,BISON ‫ و‬LEX

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 ‫ ^ ا‬

‫ إ‬D:\Lex_Yacc\Lex\bin ‫ و ا‬D:\Lex_Yacc\Bison\bin ‫  ا‬d‫ ت آ‬2 ¸!Q‫أ‬


+U!0) ‫* أن‬V‫ ا‬,C:\ ‫ص‬O‫ ا‬67 2' ‫وز‬0 ‫ ا‬tQ ‫ا إذا آ‬R‫  ه‬C:\WINDOWS ‫ا! ر‬
D:\Lex_Yacc\Bison\share ‫!¸ ا‬Q‫ أ`
ا أ‬,‫” م‬0  ‫ ص‬U‫ ا‬WINDOWS ‫إ ا‬
‫ ادوات‬02l — ‫ن‬3Q 0‫ ه‬,‫ زك‬V/ 67 C:\share ‫Ž  ^ ا! ر‬$
 C:\ ‫ص‬O‫ إ ا‬+‫آ‬r
.&‫أ  آ ا‬0 ,d ‫ا ز‬

TURBO ‫ و‬BISON ‫ و‬LEX ‫ام‬U2  


a, c Q  ‫م‬O0 */2‫  ا‬67 ‫ اء‬d—
‫ و‬5+5= ' ,‫ي  
ت ! 
  ة @ر‬2 ¢ ‫اءة‬O ‫م‬O µ
 c++
. V ! ‫م‬O ‫ و‬10*1002-20^100*3+3=

‫ أو‬6‫ ا‬d‫  ا‬23 ‫أ‬0 ,D:\Lex_Yacc\exemples ‫ى ا‬2!  d0


.scanner ‫ أو‬L’analyseur lexicale

9
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

 ‫ن‬3 ‫؟‬¢,‫ن ذ^ ا‬3 ¢


‫ آ‬,scanner ‫ ـ‬C ‫ ه آد‬0 
 0
 W,‫ و‬LEX ‫م ـ‬O0
:6 2‫ ا‬d3Y‫ا‬

... - ‫ ه‬02‫ ت –إذا ا‬W )...


%%
... ‫ —ا‬...
%%
... - ‫ ه‬02‫
 –إذا ا‬7 ‫ دوال‬...

.C ‫ ¿ أآاد‬+ ‫ ` ص‬Q V7 ‫ا‬O‫ ت و ا‬W 2‫ أ ا‬,C a ‫
  رة  آد‬W‫اوال ا‬

:6 2‫د ا‬3‫= ا‬2‫ة واآ‬3W‫Ž ا‬27‫إ‬

%{
#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 ¢ 0 2 ‫ أ ا‬,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 

blanc [ \t]+ '‫اغ أو أآ‬7 ,‫ ت‬1‫ا‬W‫ ا‬d‫آ‬


chiffre [0-9] 9 ‫ إ‬0  ‫ ااد‬d‫آ‬
entier {chiffre}+ '‫ !  د وا أو أآ‬

: V
Q  ‫ا= و‬O‫ ء ا‬YQu V2!Q 62‫ول وف ا‬/ ‫ا‬R‫ه‬

. \n ‫ ء‬0'2  ‫ اف‬d‫آ‬
\n  / @
* V O !‫ أو أآ'  ا رة ا‬U!Q W,

10
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

+ V O !‫ واة أو أآ'  ا رة ا‬U!Q


? V O !‫ء  ا رة ا‬69 < ‫ واة أو‬U!Q
^ @!‫ا  ا‬
$ @!‫  ا‬VQ
a|b b ‫ أو‬a
(ab)+ ab !!‫ أو أآ'  ا‬U!Q
"a+b"
7 a+b !!‫ا‬
[] z ‫ إ‬a  ‫ اف‬d‫ آ‬60) [a-z] ,‫  اف‬Á7

:‫ا اول‬R‫ <˜ ه‬0—‫وآ' ل  ¿ ا‬

‫رة‬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

‫ —اءة‬67 tO) ‫?Ž آ‬2


‫ أآ' و; و‬O ‫ة‬3W‫ ا‬67 +22‫ي آ‬R‫د ا‬3‫Ž ا‬$ ‫ا‬RV
:Ž$
 ¡ !‫د ا‬3‫د إ ا‬3‫ا ا‬R‫ ه‬¢;‫ أ‬,‫ ب‬23‫ا ا‬R‫ه‬

}%
#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‫ا‬

:KV‫{ إ‬entier} ‫ت‬$‫ إذا و‬,


Q '‫ ة ا‬O‫ا‬
yylval = atoi(yytext);
return(NOMBRE);

Ž
, *—‫ ر‬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

‫ إذ‬,;‫ ووا‬V ‫ — ة‬,(PLUS :


 2‫ ا‬token ‫ )أ اـ‬KV‫ إ‬+ ‫ت‬$‫ إذا و‬,' '‫ ة ا‬O‫ا‬
,‫ا‬R‫ء  ه‬69 ‫ أو‬V2
— ‫ ج  إ‬2Q ‫ و‬PLUS Q/‫ و‬0Q‫ أ‬parser ‫ل ـ‬O  6W230
.
 2‫ ة ا‬O‫ه= إ ا‬RQ ‫ و‬token ‫
 اـ‬Q oO7

.(‫ء‬69 <) KV‫ ( إ‬/ @ ) \n ‫ت‬$‫ إذا و‬,‫`


ة‬u‫ ة ا‬O‫ا‬

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 ‫ة اوس و‬R7 Q Ž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@` d‫ ن آ‬3 ‫ ر   `@ ء و‬LEX ^ ‫د أ`@ ء


ض‬/‫   و‬67 ,‫ أ`@ ء‬/ <
‫ي‬R‫ وا‬D:\Lex_Yacc\exemples ‫ ا! ر‬67 lex.yy.c ¢‫
 ا‬2 2 LEX ‫ — م‬O ,+W,‫و‬
.L’analyseur lexicale ‫ أو‬scanner ‫ ـ‬C ‫ آد‬d'

.d30 ,6 V0‫ ا‬c Q‫ اول  ا‬¢$0‫ذ^ ا‬

:(grammaire) ‫ا‬O‫د ا‬0 YACC ¢,‫  و‬2‫أ آ‬Q ‫ أن‬d—

Input -> Input Line | £


Line -> FIN | Exp FIN
Exp -> NOMBRE
| Exp PLUS Exp
| Exp MOIN Exp
| Exp MULT Exp
| Exp DIVS Exp
| MOIN Exp
| Exp PUIS Exp
| PARG Exp PARD

‫ا ؟؟؟‬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‫ا‬

:6 2‫د ا‬3‫= ا‬2‫ة و اآ‬3W‫Ž ا‬27‫ إ‬,‫د‬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

V/ 2Q ¢ ‫  ) ر‬2‫ ه آ‬+ Q‫ أول  أ‬,parser ‫ اـ‬YACC +0 


‫ي‬R‫ ا‬¢,‫  ا‬2‫ آ‬Q‫أ‬
%{
2 ‫ وه 
ا‬C a  ‫ب‬23 *!— ,¢ ‫ ر‬2‫ ك —!
 ا‬0‫ ه‬,‫ا‬O‫  ا‬2‫ ء آ‬0l‫أ‬
¢‫ ا‬+!WQ V7 expl2.c ¢‫! ءل  ا‬2) t0‫ إذا آ‬,C a  ‫ب‬23‫د ا‬3‫ وا;Ž ا‬,%} ‫و‬
. 
7 + ‫
 ا‬a0 oO7 ,¡ !‫ ا‬scanner ‫ آد اـ‬d ‫ي‬R‫ ا‬lex.yy.c
Ž $2  0— %token ‫ ازة‬3‫ ل ا‬2  ,‫ ` ص‬¢,‫د ه و‬3‫  ا‬6Q '‫!* ا‬O‫ا‬
:tokens 9 0  ‫ و‬,parser ‫ و اـ‬scanner‫  اـ‬d‫ آ‬V2!
62‫ ا‬tokens ‫ اـ‬
. NOMBRE , PLUS, MOIN, MULT, DIVS, PUIS, PARG, PARD, FIN
:‫ي ه أ—ى  ا‬R‫! أ—ى  ا?ب ا‬O 7 ,‫اء 
ت ا! ب‬/‫ ء إ‬0l‫ ك أو  أ‬0‫ه‬
*l 5*6 =!Q 0Q7 5+5*6 ‫ ! ب‬0 ' ,‫ أ—ى أو  ا! ب‬3 $—‫ وأ‬,‫و ا@ح‬
: ‫ ا!@ر‬0W;‫ا أ‬RV‫ و‬,5 ‫
 اد‬20‫ إ ا‬¢
?Q

14
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

%left PLUS MOIN ‫ ا


ت )ى  ا
! ر‬,  ‫ و ا@ح‬:  ‫ أو‬d—‫أ‬
%left MULT DIVS ‫ ء ا! ب‬0l‫أ  
! ر أ‬Q ,‫! و ا?ب أ—ى‬O‫ا‬
%left NEG +O!   ‫ أ—ى‬6W0‫ا‬
%right PUIS

  ‫أ‬Q 3‫ و‬,+O   ‫ إ —ة أ—ى‬:7‫ا‬

‫¡  ))
= اـ‬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);}
;

Exp :NOMBRE {$$=$1;}


|Exp PLUS Exp {$$=$1+$3;}
|Exp MOIN Exp {$$=$1-$3;}
|Exp MULT Exp {$$=$1*$3;}
|Exp DIVS Exp {$$=$1/$3;}
|MOIN Exp %prec NEG {$$=-$2;}
|Exp PUIS Exp {$$=pow($1,$3);}
|PARG Exp PARD {$$=$2;}
%%

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 V 2 ‫ إ‬Q‫ إذا أرد‬FIN 
— ‫ أ‬,$1 ‫ ـ‬7 6‫ وه‬Exp 
— 9 Y‫=  ا‬230
.‫ا‬R3‫ وه‬$2
Q3‫ د —
* أو —اءة —
* از ا‬0 u ‫ و‬,! ‫ أ‬¢$Q ‫ أ  و‬¢$Q ‫ ك‬0‫ — ة ه‬d‫ آ‬67
:$x d2!Q 0Q7 ‫ ة‬O

Exp -> Exp PLUS Exp


$$ $1 $2 $3

L’analyse )‫ي‬0‫ ا‬d


2 : ) ‫ ه‬$$ ‫ أو‬$x ‫ام‬U2  ‫ ل —
* از‬2 ‫ ا‬
.*
O  *2V < L’analyseur syntaxique ‫ي أو‬0‫ ا‬d 7 (sémantique

:‫
 `
رات‬Q l ‫ أ‬0
@) Exp ,Exp ‫ ب‬, U‫ ة ا' ' ا‬O‫ إ ا‬dO20Q
‫ ل‬2  Exp ‫ —
 ا—* إ‬6@Q ,o
!  7 Exp -> NOMBRE   67 •
.‫ آ أذآ‬Action sémantique ‫ اآ ا`
ةـ‬R‫ و )! ه‬,$$=$1 ;

‫ ة‬O‫  ! ر ا‬62‫ ا‬Exp , ? ‫  !


^ أ‬7 Exp -> Exp PLUS Exp   67 •
, $$=$1+$2 ‫ ل‬2  ‫ا‬R‫ ه‬dWQ ‫ ة و‬O‫  
ا‬62‫ ا‬Exp ‫ —
 ع‬R`r)
l ‫ا ا‬O‫ ا‬6—  !0  ‫ء‬6Y‫‹ ا‬WQ ‫ا‬R3‫وه‬

‫ ة‬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 0Q7 -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);}
;

Exp :NOMBRE {$$=$1;}


|Exp PLUS Exp {$$=$1+$3;}
|Exp MOIN Exp {$$=$1-$3;}
|Exp MULT Exp {$$=$1*$3;}
|Exp DIVS Exp {$$=$1/$3;}
|MOIN Exp %prec NEG {$$=-$2;}
|Exp PUIS Exp {$$=pow($1,$3);}
|PARG Exp PARD {$$=$2;}
%%
int yyerror (char *s)
{
printf("%s\n",s);
}
int yywrap(){
return 1;
}
main()
{
clrscr();
if((yyin=fopen("d:\\lex_yacc\\exemples\\input.txt","r"))==NULL)

17
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

{
printf("input.txt not found !\n");
getch();
return;
}
yyparse();
getchar();
}

‫ أو‬r@` ‫ و—ع‬0 parser ‫  ف اـ‬2!) 62‫ ا‬yyerror()


2‫! م اا‬/‫ أ‬¢ 2 0—
‫ اا‬,‫ا ادة‬O‫ ا‬: scanner ‫ ا   ف اـ‬tokens ‫م )@ ¡ ))
= اـ‬
‫ ذ ا
ت‬WQ 0 R‫ ه‬02  67‫ ذ ا` ت و‬WQ 0 2!)‫ و‬yywrap() 6‫
 ه‬Q '‫ا‬
. V ! ‫ااد‬
‫ ؟‬V ‫  ذا‬,main() ‫اا‬
‫ ل‬2  - V ! ‫ي  ا
ت ااد‬2
‫ي‬R‫ا‬- input.txt ¢‫Ž ا‬2W ‫م‬OQ <‫أو‬

 ف‬a2 ‫ و ه‬yyin 
a2‫ إ ا‬9Í‫ ذ^ ا‬0!Q ,¢ 9Í 0
‫ )
 إ‬62‫ ا‬fopen()
¢‫Ž ا‬27 ‫ ء‬0l‫ أ‬r@` ‫د‬/‫ و‬t  67 ‫ و‬,‫ ا` ت‬¢ d' ‫ و‬YACC ‫  ف‬O!
.¢—2Q ‫ و‬r@`  ‫ض ر‬Q input.txt
 0W,‫ي و‬R‫ ا‬d‫ ا‬d3 ‫م‬O)‫ و‬parser‫ اـ‬0‫ ه‬d') 62‫ وا‬yyparse() ‫ اا‬62!Q ^‫ ذ‬
. O
,D:\Lex_Yacc\exemples\expy2.y ¢‫ة إ ا‬3W‫ ا‬67 ¢,‫   و‬02‫˜  آ‬W‫ن أ‬e‫ا‬
‫ة‬R7 Q 67 ‫  أوا‬2‫ ;  آ‬,BISON d2!0 LEX V 02 ‫ ا‬62‫ ا‬O @‫‹ ا‬W0‫و‬
‫ا‬ d`‫دا‬ BISON_2.bat *   / 67‫د‬ ¢ ÎYQ‫أ‬ ‫اوس‬
:6  + =2‫ واآ‬D:\Lex_Yacc\exemples\
BISON -d expy2.y
Pause
:
20‫ ا‬R‫  ه‬d$2 ‫ ا  و‬67‫ ا‬¢‫ آ
^  ا‬d‫دو‬

‫ ه‬expy2.tab.c ¢‫ ا‬,expy2.tab.h ‫ و‬expy2.tab.c ‫


و ه‬W BISON 
? ‫أ‬
,TURBO C++. ‫ام‬U2  +/20 ‫ي‬R‫ ا‬¢‫ ه ا‬6 2 ‫ و‬main() ‫ اا‬+ ‫ي‬R‫ ا‬¢‫ا‬
d`‫ دا‬+ 2 ‫ ا‬d/‫  أ‬tokens ‫ ت اـ‬W )  ‫ي‬2 V7 expy2.tab.h ¢‫أ ا‬

18
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

¢ ‫ ل‬2 < @!‫ا ا‬R‫ ك ه‬0‫ ه‬expl2.l Q 3!‫ ا‬¢,‫ و‬¢ 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‫وا‬

: 0  expy2.y  ‫ ا ر‬¢,‫ و‬¢ !0  ‫ء‬6Y‫‹ ا‬WQ


%{
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "d:\lex_yacc\exemples\expl2.c"
%}

a0 ,‫ء‬6Y‫‹ ا‬WQ !!! expl2.c ‹
‫ و‬lex.yy.c + ‫ ا‬LEX  c) 0‫ ا‬Q 3!‫ ا‬¢ ? ‫أ‬
: ‫ا‬2 3
‫ و‬rename.bat *   / 67‫ د‬¢ ¢;‫ا أ‬R‫ ه‬dW ‫ و‬oO7 ‫ا  ء‬

ren lex.yy.c expl2.c


ren expy2.tab.c expy2.c
ren expy2.tab.h expy2.h

‫ و‬expy2.tab.c ‫ و‬lex.yy.c ‫ ت‬W‫


 أ  ء ا‬a22 rename.bat 67‫ ا‬¢‫ آ
^  ا‬d‫دو‬
.=
)2‫  ا‬expy2.h ‫ و‬expy2.c ‫ و‬expl2.c ‫ إ‬expy2.tab.h
 O‫د ا‬3‫ ت ا‬W ‫ف‬RQ 0Q7 expy2.y ‫ أو‬expl2.l ¢‫ ا‬¢,‫
  و‬aQ ‫ ة‬d‫ آ‬67 ‫إذا و‬
‫ و‬BISON_2.bat ‫ و‬FLEX_2.bat  d‫ آ‬R
W0) 
Q ‫( و‬expy2.h ‫ و‬expy2.c ‫ و‬expl2.c)
.rename.bat
 )‫ و‬TURBO C 4.5 ‫ ل‬2  V/2Q  ‫ و ا ر‬Q 3!‫  آد رس ا‬0$ 
 ^‫ ذ‬dWQ 0Q7 d‫ آ‬67 TC Ž27 =02Q 6‫ وآ‬D:\TC\BIN\TC.EXE c Q‫ ل ا‬2 
*/2 ‫ي‬R‫ا ا ا‬R‫ ه‬+
7 =2‫ واآ‬compile.bat *   / 67‫ د‬¢ ÎYQ‫ أ‬,‫ @ اوا‬
:‫د‬3‫ا‬

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 ‫ و‬6 V0‫ ا‬c Q‫ وه ا‬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  ‫ ا‬0 Q ‫ن‬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

*—‫ اد و ر‬r@U   ‫ض ر‬Q ¢


‫ى آ‬0 O< ,:‫ ا!@ اا‬67 r@U‫
 ا‬2Q V”) ‫و‬
.&‫ ء ا‬9 ‫ إن‬r@U‫ ا‬+
7 :—‫ي و‬R‫ا!@ ا‬

: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‫أرد‬

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 | IDENT AFFECT sexpr
read -> IDENT | IDENT VER read
write -> writed_expr | writed_expr VER write
writed_expr -> NEW_LINE | fexpr | sexpr
fexpr -> REEL
|ENTIER
|IDENT
|fexpr PLUS fexpr
|fexpr MOIN fexpr
|fexpr MULT fexpr

22
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

|fexpr DIVS fexpr


|MOIN fexpr
|fexpr PUIS fexpr
|PARG fexpr PARD
sexpr -> CHAINE | CARA

 ‫ ا ر‬V  62‫ ا‬tokens ‫ اـ‬6‫


ة ه‬3‫ از  وف ا‬,‫ء‬69 ‫ ا‬60 (£) ‫آ أن ا‬R)
.(symboles terminaux)
 VQ ‫ رز‬6‫^ ه‬R L’analyseur lexicale ‫أو‬
‫ ا' ل‬67 ‫ ه‬0U2 ‫ ا‬62‫ ت ا‬W‫ ا‬+0 ‫ف‬R‫ وا‬D:\Lex_Yacc\exemples ‫ إ ا‬
:Q 3!‫ ا‬¢,‫ و‬d' ‫ي‬R‫د ا‬3‫  ا‬2‫أ آ‬Q ‫ة و‬3W‫Ž ا‬27‫ ا‬,&‫أ  آ ا‬0 ‫ا! ¡ و‬

%{
#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}
%%

‫  و‬lcompalg.l *   ‫ ا‬¢‫ `ن ا‬,Q 3!‫ ا‬¢,‫ و‬0


VQ‫ن أ‬e‫ ا‬, V2 ! V9‫ أ‬
*  ‫ ا‬/
7‫ د‬W ¢;‫ و أ ? أ‬,D:\Lex_Yacc\exemples ‫ ا‬d`‫دا دا‬
: ‫ ا‬+ =2‫ و اآ‬FLEX_2.bat
FLEX lcompalg.l

.
20‫ آ‬lex.yy.c ¢‫  ا‬d$) FLEX_2.bat  ^
‫ آ‬d‫دو‬

Ž27‫ ا‬,L’analyseur syntaxique ‫ وه ا ر  أو‬c Q‫  ا‬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

%left PLUS MOIN


%left MULT DIVS
%right PUIS
%left NEG
%start prog

07 
 2‫ @ر ا‬:‫ ار‬67 ,‫ ا ز‬tokens ‫ Ž  اـ‬$2  0— ‫ @ر او‬:!2‫ ا‬67
...‫ ;ح‬,‫@ ق‬Q<‫@ ا‬OQ d') 62‫ ة ا‬O‫ ا‬+
7 
`‫ ا!@ ا‬,
 ! 
 d‫أو  آ‬

:a‫ ا‬R‫ ه‬67 2‫ا ا‬O‫ Ž  ا‬$2‫ ا‬6‫ 


 ه‬2‫@ة ا‬U‫ا‬

%%
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

| IDENT AFFECT sexpr


;
read:IDENT
|IDENT VER read
;
write:writed_expr
|writed_expr VER write
;
writed_expr:NEW_LINE
|fexpr
|sexpr
;
fexpr:REEL
|ENTIER
|IDENT
|fexpr PLUS fexpr
|fexpr MOIN fexpr
|fexpr MULT fexpr
|fexpr DIVS fexpr
|MOIN fexpr %prec NEG
|fexpr PUIS fexpr
|PARG fexpr PARD
;
sexpr:CHAINE
|CARA
;
%%

 0OW)‫ي ا‬R‫ ا‬grammaire ‫ اـ‬+!WQ ‫د ا! ¡ ه‬3‫ ا‬, 0‫   ه‬O) ¡OQ Q
 ‫ ه‬+Q BISON  ‫ أ¡ ام‬3 60) < ,
— 
a) +39 ‫ إ< أن‬O + 2 ‫ا‬
. grammaire ‫ ـ‬d3Y‫ا ا‬R‫   ه‬

 ‫ و ا ر‬Q 3!‫ ز ا‬Q‫د إ‬$ Q


  0Q ‫ا‬R‫ وه‬Les actions sémantiques d2!Q *
.+Q‫ أوا‬d3 ,oO7 L’analyseur syntaxique ‫ و‬L’analyseur lexicale ‫ أو‬oO7

µ '‫@ ا‬Y‫ ا‬67 ‫


ه‬1 ‫ Ž  اا ا
!
 و‬$2‫ ا‬6‫د ا زم ه‬3‫@ ا —
  ا‬O‫ا‬
:‫ة‬3W‫د إ ا‬3‫ا ا‬R‫ ه‬¢;‫ أ‬, ‫ ا ر‬¢,‫ و‬¢ 

int yyerror (char *s)


{
errors++;

27
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

printf("Erreur :syntaxe erreur: ligne %d\n",line);


}
int yywrap(){return 1;}
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;
}
yyparse();
if(!errors) printf("Ok");
getch();
return;
}

‫ ا   ا' ل ا! ¡؟‬


,r@U‫ ر  ا‬Q ‫ض‬Q 0‫ وه‬yyerror() ‫ ء اا‬2   ‫م ا ر‬O  r@` ‫ و—ع‬0
— ‫ و‬lcompalg.c ¢‫ ا‬67 ‫
 ف‬a2‫ا ا‬R‫ وه‬line *—‫ ه ذو ا‬r@U‫ ا‬+
7 :—‫ي و‬R‫ا!@ ا‬
.errors 
a2‫   —
 ا‬Q r@` d‫ و—ع آ‬0 ‫ و‬,lcompalg.l 67 +
 0,
‫ي‬R‫ ا‬test.alg ¢‫Ž ا‬2W V
7 ‫م‬O07 main() ‫ أ اا‬,6‫ آ ه‬O) yywrap() ‫اا‬
tQ ‫ إذا آ‬Ok  ‫ض ا‬0 ¢‫ ا‬d
) ‫ و‬,+2/)  Q ‫ي‬R‫ ا‬Algorithme ‫ ي اـ‬
.W$  ‫ ! و‬errors 
a2‫—
 ا‬

*  ‫ ا‬/
7‫ د‬W ¢;‫ و أ‬compalg.y *  ¢ 67 ¡ !‫د ا‬3‫ن `ن ا‬e‫ا‬
:‫ا ا‬R‫ ه‬+
7 =2‫ و أآ‬BISON_2.bat
BISON -d compalg.y

d— ,compalg.tab.h ‫ و‬compalg.tab.c ,


0l‫
ا‬W  d$2 BISON_2.bat ¢‫ ا‬RWQ
‫ و‬lex.yy.c ‫ ت‬W‫
 أ  ء ا‬a0 BISON ‫ و‬LEX ‫د ا  ف‬3‫* ا‬/2Q ‫أن‬
=
)2‫  ا‬compalg.h ‫ و‬compalg.c ‫ و‬lcompalg.c ‫ إ‬compalg.tab.h ‫ و‬compalg.tab.c
:‫ اوا‬R‫ ل ه‬2  ‫ا‬R‫ ا  ء ا ة – وه‬6 ‫ )وق‬oO7 ,‫ل  ذا‬r!) < –

ren lex.yy.c lcompalg.c


ren compalg.tab.c compalg.c
ren compalg.tab.h compalg.h

28
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

oO7 ‫ه‬RW0Q ‫ أوا دوس و‬+/ Ž2WQ  ‫ه‬R


W0)  Q 0‫ و‬DOS ‫ أوا‬6‫ ه‬O !‫اوا ا‬
V2Q‫ و ا‬+
 ^
‫ آ‬d‫ دو‬,O !‫ اوا ا‬+
7 =23Q ‫ و‬rename.bat *  67‫ د‬¢ ¢
?Q
.‫ا‬

‫ و‬compile.bat *  67‫ د‬¢ ¢;‫ أ‬,6 V0‫د ا‬3‫ ا‬/) 


 !0  ‫ء‬6Y‫‹ ا‬WQ
:‫ا ا‬R‫ ه‬+
7 =2‫اآ‬
D:\TC\BIN\TC.EXE D:\Lex_Yacc\exemples\compalg.c /b
pause
‫د‬3‫ ا‬/) ‫ و‬TURBO C++ Ž27 ‫ أآ‬Qr7 ‫ ل @ اوا‬2  C ‫ آد‬/2 0— O
.‫ ا‬V2Q‫ وا‬compile.bat  ^
‫ آ‬d‫ دو‬,O @‫^ ا‬2

‫ و‬,COMPALG.EXE ‫ وه‬6 V0‫ ا‬c Q‫  ا‬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‫ ا‬c Q 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‫ا‬

.( 0‫  ا˜ ه‬2Q 0Qr‫ 


= )وآ‬...!!! r@U‫ ا‬+
7 :—‫ي و‬R‫ !!! وا!@ ا‬r@U‫ ا‬¢Y2‫ اآ‬O

‫ و‬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.

c Q 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 @!‫ا‬
c Q‫ ا‬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

+Q‫ أ‬+0 0— O ‫ ؟‬YACC ‫ و‬LEX ‫ ل‬2 ‫


 ا‬W
3 ‫  ا' ل اول‬yylval 
a2‫آ ا‬R) d‫ه‬

—  ) :
@2!Q 0Q7 
, —‫ ' ر‬/‫ إذا و‬LEX ‫ إذ أن‬YACC ‫ و‬LEX
 d,‫ و‬O
d') 62‫
 ا‬7‫ ج إ )  ا!! ا‬20 0‫ ه‬Q ,token ‫ اـ‬: YACC ‫
 ـ‬a2‫ذ^ ا‬
=! ‫ و‬LEX
  , V d 2‫
ات و ا‬a2‫ —  ا‬67 V0 U)  32Q 2 
a2‫ا‬
: @!‫ا ا‬R‫ ه‬67 ‫  و ) ا‬02‫ي آ‬R‫ ا‬¢,‫ا‬
{ident} return(IDENT);

 +!WQ 
a2‫ر ا‬0 ,IDENT 6‫
 و ه‬a2‫ ا‬d') 62‫ ا‬token ‫ إ< اـ‬YACC ‫< ر ـ‬
67 *32‫ ا‬0Q 3  ,*V < ! char[] ‹
‫ و‬int +Q 3 ‫ و‬yylval ‫
 از‬a2‫ ¡ ا‬
.+Q

67 ‫ ه‬d‫ ا‬,‫اع‬Q‫ ة أ‬YACC ‫ر ـ‬0 07 


1 ‫ أو‬char ‫ إ‬int  yylval ‫ع‬Q 
aQ 
‫ق‬W‫ ا‬3‫ و‬struct ‫  ـ‬V
9 6V7 V7) 3) * ‫ و إذا‬, V7) tQ‫ أآ
 أ‬,union ‫ام‬U2 ‫ا‬
:union ‫ اـ‬R‫ ' <˜ ه‬,‫اآة‬R‫‹ ا!   ا‬WQ daY) union ‫ ت اـ‬Q3 ‫ أن‬67 3
typedef union{
char Tstr[128];
int Tint;
float Tfloat;
} new_type;
new_type t;

‫ ن‬:
?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
//…

.  +”W‫ و أ‬¢‫¡ ا‬1‫ أ‬,‫د‬3‫ ا‬67  ‫ ه ا‬d?‫ اء ا‬

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>

typedef struct sym_node_


{
char name[56];
struct sym_node *next;
}sym_node;

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

sym_node *put_sym(char *sym_name)


{
sym_node *ptr;
ptr=(sym_node*)malloc(sizeof(sym_node));
strcpy(ptr->name,sym_name);
ptr->next=(sym_node*)sym_table;
sym_table=ptr;
return ptr;
}

sym_node *get_sym(char *sym_name)


{
sym_node *ptr;
for(ptr=sym_table;ptr!=NULL;ptr=(sym_node*)ptr->next)
if(!strcmp(ptr->name,sym_name))return ptr;
return NULL;
}

¢,‫ و‬¢ ‫ إ‬0‫ و‬SYMB_TAB.H ¢‫


ات ا‬a) ˜W‫¡ و أ‬1‫؟ أ‬+2!Q ¢
‫ آ‬,Ž;‫آد وا‬
:‫ ¿ اآاد‬7 ; ‫أ‬0‫ و‬+27‫ ا‬,compalg.y  ‫ا ر‬
%{
#include<conio.h>
#include<math.h>
#include "d:\lex_yacc\exemples\lcompalg.c"
#include "d:\lex_yacc\exemples\SYMB_TAB.H"
int errors=0;
void setup_sym(char* sym_name)
{
sym_node *sym;
sym=get_sym(sym_name);
if(sym==NULL) put_sym(sym_name);
else
{
errors++;
printf("Erreur: %s est deja definie : ligne
%d.\n",sym_name,line);}
}

int sym_check(char* sym_name)


{
if(get_sym(sym_name)==NULL)
{
errors++;

34
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

printf("Erreur: %s est inconnu : ligne %d.\n",sym_name,line);


return 0;
}
return 1;
}
%}
//…

‫ ل اوال‬2  ‫ا‬R‫


ات و ه‬a2‫ول ا‬/ d`‫
 دا‬a2 t
'2 ‫م‬O) setup_sym ‫ اا‬,@
!
‫ ا‬/ ‫
ا‬a2 ¢
?Q ‫ أن‬d— ,d:\lex_yacc\exemples\SYMB_TAB.H ¢‫ ا‬d`‫ دا‬7‫ا‬
get_sym ‫ إذا أ دة اا‬,get_sym ‫ ا @ اا‬d—  ‫ * ? ف‬+Q‫آ  أ‬r2Q ‫ = أن‬
:—‫ أي @ و‬67 ‫ و‬d—  ‫
 ف‬a2‫
 أن ا‬W) r@`  ‫ض ر‬Q 0Q7 NULL 
1 
—
‫ و‬Q 3!‫ ا‬¢,‫ و‬d ‫ي‬R‫ ا‬lcompalg.l ¢‫ ا‬d`‫ دا‬d—   07 line 
a2‫ ا‬,r@U‫ا‬
get_sym ‫ أ إذا أ دت اا‬,LEX ‫ ا  ف‬lcompalg.c ¢‫ ا‬67 ‫ ه ف‬6 2 
.‫
 ا  وا! م‬a2‫ ا‬t'Q 0Q7 NULL 
O‫ا‬

t' 2‫  را‬d39  V @‫


 ا‬a2‫آ أن ا‬r20 V
2!07 sym_check ‫أ اا‬
* ‫ إذا‬,d—  V ‫ح‬$ 
1 ‫
ات‬a2 ‫ ل‬2 ‫= ا‬02 ‫ا‬R‫ و ه‬,‫
ات‬a2‫ —  ا‬67 O!
.r@`  ‫ض ر‬Q 0Q7 d—  2' 
a2‫ ا‬3

R‫ <˜ ه‬,‫د‬3‫ ا‬d


) ‫ ء‬0l‫
ا أ‬a2 Q/‫ آ و‬V
2!Q ,‫ اوال‬62!Q ‫ى أ‬0 ‫ن‬e‫ا‬
:compalg.y ¢‫ ت  ا‬7 ;u‫ا‬
//...
%token <Tstr> IDENT
//...

$x +Q‫ أي أ‬,Tstr 6‫ وه‬,IDENT ‫


ات‬a2  ‫ ص‬U‫ ا‬token ‫ اـ‬: 6)r2 62‫
 ا‬O‫ع ا‬Q Q‫د‬
:d,‫ا‬0 ,
7 !  ‫  رة‬token ‫ ـ‬O7‫اا‬
//...
declaration:
|decl_type ident POINT_VER declaration
;
//...
ident:IDENT {setup_sym($1);}
|IDENT VER ident {setup_sym($1);}
;
//...

,‫
ات‬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

‫ — ة‬d‫ آ‬67 ‫ إذا و‬,2 V 2 ‫ أو ا‬V *


— ‫ د‬0 ‫ إ‬d— ‫
ات‬a2‫¡  ا‬O2‫ن ا‬e‫ ا‬O
 ¡O2 sym_check() ‫ ء اا‬2  ‫م‬OQ (IDENT) 
a2  , U‫ ا‬token ‫ اـ‬V
7 Q
:‫ا‬R‫* ه‬2 ‫ <˜ أ‬,
a2‫ا‬
//...
affect:IDENT AFFECT fexpr {sym_check($1);}
|IDENT AFFECT sexpr {sym_check($1);}
;
read:IDENT {sym_check($1);}
|IDENT VER read {sym_check($1);}
;
fexpr:REEL
|ENTIER
|IDENT {sym_check($1);}
|fexpr PLUS fexpr
|fexpr MOIN fexpr
|fexpr MULT fexpr
|fexpr DIVS fexpr
|MOIN fexpr %prec NEG
|fexpr PUIS fexpr
|PARG fexpr PARD
;
//...

V @ sym_check ‫ اا‬V ` 62!Q des actions sémantiques 0W;‫ أ‬,Ž;‫ا وا‬
.2‫  را‬d39  
a2‫ا * ا‬

‫ و‬compalg.c)  O‫ ت ا‬W‫ف ا‬R‫ ا‬, 0 


2Q ‫ى‬0 compalg.y ¢‫ى ا‬2 ‫`ن‬

7‫ ت ا‬W‫ ا‬d
aY2 ‫ا‬R‫* ا  و ه‬/2‫
 آد ا‬2 *— ‫( و‬lcompalg.c ‫ و‬compalg.h
c Q‫  ا‬d$20 compile.bat *l rename.bat *l FLEX_2.bat *l BISON_2.bat
.Y
‫ ا‬$
`a 
 
‫ ا‬R‫ ه‬6!0 ,6 V0‫ ا‬COMPALG.EXE

36
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

¢‫ى ا‬2!  ‫دة‬/‫ ا`@ ء ا‬¢Y23 ‫ و‬d


 COMPALG.EXE */2‫ ا‬da9
:‫رة ا  ا`@ ء‬, R‫ و ه‬test.alg

 Ž $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

¢‫Ž ا‬27‫ إ‬,‫


ات‬a2‫ول ا‬/ 
0  
a0 0Q7 ‫ ا‬$7 ‫ن‬e‫  ا‬0V ‫
ات‬a2‫ع ا‬Q ‫ أن‬
:‫
 إ‬a2‫ ا‬d') 62‫آ
 ا‬2‫
 ا‬1‫ و‬SYMB_TAB.H
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define _int 1
#define _float 2
#define _str 3
#define _chr 4
typedef struct sym_node_
{
char name[56];
int type;
struct sym_node *next;
}sym_node;
//...

‫ و‬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 ,‫

ات‬a)  + 0—  Ž;‫وا‬


:6‫
 اد و ه‬a2‫ع ا‬Q 0 
) ‫ ة‬/ ‫أ ? دا‬
int get_sym_type(char *sym_name)
{
sym_node *ptr;
for(ptr=sym_table;ptr!=NULL;ptr=(sym_node*)ptr->next)
if(!strcmp(ptr->name,sym_name)) return ptr->type;
return 0;
}

.compalg.y ¢‫ إ ا‬dO200 ‫ و‬SYMB_TAB.H ¢‫¡ ا‬1‫`ن و أ‬

‫ع‬Q V
‫ إ‬0W;‫ إذ أ‬SYMB_TAB.H ¢‫ ا‬67 ‫دة‬/‫ ا‬put_sym ‫ اا‬67 Q
1 0Q‫ أ‬
:Ž$2 compalg.y 67 ‫دة‬/‫ ا‬setup_sym ‫ اا‬67 

a2‫ = ا‬+Q7 
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

 O< 32Q 2 + ‫ إ ا‬7 ;‫ إ‬+Q ‫ن‬UQ ‫  = أن‬/ 


a2  Ž $2‫ ا‬0
‫ن‬UQ current_type  / 
a2 ¢
?0 ,‫ د‬0 u‫اء 
ت ا‬/‫ إ‬0l‫اع أ‬Q‫¡ ا‬7‫¡  )ا‬O2‫ا‬
:‫
ات‬a2‫ Ž  ا‬$) `- ‫ع‬Q 2—Í +
7

//...
int errors=0;
int current_type;
//...

:setup_sym ‫ ءات ا‬2 u‫ ا‬d‫ آ‬67 


a0‫و‬
//...
declaration:
|decl_type ident POINT_VER declaration
;
//...
ident:IDENT {setup_sym($1, current_type);}
|IDENT VER ident {setup_sym($1, 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;}
;
//...

‫ ة‬O‫ ا‬R‫ى ه‬2!  *2 ‫ا‬R‫ د و ه‬0 u  ‫


م‬O‫ ء ا‬0l‫اع أ‬Q‫آ  ا‬r2‫ ا‬:
@2!Q ‫ا‬R‫ ه‬
:‫ د‬0 u  ‫ ص‬U‫ ا‬0‫ )د ا‬62‫ا‬
affect:IDENT AFFECT fexpr
|IDENT AFFECT sexpr
;
fexpr:REEL
|ENTIER
|IDENT
|fexpr PLUS fexpr
|fexpr MOIN fexpr

39
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

|fexpr MULT fexpr


|fexpr DIVS fexpr
|MOIN fexpr %prec NEG
|fexpr PUIS fexpr
|PARG fexpr PARD
;
sexpr:CHAINE
|CARA
;

‫¡؟‬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;}
;
//...

: ‫د‬3‫ام ا‬U2  fexpr ‫ إ‬float_ 


O‫ أن ا‬fexpr -> REEL ‫ ة‬O‫ ا‬67
$$=_float;

41
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

t' +Q‫  أ‬r2‫  ا‬IDENT 


a2‫ع ا‬Q ‹WQ ‫ أا‬fexpr -> IDENT ‫ ة‬O‫ ا‬67
:fexpr ‫
ات إ‬a2‫ول ا‬/ 67 O!
if(sym_check($1))
$$ = get_sym_type($1);

‫ان‬R‫ ا‬fexpr  d‫_ إذا آ ن آ‬int ‫ع‬0‫


 ا‬Q 0Q7 fexpr -> fexpr PLUS fexpr ‫ ة‬O‫ ا‬67
:_int ‫ع‬0‫ ا

 ا‬
if(($1 == _int) && ($3 == _int))
$$ = _int;
else
$$ = _float;

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
0Q7 _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‫ ا‬c Q RWQ ‫ و‬O t) ‫* آ‬/2‫ن )
 ا‬e‫أ ا‬
:
20‫ ا‬R‫  ه‬d$2

 !0  ‫ن‬e‫ ا‬6W3 ‫ا‬R‫  و ه‬0‫


 ا`@ ء ا‬O  ¢Y3‫ن  ا‬e‫ ا‬003) O
Génération du ) ‫د‬3‫ )
 ا‬6‫ 
 ه‬2‫ ا ا‬,L’analyse sémantique ‫ي أو‬0‫ ا‬d
2‫ا‬
.(code

44
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

‫ آد‬Q ‫ أن‬0‫ ول ه‬0 , VO  : Q‫ ر‬O  Q , 


 6‫ ه‬,‫د‬3‫)
 ا‬
‫د و‬3‫ )
 ا‬67 @
! O  20 ? ‫ و أ‬e‫ ا‬a ‫ وه ا—ب إ‬oO7 assembleur
.=) 3 ‫رد أي دوال  أي‬2!Q  0Q (édition de liens) linking ‫ ك‬0‫ن ه‬3 

Q 0Q ‫ا‬R‫ و ه‬Assembleur 32 bit ‫ ج إ‬2Q  ,oO7 Assembleur 16 bit ‫ اـ‬: d 20
 ‫( و‬les interruptions) ‫  ت‬O‫  ا‬oO7 2Q ‫ أن‬+
7 ‫ ول‬0 ‫ و‬0‫ ه‬6 V0‫د ا‬3‫ا‬
d39 o!‫ن  أ‬3 ‫د = أن‬3‫ إذ أن ا‬les appels système ‫ اوال ا هة أو‬: d 2Q
hello world ‫م @  ا‬O assembleur ‫د‬3 ‫ا ' ل‬R‫ ه‬,e‫ ا‬a ‫ إ‬d39 ‫و أ—ب‬
:9 Y‫ ا‬
.MODEL small
.stack 100h

.data
msg db " Hello, World!",13,10,"$"
.code
start:
mov ax,@data
mov ds,ax

mov dx,offset msg


mov ah,9
int 21h ; ‫ض ى ا ان‬ ‫ "! ا‬#$‫ا‬
! %‫ دي اآ) ('& ا‬- ‫د‬.$‫ا‬

mov ax,0C07h
int 21h ; : ‫ ح‬: 789 23 ‫ أن‬5‫ ر إ‬01‫ا‬
<= $‫>! ا‬

mov ax, 4C00h


int 21h
end start

= ‫ ب‬23‫
 ا‬O *VW2 , ' WinAsm Studio ‫ آـ‬Assembleur ‫ أي‬d2 ‫ ا‬+2/) ‫إذا أردت‬
.6' :
2‫ ا‬a d
—  ‫ن  إ ع و‬3) ‫أن‬

45
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

‫د‬3‫  ا‬2‫  آ‬003) 62‫ ¿ اوال ا‬+


7 =230 CODE_GEN.H *   / ¢ 6YQ‫أ‬
:*.asm ‫ع‬Q  ¢ 67 ‫ا‬
#include<stdio.h>

char data_section[1024]; //‫@ ت‬A‫ ا‬2BC


char code_section[8192]; //‫د‬D‫ ا‬2BC
FILE *fcode;
//E= ‫د ا‬D‫ ا‬FG ‫ي‬H‫ ا‬I'F' JK#:
void Init_Code(char *file) // ‫ن‬D L3L. I': ‫ ء‬%‫ إ‬: DN !‫دا‬
23‫ر‬8O‫! ا‬PQ !R !S TU
{
fcode = fopen(file, "wb");
strcpy(data_section, "");
strcpy(code_section, "");
}

void Add_Data(char *data) //<3A= !V 9‫إ‬


{
strcat(data_section, data);
}

void Add_Code(char *code) //!F'= !V 9‫إ‬


{
strcat(code_section, code);
}

void Dispose_Code() // L= ]^  _> !'F‫ م ا‬N‫ وإ‬I'$‫ق ا‬XYZS ‫م‬#=


‫د‬D‫ا‬
{
fprintf(fcode, ".MODEL small\r\n.stack 100h\r\n.DATA\r\n");
fprintf(fcode, "%s", data_section);
fprintf(fcode, ".CODE\r\nstart:\r\n");
fprintf(fcode, "mov ax,@data\r\n");
fprintf(fcode, "mov ds,ax\r\n");
fprintf(fcode, "%s", code_section);
fprintf(fcode, "end start\r\n");
fclose(fcode);
}

.‫

ات‬a2‫˜ ا‬W : CODE_GEN.H ¢‫¡ ا‬1‫أ‬

46
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

:CODE_GEN.H ¢‫ دوال ا‬d2!0 0Q‫

  أ‬a2‫ا ا‬RV ‫أ‬0 ‫ و‬compalg.y ¢‫Ž ا‬27‫إذا إ‬

//...
#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;
}
//...

,‫ي‬0‫ ا‬d‫ ء  ا‬0l‫ أ‬0 Á ` ‫ أآاد‬+


7 02‫ — آ‬0‫ آ‬test.alg ¢‫ ا‬,‫آت‬R) ,-
:2‫ر ا‬r7 ‫ن‬3
 Ž
$‫د ا‬3‫ا ا‬R‫ ه‬+
7 =2‫ و أآ‬test.alg ¢‫ إ ا‬
algorithme alg
entier resultat,a;
reel r;
caractere car;
chaine s;
debut
ecrire "Entrer a = ";
lire a;
lire r;
lire s;
s<-s;
s<-"0123456789";
ecrire "c";

47
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

car<-"a";
resultat<-5;
a<-resultat*10+5;
ecrire !,"a = ",a;
lire a;
fin.

+Q‫ ˜ أ‬2 ‫ و‬test.alg /2 ‫م‬O


 +a9 ‫ و‬COMPALG.EXE */2‫ أ )
 ا‬,‫ن‬e‫ا‬
‫ن‬e‫  إ ا‬Q‫  و‬d‫ و  أن آ‬,:
2‫ آد ا‬d ‫ي‬R‫ ا‬TEST.ASM  ‫ ا‬¢‫ ا‬0 

:6)e ‫ا آ‬2 ‫ن‬3
!7 ‫د‬3‫ه رأس ا‬

.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);}
;

'‫?Ž أآ‬2) ‫ة‬3W‫ ا‬3 ‫ ا و‬d‫ 


 آ‬0‫  ز‬,<  ,‫ ا‬R‫ب  إآ ل ه‬2OQ Q‫أ‬
‫ أن‬d— ‫وب‬V‫)أردت ا‬oO7 ‫أح‬...^!W0 
O‫ ا‬d32 ‫ و‬0‫ ب ه‬23‫ا ا‬R‫ ه‬6VQ‫ا أ‬RV ‫آ' و‬r7
.d30 ,*V < ,(.., r!‫)داد ا‬

‫ع‬0‫ ا‬: d )r!7 :


2‫ ا‬a ‫ ا‬67 ‫ا‬/ ‫أ‬2 60Q‫  أ‬,‫
ات‬a2‫ Ž  ا‬$2‫ا‬
*VW‫  دة ا‬, V d 2‫ ا‬dV!7 ‫ اوف و اوف‬d ‫
Ž أ‬, +Q‫  أ‬6O
O‫ا‬
:+0 ‫ Ž وإ  ذا‬$2‫ا ا‬R‫<˜ ه‬

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

t0‫ إذا آ‬,


  ‫ )^ ودي‬3 ‫ و‬:
2‫ ا‬a !0  6 '‫ Ž ا‬$2‫ن ذ^ ا‬3 < —
:^‫ ذ‬dW0 compalg.y ‫ن إ‬e‫ ا‬+2Q ,d7 7 ^‫  ذ‬d?7‫  ه أ‬d7 :
@2!)
//...
ident:IDENT {
setup_sym($1, current_type);
if((current_type == _int) ||
(current_type == _float))
{
Add_Data($1);
Add_Data("\tdw\t6 dup(?)\r\n");
}
else if(current_type == _chr)
{
Add_Data($1);
Add_Data("\tdb\t?\r\n");
}
else if(current_type == _str)
{
Add_Data($1);
Add_Data("\tdb\t56 dup(‘ ‘)\r\n");
}
}
|IDENT VER ident {
setup_sym($1, current_type);
if((current_type == _int) ||
(current_type == _float))
{
Add_Data($1);
Add_Data("\tdw\t6 dup(?)\r\n");
}
else if(current_type == _chr)
{
Add_Data($1);
Add_Data("\tdb\t?\r\n");
}
else if(current_type == _str)
{
Add_Data($1);
Add_Data("\tdb\t56 dup(‘ ‘)\r\n");
}
}
;
//...

49
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

TEST.ASM ¢‫ ا‬0 c20


 COMPALG.EXE c Q‫ ا‬da9 *l */2‫ أ )
 ا‬,d
/
:6 2‫ى ا‬2 
.MODEL small
.stack 100h
.DATA
a dw 6 dup(?)
resultat dw 6 dup(?)
r dw 6 dup(?)
car db ?
s db 56 dup(‘ ‘)
.CODE
start:
mov ax,@data
mov ds,ax
end start

.dV ‫أ ? أو أ‬ V 6— ‫ن ا‬3 ‫ أن‬/‫ أر‬, V ‫


ات آ ن‬a2‫ Ž  ا‬$2‫ا‬

‫ج‬U) VQ‫ و  أ‬dV ‫ )و أ‬VQ ecrire ‫أ ـ‬0 ,ecrire ‫ و‬lire ‫ ص ـ‬U‫د ا‬3‫
 ا‬2 ‫أ‬0
.‫ى‬0 ,int 21h  O‫م ا‬U2!0 0Q7 9 Y‫ص  ا‬$Q


7 ! tQ ‫ إذا آ‬,
7 ! ‫
 أو‬a2 ‫ إ‬2‫  را‬d39  R`r) — ecrire ‫اا‬
: ' ,9 Y‫ إ ا‬V/UQ *l ‫ ت‬Q
‫ —!* ا‬67 <‫ أو‬V0 ‫ح‬$Q ‫
= أن‬7

ecrire "Entrer a = "; ecrire "c";

.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

‫ = أن‬CHAINE ‫ أو‬CARA ‫آ‬2‫ ا‬LEX :/ 0 , 3‫ و‬,


1 ‫ إ‬dO20Q ‫ أن‬d— ‫ا‬R‫ ه‬t'0
:lcompalg.l ¢‫Ž ا‬27‫ا إ‬RV ‫
 و‬7‫ —
 ا!! ا‬V ¡7
//...
"\""."\"" {
strcpy(yylval.Tstr,yytext);
return(CARA);

50
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

}
"\""(.)+"\"" {
strcpy(yylval.Tstr,yytext);
return(CHAINE);
}
//...

+Qr‫ و آ‬+0 Ž $2‫ ج إ ا‬20 0Q7 


7 !  ‫  رة‬ecrire ‫ اا‬2‫إذا آ ن  را‬
µ
 _msgX_ d3Y‫ا ا‬R‫
ات ه‬a2‫^ ا!!  ا‬2 6@0 ,^R ,‫
  دي‬a2

a2‫ح  ا‬$0 ‫ و‬CODE_GEN.H ¢‫د إ ا‬Q ^R ,9 ‫ إ‬0  X 
a2

‫ وه‬strtemp t—Í 
a2  ‫ح‬$0 ^R‫ و آ‬X 
O ‫ن '  اد‬3
 data_counter
‫ ج‬20 ^R‫ آ‬,t—Í d3Y ‫ و‬0‫˜ ¿ ا‬W V/ 2Q — 
7 !! 9Í  ‫ رة‬
67 ‫  ن‬O2 VQ ‫ د‬0 ‫ إو إ‬ecrire 6‫
 ا`
ة أه‬2‫ ا‬tQ ‫  إذا آ‬+
7 ‫د‬Q 
a2 ‫إ‬
:sexpr ‫ و‬fexpr ‫ ة‬O‫‹ ا‬WQ
//...
#include<stdlib.h>
#define _WRITE 2
#define _AFFECT 3

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

Add_Code("mov ah, 2\r\n");


Add_Code("int 21h\r\n");
}
}
;
//...

‫ ل‬2  WRITE_ ‫ن‬32 62‫ 


 و ا‬2‫
 ا‬2‫ع ا‬Q Q‫ د‬writed_expr ‫ ة‬O‫ ا  ا‬67

 ذ^ و‬1 
 2‫
 ا‬2‫ن ا‬32 2 ‫د‬Q ‫ن أن‬e‫ = ا‬,{;current_op = _WRITE}
^R ‫ و‬affect -> … ‫ ة‬O‫¡  ا‬O2‫ أ ا‬d— *2 ‫ا‬R‫ ؟ ه‬AFFECT_ ‫ن‬32 2  2 
: er_ V
!Q ‫ و‬V2 ‫ ا‬67 ‫ — ة ! ة‬¢
?0
//...
affect:_er IDENT AFFECT fexpr {
if(sym_check($2))
{
int sym_type = get_sym_type($2);
if((sym_type==_int) && ($4==_float))
{
printf("Erreur:imposible de converter (reel
a entier) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_str) && ($4==_float))
{
printf("Erreur:imposible de converter (reel
a chaine) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_chr) && ($4==_float))
{
printf("Erreur:imposible de converter (reel
a caractere) : ligne %d.\n",line);
errors++;
}
else if((sym_type==_chr) && ($4==_str))
{
printf("Erreur:imposible de converter
(chaine a caractere) : ligne %d.\n",line);
errors++;
}
}
}
|_er IDENT AFFECT sexpr {

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;}
;
//...

0W;‫ أ‬0Q‫ و  أ‬,oO7 current_op 


a2 AFFECT_ 
O‫_ ه إ@ ء ا‬er ‫ ة‬O‫ف  ا‬V‫ا‬
.$4 Ž$ $3 ‫ و‬$2 Ž$
$1 ‫ن‬7 affect  ‫ ا‬67 ‫ ة‬/ ‫— ة‬

‫ا‬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

;ecrire "Entrer a = "


mov dx, offset _msg0_

54
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

mov ah, 9
int 21h

;ecrire "c"
mov dl, "c"
mov ah, 2
int 21h

;ecrire "a = "


mov dx, offset _msg1_
mov ah, 9
int 21h
end start

! ‫! ـ‬0  , / @ 60 ‫ي‬R‫ ص ! ا‬U‫^ ا ا‬R‫


ات آ‬a2‫ إ`اج ا‬0 6O ,
/
t l +Q‫_ و  أ‬NEWLINE_ +!0 ‫ و‬t l ‫  و‬/ 
a2 ‫ ت‬Q
‫ إ —!* ا‬¢?0 ,dV!7
:CODE_GEN.H ¢‫ ا‬67 ‫ا‬R‫ و ه‬6 V0‫د ا‬3‫  ا‬2 l @— d39  +W
?0 0Q7
//...
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, "%s", data_section);
fprintf(fcode, ".CODE\r\nstart:\r\n");
fprintf(fcode, "mov ax,@data\r\n");
fprintf(fcode, "mov ds,ax\r\n");
fprintf(fcode, "%s", code_section);
fprintf(fcode, "end start\r\n");
fclose(fcode);
}
//...

:^‫ ذ‬d30 ‫ و‬compalg.y ‫دة إ‬

//...
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

//...

‫ و‬V! *2 ^‫ن ذ‬7 


7 ! ‫ أو‬67 
a2‫ إذا آ ن ا‬,‫
ات‬a2 !0 
:dl ‫ أو‬dx d!‫ ا‬67 
a2‫ان ا‬0 :;‫ و‬: ‫ة‬9  21  O‫ ل ا‬2 
//...
fexpr:REEL {$$=_float;}
|ENTIER {$$=_int;}
|IDENT {
if(sym_check($1))
{
$$ = get_sym_type($1);
Add_Code("\r\n;ecrire ");
Add_Code($1);
Add_Code("\r\n");
if($$ == _str)
{
Add_Code("mov dx, offset ");
Add_Code($1);
Add_Code("\r\n");
Add_Code("add dx, 2\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");
}
}
}
//...

-
, VQ‫
  أ‬O
O‫
ات ا‬a2‫ ا‬d Q ‫  أن‬0OW)‫ إ‬O– Ž
, 
a2‫أ إذا آ ن ا‬
:9 Y‫
  ا‬, ‫
ا‬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

‫ أو‬les étiquettes ¿ 0‫_ و أ ? ه‬N_ ‫_ و‬ZERO_ ‫_ و‬TEN_ 6‫ و ه‬2 l ‫


ات‬a2 ‫ ك‬0‫ه‬
67 Ž$
next0 d ‫ ا‬, ' ,Ž
, ‫ د‬: 
 d‫ آ‬: 
a2) ‫ = أن‬62‫ ا‬Labels
:‫ا‬R‫ ه‬t'0 CODE_GEN.H ¢‫د إ ا‬Q ,‫ا‬R3‫ و ه‬next1 ‫ د‬O‫اة ا‬
//...
int write_int_counter = 0; //)'K3X‫اد ا‬L(
//...
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");
fprintf(fcode, "_N_\tdb\t6 dup(0)\r\n");
fprintf(fcode, "%s", data_section);
fprintf(fcode, ".CODE\r\nstart:\r\n");
fprintf(fcode, "mov ax,@data\r\n");

57
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

fprintf(fcode, "mov ds,ax\r\n");


fprintf(fcode, "%s", code_section);
fprintf(fcode, "end start\r\n");
fclose(fcode);
}

char* GenLabel(char *label) //L3L. K31 L= ‫ا! ا‬L‫ا‬


{
char *temp = (char*)malloc(sizeof(char)*16);
char string[4];
itoa(write_int_counter, string, 10);
sprintf(temp, "%s%s", label, string);
return temp;
}

void GenLabelIncCounter()
{
write_int_counter++;
}
//...

:‫ اا‬62!Q 0Q7 next0  ‫ل‬$‫ ا‬Q‫ إذا أرد‬,‫إذا‬

GenLabel("next") ;

.GenLabelIncCounter ‫ اا‬62!Q next1 ‫ أو‬6 2‫ى ا‬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 0Q7 
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 0Q7
`‫أ‬
, 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();
}
//...

:‫

ات‬a2‫ ا‬R‫ي ه‬0 compalg.y ¢ !0 

//...
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);
}
}
//...

REEL ‫ أو‬ENTIER ‫آ‬2‫ ا‬: V)‫ إ د‬LEX  = 62‫


 ا‬O‫ ا‬6‫ و ه‬$1 02 ‫ ا‬0Q‫و  أ‬
:ENTIER ‫ و‬REEL : O7‫
* ا‬O‫  ا‬d‫ع آ‬Q  Ž $2‫
= ا‬7
//...
%token <Tint> ENTIER
%token <Tfloat> REEL
//...

: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 !

lire s ; lire car;

mov dx, offset s mov ah, 01h


mov ah, 0Ah int 21h
int 21h mov car, al
mov di, offset s
xor bx, bx
mov bl, [di+1]
mov byte ptr [di+bx+2],'$'
mov dx, offset _NEWLINE_
mov ah, 9
int 21h

:read ‫ ة‬O‫ى ا‬2!  ^‫ ذ‬


//...
read:IDENT {
if(sym_check($1))
{
Add_Code("\r\n;lire ");
Add_Code($1);
Add_Code("\r\n");
if(get_sym_type($1) == _chr)
{
Add_Code("mov ah, 01h\r\n");
Add_Code("int 21h\r\n");
Add_Code("mov ");
Add_Code($1);
Add_Code(", al\r\n");
}
else if(get_sym_type($1) == _str)
{
Add_Code("mov dx, offset ");
Add_Code($1);
Add_Code("\r\n");
Add_Code("mov ah, 0Ah\r\n");
Add_Code("int 21h\r\n");

64
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

Add_Code("mov di, offset ");


Add_Code($1);
Add_Code("\r\n");
Add_Code("xor bx, bx\r\n");
Add_Code("mov bl, [di+1]\r\n");
Add_Code("mov byte ptr [di+bx+2],'$'\r\n");
Add_Code("mov dx, offset _NEWLINE_\r\n");
Add_Code("mov ah, 9\r\n");
Add_Code("int 21h\r\n");
}
}
}
|IDENT VER read {
if(sym_check($1))
{
Add_Code("\r\n;lire ");
Add_Code($1);
Add_Code("\r\n");
if(get_sym_type($1) == _chr)
{
Add_Code("mov ah, 01h\r\n");
Add_Code("int 21h\r\n");
Add_Code("mov ");
Add_Code($1);
Add_Code(", al\r\n");
}
else if(get_sym_type($1) == _str)
{
Add_Code("mov dx, offset ");
Add_Code($1);
Add_Code("\r\n");
Add_Code("mov ah, 0Ah\r\n");
Add_Code("int 21h\r\n");
Add_Code("mov di, offset ");
Add_Code($1);
Add_Code("\r\n");
Add_Code("xor bx, bx\r\n");
Add_Code("mov bl, [di+1]\r\n");
Add_Code("mov byte ptr [di+bx+2],'$'\r\n");
Add_Code("mov dx, offset _NEWLINE_\r\n");
Add_Code("mov ah, 9\r\n");
Add_Code("int 21h\r\n");
}
}

65
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

}
;
//...

:‫د‬3‫@  ا‬O‫ ا‬R‫ ه‬d2!0 ‫


؟‬O
O‫
 و ا‬$‫
* ا‬O‫ ذا  —اءة ا‬

_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

*!— 67 (13) ENTER ‫ —


 ار‬d' ‫ي‬R‫_ ا‬ENTER_ t '‫ح  ا‬$Q ‫ ج أو< إ‬20
:CODE_GEN.H ¢‫ى ا‬2!  ‫ا‬R‫ ت و ه‬Q
‫ا‬
//...
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");
fprintf(fcode, "_N_\tdb\t6 dup(0)\r\n");
fprintf(fcode, "_ENTER_\tequ\t13\r\n");

66
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

fprintf(fcode, "%s", data_section);


fprintf(fcode, ".CODE\r\nstart:\r\n");
fprintf(fcode, "mov ax,@data\r\n");
fprintf(fcode, "mov ds,ax\r\n");
fprintf(fcode, "%s", code_section);
fprintf(fcode, "\r\nmov ax,0C07h\r\n");
fprintf(fcode, "int 21h\r\n");
fprintf(fcode, "\r\nmov ax, 4C00h\r\n");
fprintf(fcode, "int 21h\r\n");
fprintf(fcode, "end start\r\n");
fclose(fcode);
}
//...


2 ‫م‬O2 62‫ وا‬WriteNum_Code ‫ ـ‬V Y‫ ا‬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();
}

:compalg.y ¢‫د إ ا‬Q


//...
read:IDENT {
//...
else if((get_sym_type($1) == _int) ||
(get_sym_type($1) == _float))
{
ReadNum_Code ($1);
}
}
}
|IDENT VER read {
//...
else if((get_sym_type($1) == _int) ||
(get_sym_type($1) == _float))
{
ReadNum_Code ($1);
}
}
}
;
//...


 ‫ دات‬0 Õ ¡7‫د اا‬3‫ )
 ا‬oO7 6O ,lire ‫ ص  ا‬U‫د ا‬3‫ )
 ا‬6V0Q ‫ا‬RV
:
 2‫ ة ا‬O‫ن  ا‬3)  ‫ اا‬,
; ‫ ا
ت ا! 
 ا‬6— ‫
* و‬O‫
ات و ا‬a2‫ا‬

affect:_er IDENT AFFECT fexpr

68
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

‫ د  آد‬O‫@ ا‬O‫ إ أن ا‬+ 


YQ ¡
) Q V2@ ‫ ا‬action sémantique <‫ أو‬¢
?Q
:‫ د‬0 ‫ 
 إ‬d') :
2‫ا‬
//...
affect:_er IDENT AFFECT {Add_Code("\r\n;");Add_Code($2);Add_Code("
<- ...\r\n");}fexpr {
if(sym_check($2))
{
//...
if((sym_type==_int) || (sym_type==_float))
{
//IDENT 5‫! إ‬R ‫ د ا‬ZS ‫م‬#
}
else if(sym_type==_chr)
{
//IDENT5‫! إ‬R ‫ د ا‬ZS ‫م‬#
Add_Code("mov ");
Add_Code($2);
Add_Code(",al\r\n");
}
}
}
|_er IDENT AFFECT {Add_Code("\r\n;");Add_Code($2);Add_Code("
<- ...\r\n");}sexpr {
if(sym_check($2))
{
//...
if((sym_type==_int) || (sym_type==_float))
{
//IDENT5‫! إ‬R ‫ د ا‬ZS ‫م‬#
}
else if(sym_type==_chr)
{
//IDENT5‫! إ‬R ‫ د ا‬ZS ‫م‬#
Add_Code("mov ");
Add_Code($2);
Add_Code(",al\r\n");
}
}
}
;
//...

:
2‫   ¡ ا‬67 
a2 ‫ د ف إ‬0  ‫م‬O0 ‫ إذ‬,‫ اوف‬: d 2  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");
}
}
;
//...

67 !!‫^ ا‬2 ‫ح‬$Q ‫ = أن‬0‫ ه‬,


a2 ‫
 إ‬7 ! ‫ د‬0 ‫ إ   إ‬dO20Q
‫ا‬R‫ ه‬0  ‫ إذا آ ن‬, ' ,O ‫ام‬U2  
a2‫ه إ ا‬0!Q *l 
a2 VQ‫ ت  أ‬Q
‫—!* ا‬
:‫ د‬0 u‫ا‬
s<-"0123456789";
:‫د‬3‫ا ا‬R‫ إ ه‬V0

_msg2_ db "0123456789","$"

mov di,offset s ; !Vd‫'! ا‬B'B‫ إ` ا‬L B  ‫ي‬H‫ ا‬a8$‫ه ا‬s


mov si,offset _msg2_
mov cx,[si+1]
next0:
mov al,[si]
cmp al,0
jz end0
mov byte ptr [di],al
inc si
inc di
dec cx
cmp cx,0
je end0
loop next0
end0:

70
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

^R ‫ و‬sexpr ‫ ة‬O‫ إ ا‬affect ‫ ة‬O‫


  ا‬a2‫ إ * ا‬dO0Q ‫ ج إ أن‬20 Q
:strtemp1 ‫ <ت‬2 u‫د ا‬2‫ ا‬t—Í‫
 ا‬a2‫ ا‬67 +”W0
//...
affect:_er IDENT AFFECT {Add_Code("\r\n;");Add_Code($2);Add_Code("
<- ...\r\n"); }fexpr {
//...
}
|_er IDENT AFFECT {Add_Code("\r\n;");Add_Code($2);Add_Code("
<- ...\r\n");strcpy(strtemp1,$2);}sexpr {
//...
}
//...

:sexpr:CHAINE ‫ ة‬O‫ى ا‬2!  *2


7 d‫ ا‬6—  ‫أ‬

//...
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;
//...

‫_( و‬int, _float, _str, _chr) + 


O‫ د ا‬0 ‫ي = إ‬R‫
 ا‬a2‫ع ا‬Q 
a2‫ا ا‬RV 0!0 ‫و‬
:affect ‫ ة‬O‫ ا  ا‬67 ‫ا‬R‫ه‬

//...
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 {
//...
}
;
//...

:fexpr -> IDENT ‫ ة‬O‫ى ا‬2!  +30!7 6— ‫أ ا‬


//...
fexpr:REEL {
//...
}
|ENTIER {
//...
}
|IDENT {
//...
else if(current_op == _AFFECT)
{
if(AffectIdentType == _str)
{
Add_Code("mov di,offset ");
Add_Code(strtemp1);
Add_Code("\r\n");
Add_Code("mov si,offset ");
Add_Code($1);
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");
Add_Code("\tcmp cx,0\r\n");
Add_Code("\tjz ");
Add_Code(GenLabel("end"));
Add_Code("\r\n");

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‫ا‬

 ‫و‬Í!‫ ة ا‬O‫ ا‬,


O
O‫
 و ا‬$‫
ات ا‬a2‫ د 
ا‬0 u‫ ء 
ت ا‬VQ‫ إ‬0 6O
:6‫ ه‬-d—  ‫ات اات‬Y V
‫ إ‬Q ‫ د –آ أ‬0 u‫ا‬
affect:_er IDENT AFFECT fexpr

74
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

‫ ل‬2‫ إآ‬0 ‫ و‬AX d!‫ ا‬d`‫ دا‬V;‫* و‬l fexpr 67 ‫دة‬/‫


م  !  ت ا‬O‫ ا‬0

,mov $1, AX ‫د‬3‫ ا @ ا‬IDENT 
a2‫ إ ا‬AX 67 ‫دة‬/‫
 ا‬O‫ ا‬0!Q ‫ ة‬O‫ا‬
: V ‫ و‬+Q <‫د أو‬3‫ا ا‬R‫= ه‬230

//...
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;
//...

:fexpr ‫ ة‬O‫ى ا‬2!   ‫ ؟‬CurrentOp ‫


 ا 
 ـ‬O‫د ا‬0 ‫أ‬
//...
fexpr:REEL {
//...
}
|ENTIER {
//...
}

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 0Q7 ‫ ة‬/ 
 ‫ ك أي‬0‫ ه‬3) * ‫ أ إذا‬,TempReg ‫ى‬2 : V 0 0Q7
: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 ‫ ة‬O‫ ا‬67 CurrentOp 


a2 NULL  ‫ ا‬67 
a0 ‫و‬

//...
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;
}
//...

: ‫ ه‬V! ‫ي‬R‫د ا‬3‫ ا‬,6*10 


‫د إ ا‬Q

push ax
mov ax, 6
mov bx, 10
mul bx
mov cx, ax
pop ax

d!‫ إ ا‬+2


— ¢
?Q  
‫ ا‬tQ ‫ إذا آ‬,cx d!‫ ا‬67 ‫دة‬/ ‫
 ا`
ة‬20‫إذن ا‬
0Q7 ‫ —! أو ;ب‬tQ ‫ أ إذا آ‬,‫ أو ح‬:/ 6‫ د ه‬O‫ أن ا
 ا‬Q‫آ‬r) ‫ إ< إذا‬ax

3‫
 ا‬20‫ و 
‹  ا‬cx d!‫ ا‬67 ‫دة‬/‫
 ا 
 ا‬20‫  ا‬V 0
NULL 
O‫ إ ا‬d
‫ي‬R‫ و ا‬PrevOp *  ‫ ا‬/ ‫
ا‬a2 ¢
?Q ^R ,ax 67 ‫دة‬/‫ا‬
:O !‫أو —
 ا
 ا‬

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;
}
//...

‫ا‬2 ‫ إذا آ ن‬,PrevOp 


a2‫ را  ا‬2`‫ي إ‬Q ‫ ء )
 آد 
 ا?ب <  أن‬0l‫أ‬
‫ ا
 و 
 ا?ب ا 
 = أن‬R‫ ه‬d— ‫ 
 ;ب‬0 /‫ أ‬0Q‫ أ‬60 ‫ا‬R‫ن ه‬7 MULT
^‫
 ذ‬1 ‫ا‬2 ‫ أ إذا آ ن‬,CX d!‫ ا‬67 ‫دة‬/‫ و ا‬O !‫
 ا
 ا‬2Q  ‫)ي‬
0Q7 ‫ا‬R‫ء و  ه‬69< ‫ أو‬:/ 
 V2O 
 ‫ب ا‬$‫ أن 
 ا‬60 ‫ا‬R‫ن ه‬7
.‫ا‬R3‫ وه‬TempReg t—Í‫
 ا‬a2‫ ا‬67 ÖW‫
 ا‬O‫  ا‬V 0

‫ د‬0  +
7 ‫م‬OQ ‫ي‬R‫د ا‬3‫  إ ا‬2 ‫ و‬affect ‫ ة‬O‫  ا‬VQ ‫د إ‬Q ‫ن أن‬e‫ ا‬0

67 ‫دة‬/‫
 ا‬O‫ ا‬¢
?Q  ,‫د‬$O‫
 ا‬a2‫ إ ا‬AX d!‫ ا‬67 ‫دة‬/‫
 ا‬20‫ا‬
‫ د < )ي‬0 u‫   آن 
 ا‬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");
}
//...
}
}
//...

‫أ‬O2 0C07h ‫ اا‬: 21  O‫ ء ا‬2 ‫ إ‬0


 = :
2‫ ا‬a ‫ )
 ت‬d‫ آ‬R
W0) 
21  O‫ ا‬62!Q ^‫  ذ‬,c Q‫
 ا‬2Q  ‫  رؤ‬32Q 2 Ž
) W‫ف   ا‬
:‫وج‬U‫  ا‬O 6‫ وه‬4C00h ‫ اا‬:
mov ax,0C07h ; Function 0Ch = "FLUSH BUFFER AND READ
;STANDARD INPUT"
int 21h ; Waits for a key to be pressed.
mov ax, 4C00h ; the exit fuction [4C+no error (00)]
int 21h ; call DOS interrupt 21h

:CODE_GEN.H ¢‫ى ا‬2!  *2 ^‫ذ‬

//...
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

fprintf(fcode, "_N_\tdb\t6 dup(0)\r\n");


fprintf(fcode, "_ENTER_\tequ\t13\r\n");
fprintf(fcode, "%s", data_section);
fprintf(fcode, ".CODE\r\nstart:\r\n");
fprintf(fcode, "mov ax,@data\r\n");
fprintf(fcode, "mov ds,ax\r\n");
fprintf(fcode, "%s", code_section);
fprintf(fcode, "\r\nmov ax,0C07h\r\n");
fprintf(fcode, "int 21h\r\n");
fprintf(fcode, "\r\nmov ax, 4C00h\r\n");
fprintf(fcode, "int 21h\r\n");
fprintf(fcode, "end start\r\n");
fclose(fcode);
}
//...

:*2 ‫ر‬a‫ا ا‬R‫ن  ه‬e‫  إ  ا‬QQ‫ب  أ‬0


algorithme alg
entier resultat,a;
debut
ecrire "Entrer a = ";
lire a;
resultat<-5*a+10;
a<-resultat;
ecrire !,"a = ",a;
fin.


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

;ecrire "Entrer a = "


mov dx, offset _msg0_
mov ah, 9
int 21h

;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

;resultat <- ...


mov ax,0
push ax
mov ax,a
mov bx,5
mul bx
mov cx,ax
pop ax
add ax, cx
add ax, 10

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, offset _msg1_
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

mov ax, 4C00h


int 21h
end start

¡ !‫د ا‬3‫ ا‬R


W0) 
2Q ‫ن‬32 WinAsm Studios c Q ‫ ر‬67 +O$‫د و أ‬3‫!¸ ا‬Q‫أ‬
:6 2 ‫آ‬

89
‫( ة ة‬Compiler)  ‫   ا‬... 
‫آ‬ 2010

^R ,‫ ز‬Q‫  ¡ إ‬V Y V37 ‫ إ أس‬:7‫ ا


ت  —! و ح و ر‬6—  ‫أ‬
‫ل إ‬,‫ أر  ا‬t0‫ آ‬6Q‫ أ‬: d3‫ ب آ‬23‫ ا‬67 ‫ و‬/2‫ ا  ا‬R‫ ه‬67 0‫ ه‬¢—2Q
a ‫ أل )
 ت‬¢
‫ < أف آ‬60Q‫ أ‬V‫   ب ة أه‬... 3 ‫د و‬3 ‫ي‬R
W0) ¢ 
)
.
  e‫ ا‬a ‫ إ‬:
2‫ا‬

‫ ل‬3 7 ,‫ن‬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‫ا
ا‬

1. THOMAS NIEMANN. A GUIDE TO LEX & YACC


2. AnthonyA.Aaby[2005]. Compiler Construction using Flex and Bison

91

You might also like