! #"$&% '()* ,+-. / 01234
52687968:<;>=?@;6BA/CED<FG?@;68H9:IG!CJ9;K6MLNF=?@LPOQ?@R52:NAS:NH9H:SF&TUR8:WV9?H79;:IX?J
GRY?@J97:Z=?LP[\J6M:N;]F^@C\_NRX68RMR8CSH`FGa9;b6MLbDcCd9a:Zef:NRM7`FghLc?@K:NR8RM:UTiDbDj?R86
kmlnkmoqpsrut<vxwzy{|o}<~zwt]rw{, o`p]kptQmr~
Wc mrPW~8jh#\wzru{c
c¡ b psrut<vjw|y{zo#}<~zwtrP¢w£ujm¤ ¦¥ myP}Q
¥
w§¨~8©¢yb¨~mª&rut<vjw|yj©w£}Nhwzyj©«u
¬/®¯°b±]²P¯
³x´µb¶m·¸S¹x¹º»¼»µ½»¾¨´µb¿W·m¼ÀÁ§¶µb´Â¾¨Ã9¹¶mÄ>Åc¾¨¿N¾¨¶µb·¹¶Æ@Ç<µ»¾Èɹ¿2Ê,Ë>ÌIµb¿NÈɹÇ;À¨··¾ÀÎÏ
¿N¹º¹ÅP¼¾»ÐѸÒÎ<µb¿]Ä»,·¹µ½Ó]¶¹xÀ¾»»¹bÁÒµbÔ]·¹´µb·¼ÕÀÂÅc¾¨¿N¾¨¶µb·m¼¹¿ÉÁz¶¹´Ö»mÓs¾À¨¼Ø×<Àµb·m¼¹¿N»Æ/³x´µb¶·Ï
¸S¹x¹º»S´µbÄc¾»S¼Õ·Ós¹P»»¼ÕÇ]º¾¦·¹#ÙxÔ]¼ÀÄxºÕÚÈ]¾¨Ûc¾¨º¹ÓѾ¨¿xÛx¼Õ¶¹¿]´Â¾¨¿x·»È]¾È¼Àµb·¾È·¹#È]¹´µb¼Õ¿Ï8»mÓs¾À¨¼Ø×<À
µb¿NÈUÓ]¶¹ÅP¶µb´*´*¼Õ¿]Å>ºµb¿]ÅPÔ<µbÅc¾»Ð³W¹´Â¾¹bÁ·mÎN¾»¾»mÓs¾À¨¼Ø×<Àµb·m¼¹¿N»Ü§Ê,ËfÌ&Æ@Ý,¸ÝÑÆS³WÀÎN¾¨´µ»ÞÆ
ʳW̸ß,µb¶¾*¼»»mÔ<¾¨È2Á§¶¹´à·mÎN¾*áãâcäÃÎ]¼ÀÎU¼»µb¿É¼Õ´*Ós¹¶m·uµb¿x·»¹Ô]¶À¾*¹bÁÒÛµb¶m¼¾ÈU¾¨´Â¾¨¶mÅP¼Õ¿]Å
È]¹´µb¼Õ¿Ï8»mÓs¾À¨¼Ø×<Àºµb¿]ÅPÔ<µbÅc¾»Ð9³x´µb¶m·¸S¹x¹º»ÔN»¾»¹ÇÍm¾À¨··¾ÀÎ]¿N¹º¹ÅP¼¾»#»mÔNÀÎiµ»ÒÛW¼»m¼Õ·¹¶Ó<µb·Ï
·¾¨¶m¿N»Òµb¿<Ƚµ»Ós¾À¨·Ï8¹¶m¼¾¨¿x·¾È½Ó]¶¹ÅP¶µb´*´*¼Õ¿NÅNЦåM·Ó]¶¹ÞÛW¼È]¾»9À¹xÈ]¾#Åc¾¨¿N¾¨¶µb·¼Õ¹¿iµÈNµbÓ]·¾È½·¹·mÎN¾
ÔN»µbÅc¾¹bÁs·mÎN¹P»¾Ò·¾ÀÎ]¿N¹º¹ÅP¼¾»·¹»mÔ]Ó]Ós¹¶m·&·mÎN¾ÈN¾hÛj¾¨º¹Ó]´Â¾¨¿x·¹bÁE»¾¨´µb¿x·m¼À#µb¿<µbºÕÚW»¾»ÞÐ/å8¿*·Î]¼»
ÃÒµÚcÆ]Ã9¾¹Ç]·µb¼Õ¿>µb·´*¼Õ¿]¼Õ´µbºSÀ¹P»··mÎN¾È]¾»m¼ÕÅP¿>µb¿NÈ!¼Õ´*Ó]º¾¨´Â¾¨¿x·µb·m¼¹¿>¹bÁ¦µÑ´Â¹xÈÔ]ºµb¶#È]¾¨Ûc¾¨ºØÏ
¹Ó]´Â¾¨¿x·#Ó]ºµb·Áz¹¶m´-ÃÎ]¼ÀÎi¼»#¹Ós¾¨¿@Æ<¼Õ¿x·¾¨¶µÀ¨·m¼ÕÛc¾PÆQÔ]¿]¼ØÁz¹¶m´Æsµb¿Nȴ¹P»·¼Õ´*Ós¹¶m·µb¿x·`Ó]¶¹¿N¾·¹
¾¨Ûc¹ºÕÔ]·m¼¹¿@Ð
æÑhçè&rPmbé
»¹bÁz·MÃÒµb¶¾Åc¾¨¿N¾¨¶µb·m¼¹¿@Æ<È]¾¨Ûj¾¨º¹Ó]´Â¾¨¿x·#¾¨¿xÛW¼Ø¶¹¿]´Â¾¨¿x·Æ
»¾¨´µb¿x·m¼Àµb¿<µbºÕÚW»¾»ÆNµ»mÓs¾À¨·Ï8¹¶m¼¾¨¿x·¾ÈiÓ]¶¹ÅP¶µb´*´*¼Õ¿]ÅNÆ<ÛW¼»m¼Õ·¹¶Ó<µb·m·¾¨¶m¿@Æ
Ó]¶¹ÅP¶µb´ê·m¶µb¿N»Á|¹¶m´µb·m¼¹¿@ÆNÊ,ËfÌ&ÆÊ³WÌW¸Ð
ë ì]íîQïsðñòó@îsôðí
õ÷öø¨ùúüûÞýþøhûbÿùüúWö£û uûxø¨ûøxø <ÿ4ûhöú mú]ø¨û húüûÞøöÿxøhöWúWø¨ùüû
ÿúüÿ4ûsøWúû ö! " hû#xú$ % hû&hûø'(uø üÿÞø' uûö£ú) "xøhöú+*,ùüû
hûø¨ùsûõ/ õ÷öüûõ û0(12ú uø¨ö 43Bõ657198Òùö£ú]ø' :üÿbûfúüûÞý; "ö %
üÿù<=!,>=!93?=xø'@,BA:ûC=ûDüúüöøhöWú8E GF<ÿùsû "ø¨ùjøH uöI4û#øhùüû#ÿúüÿ4ûsø
90uø 'WÿÞø&A<ú]øKJL&ø¨ùüû%0höÿiÿ %HúsûbúNøø'M "Wúüöxøhû(xúNAO '
P*"Q9üöR-øhöWúA<øhùüû|øý2 hû@S:£öøTAUWúiø¨ùüû@üûVûW iû4úNøCûbûX hû@Y "KZ[ ÿúüÿ4û hú
öú ø¨ùüö\ uøhö£ÿ #W£öÿjø¨öú] hûW*^,ùxøZ[ø¨ö_DEû½ø¨ùüû>ÿ hûxø¨öú`>a|øý2 hû
Wûbúüû 'xø >uø úAX0uû^úPbdcaef3Bûbø¨ûbúWhö0£û#ca gNaeExúWûh89xú^0WZû4ÿ4ø
øhûbÿùüúWö£û@ú ûaF) " uø,:*
This is a preliminary version. The final version will be published in
Electronic Notes in Theoretical Computer Science
,ùüûU "Wöú/7 #ø¨ùüö&|ømýC hû"Wûbúüû 'xø öÂø'ùüû üûhöúüû \C
"Wö£ú:-ûbÿ4öDEÿX & ' % öú$xúWû*$ % hûføhùWú`úüû(û4ÿbö_DEÿxøhöWú 38û**$
=,>=8fö>úsûbûsû ø'/SNüö£ÿgNA;W :üÿ4û$/üûüöÿxøhûfüû Vû ûbú]øÉûbúNV<ö úW iû4úNø*
Wø¨ù øhùüûø û4ø*ûbú7V<ö ú ûbú]ø\Wú øhùüû"F) " uø,: ' ûÞý2 ga \ød_D9ø¨ùüû
cýöú" uûSNüö hû û4úNø'
•
ûA>ø<hûÑýöø¨ùM# öúüö "+g<úWcý>ûWû&xúX0hûMú2ý#û_- g<úWcýúUø¨û4ÿùsúüöSNüû
9øWú Mû4ÿbö_DEÿjø¨öú
•
%: dxúEû JQö0£ûö %û ûbú]øjø¨öWú/0uû úO hû - '0£û%Wú û4úüû uö£ÿÿ
#-Húsûbú]ø' WúMú^<üöuø' uö0Wsø¨ûa|øý2 hû uÿùsöø¨û4ÿ4ø hû
•
uû - höûbúWA øhùWúgNø'O 'sùüö£ÿhû <múNøhû xÿbû 3@[8øhùxø#/û #
\ø¨öR-V<öû4ý>!WúW^WúöúNøhû 'xÿ4ø¨ö_Vûûbú7VQö Wú ûbúNø
•
û4úiø¨ùWúgNø'&døWúW "xø*û JQÿùWúWû@ "xøuûføÿ " &üúüöÿxøhûýöøhù
öø'ÿ %Húüûbú]ø'WúMWøhùüû û J<ø¨û hú öÿxøhöúW*
,EûhûøhùüûBüûVû ûbúNø Whû "Wú]ø¨öÿCxú_A)uûhû Vû '<øhûbÿùüúüöSNüûÒùhVû 0û4ûbú
öúNø :sÿbû öúNøOF) " ø',E:*9ö uø&ø¨ùsû(sø¨öú CV<öhöø' &üûhöú`xøuø¨û uú
ý2> û_APsø' "jø¨ûÉýöø¨ùUøhùüûdWûbúüû 'xøhöWúMV< hÿ4ûÂÿ:üû 0ø' 'xÿ4ø
[A<úNø J üû DEúüöø¨öú*;F<ûbÿWúYø¨ùüûMûbÿÞø- höûbú]ø¨û W % ö£ú ýC"üû ø
0søWöúP % uû hû - '0£ûhû "xúNø¨öÿÂÿ %Húüû4úNø*B,ùüöúüû4ý üúsÿ4ø¨öú£öø A <ûúxø
uûSNüö hû9xúNA ' ø' Wú[ "xøhöú+*,ù:øhùüûCsöøhöú\ ûbÿ4ø ú#@VQöhöø'
ÿWúX0û*ÿ %û4ø¨ûA WA<ú öÿU3|ýöøhùsø9 uûbÿ %üöxøhöú8 * FQû4ÿ4øhöWú\ uûhû4úNøø¨ùüûhû
uû "Wú]ø¨öÿø:*
,E! û4û4øýöø¨ùø¨ùüû hÿùüöøhûbÿÞø' uû2 uûSNüö hû iû4úNø'WøhùüûB %: E|øýC hû uÿùüöø¨û4ÿ
-ø hûýCd0Wüö-ø& üúW/Éÿ4ûbú]-ø' '|-øýC hûÿ %Húüû4úN-ø\-øhùüû% û'ûiÿWúN-ø' £û *
F: U uø',E:ö% "üûP!uûVû 'öúüûûbúsûbúNø(|ømýC hûÉÿ %Húüû4úNøiøhùxøÿ
\súüö£ÿxø¨ûýöø¨ùZûxÿù Wø¨ùüû d07A û JQÿùWúöúa[AQúsÿùW ú& û'Wû*",ùüû%bcae
øhûbÿùüúWö£ûU hûXWhû øIû4úüÿ:sûÉø¨ùüûhûP û'û*`mú FQûbÿÞø¨öú 5WøhùüûX %:
hÿùüöøhûbÿÞø' uû&F) " ø',E:ö>üûuÿ hö0ûY*
12úüÿ4û húsö£úø¨ùüûö£ú]ø¨û Wÿ4øhöVû hûSNüö hû ûbúNø:F) " ø',E:ùWú û J<ø¨û4úhö0û9Wú
%:W ýöøhù^<hûÞø@ uû4øhøTA7-T uö£ú]ø¨û @ CV<ö£ûÞý`û ø' Wú_AX0hû^úXbcae
øhûbÿùüúWö£û* xøÉö£ú]ø¨û 'xøhöú WúIø'P0û"û4úZøúüûÞý W£öÿjø¨öú Düû
øhùüû!bdc^e Ujø,öCWhûX CLjø½û JQÿùWúWûd0ûÞøý#ûbû4úÿ %HúsûbúNø>WúPCWú
sûhÿ hösø¨öú;WúûX úsû4ý öÿxøhöúW* ,ùüûuû.ö£ú]ø¨û 'WÿÞø¨ö_VûMüúsÿ4ø¨öú£öø¨öû
hûd uûuûbúNøhû)öúaFQûbÿÞø¨öú*
Q!0HQøUø¨ùüû uû - '0sööøTAf hûSNüö hû ûbúNø F) " uø,:Phû^Wú V<öüûMhû
V7-û 'WVWúsÿbV7-û |øýC hûø¨ûbÿùüúWö£ûMø¨û " öú V uöP hûhû hÿù1ý gN
) "!$#)%!!"!'&:()'0søÑù "ûbúüûAa7xøhùüû uû)ø'Wû4ø¨ùsû *múaWÿ4øý`û0 W£öÿ
-øhöWúWú)ø¨ùüûû iû û4úüÿbû<bdcaeãø¨û4ÿùüúWöûd uû<hûÞø' ( û\üö*Lhöú
íîüôó ðð
mú]ø¨û hú_AF) " uø,: hû&û.J<ø¨ûbúWüû\Wúuø' ú_AøTA)û&0uø 'WÿÞø A<úNø'KJU3QF),@8
sûDEúüöø¨öú B@öø'ø:* ,ùüûö %H uø'WúNø#úWøhöúW /ø¨ùüûhû!üû DEúüöø¨öúC
uûN)-û 'xø WúZøTA)û* ,ùüûUSû 'jø' hû%7xøhùüû uûö£ú]ø'.ú iû hûÞø' ¦ø A:û* ,ùüû
ú!û 'xø ! hûøTA:Sû WúWú ûY* ö hû !\hùPý>ø¨ùsû\üûDüúüöøhöWúOW
ø AOWúûøhö£ú7A
1
* Âû.J "W£ûø¨ùüûû xø' 0ûúÂø'Uø¨ùsû
!,øTA:û#Wúùømý2(úWøhùüû&D uø!úüû öÒø A:û#"$&%<Wú.ø¨ùüû&hû4ÿúWOúüû
øTA)û('*),+*
Formalism of tiny is
Root is %Top;
Top =
program(Decls declarationList, Statements statements);
Decls =
decls(Decl[] declarationList);
Decl =
intDecl(Var variable), booleanDecl(Var variable);
Statements =
statements(Statement[] statementList);
Statement =
affect(Var variable, Exp value),
while(ConditionExp cond, Statements statements),
if(ConditionExp cond, Statements statementsThen,
Statements statementsElse);
ConditionOp =
equal(ArithmeticExp left, ArithmeticExp right),
notEqual(ArithmeticExp left, ArithmeticExp right);
ConditionExp =
%ConditionOp, true(), false(), var;
ArithmeticOp =
plus(ArithmeticExp left, ArithmeticExp right),
minus(ArithmeticExp left, ArithmeticExp right),
mult(ArithmeticExp left, ArithmeticExp right),
div(ArithmeticExp left, ArithmeticExp right);
ArithmeticExp = %ArithmeticOp, int as STRING, var as STRING;
Exp =
%ArithmeticOp, %ConditionOp, var, int, true, false;
Var =
var;
End
- ¼ÕÅNÐ/.PÐ\·mÎN¾10,³W¸ È]¾h×N¿]¼Õ·m¼¹¿f¹bÁ3254768
Wú7AUQF),6sûDEúüöø¨öúYF) " uø,E:`ÿWúXsø "xø¨öÿ_AUûbúüû 'xøhû\ø' sÿ
-ø hûûüö-ø' !û4ÿbö_DEÿ-øf-ø¨ùsû\xúû*@,E( Wÿ4ööøxøhû øhùüû½ûüöøhö£úW 3Bø'>ÿNA7- uøhû
úW:üû'8 @öøö>hû \ø'% "gWûÂøhùüû*ø A:ûÂö£úüÿWhöú
2
Hhö0£û*õûýCWú]øH@ \üÿù$@Hhö0£ûø'Uuû û JQöuø¨öú |ømýC hûÿ "HWúüûbú]ø'!ø¨û
öú" ø¨ùüûÂõ 51 øWú Hüÿù$ø¨ùsû&=:9dc 3 =!<ÿ û4úNø:90WZû4ÿ4øc^:sû8
Q<;Uø' ùxúû`bcae <ÿ ûbú]ø'* søøhùüöOxøuø¨û aQ=;P<ûúWøÿWúhöüû
ø' Wú_AIø A:û`ø' sÿ4ø'W hû*^,Ea UxúüöWjø¨û(ø' Wú_AIø A:û ø' uûbû9ý`ûfùVû>û
JN-øhûbúsû÷öø>ýöø¨ù øhùüû)úWø¨öú(D)Jsû÷úW:üû>öø¨ûqú:üû$Wú øTA)û÷úW:üû]3Bÿ* *
öW hû 8 *#múIø¨ùsö*ýCA\ø¨ùüûø' hû4ûÿúWhöuø¨û4úüÿAZöd 'Wú]ø¨ûbû 0NA)ø¨ùüû VÉøTA:û
-ÿùüû4ÿ.gWû Cxøöøÿúø' sÿ4ø¨öú+* ûWÿù(û 'jø' WF: U uø',E: sø'
Ujø¨öÿ_A%ûbú:-û 'xøhUjø¨öÿ_A%ûbú:-û úüû)ÿPWú ø¨ùüû$<ÿböxø¨û÷ö£ú]ø¨û Wÿ4û]39ö uû$5 hùPý>2ø¨ùüû)ö£ú]ø¨û Wÿ4û
Wûbúüû 'xøhû Âø¨ùüû>&?û 'jø' '8 GWúW úüûföúNøhû [ WÿbûU0NA ø A:û*P,ùüûhû>ÿuû
ÿúNø'Wöú>ø¨ùüû!Wû4øhøhû 9xú uû4øhøhû `úüûbûüû2ø'½ùWúW£ûø¨ùsû!úWd3Bû**A@B"$CEDFHGJIFKh
L
M"$&CEDNG:IFKOK8 *
ø`ö#ö %H øWú]ø#øhùxøø¨ùüû@WúWû@üûhöúüû ,ÿWú(üû DEúüûøhùüûbö xúWû3
0)-ø' 'xÿ4ø!A<ú]øKJ8@0NAMhöú(uøxú a Ujø'#3=!,>= FQÿùüû U8@ Hhû$07AUø¨ùüû
õ 51 xúZúxøúsûbÿbû' hö_AIýöø¨ùIøhùüûöúNø¨û húQF:, üû DEúüöø¨öú "xødCF) "
ø-,E:*/,ùsû hû hûý`ûÉùVûÉö %û ûbú]ø¨ûþÿú7Vû uöWúþø:ýöø¨ù] ûP uûø' höÿ
-øhöWú* !û.JW %û#ø¨ùüûÉúWø¨öú]ø A:ûP<ûúWøû.JWW£öÿböø'_Aþû.Jsöuøiýöø¨ùsö£ú ø¨ùüû
1
PQSRUT=VWXWNVWXYMZ[]\S^_`QVaS\S_`bWXR+getVariableNode(): tiny.ast.VarType
+setVariableNode(tree:tiny.ast.VarType):void
+getValueNode():tiny.ast.ExpType
+setValueNode(tree:tiny.ast.ExpType):void
tiny.ast.AffectNodeImpl
Tiny
DOM
SmartTools
org.w3c.dom.Element
org.apache.xerces.dom.ElementImpl
fr.smarttools.tree.UntypedNodeImpl
fr.smarttools.tree.UntypedNode
fr.smarttools.tree.FixedNode
tiny.ast.AffectNode
fr.smarttools.tree.FixedNodeImpl
tiny.ast.StatementType
- ¼ÕÅNÐÐ亵»»Î]¼¾¨¶µb¶ÀÎxÚ½Á|¹¶·mÎN¾ M2¹Ós¾¨¶µb·¹¶
package tiny.ast;
public interface AffectNode extends StatementType {
public tiny.ast.VarType getVariableNode();
public void setVariableNode(tiny.ast.VarType tree);
public tiny.ast.ExpType getValueNode();
public void setValueNode(tiny.ast.ExpType tree);
}
- ¼ÕÅNÐNâÐ,¾¨¿N¾¨¶µb·¾ÈM29¹Ós¾¨¶µb·¹¶¼Õ¿W·¾¨¶Á|µÀ¾ M2
=,>=4 "xø!ö *û*Zø¨ùsûÉûû ûbú]ø'^3hû4ûbú #û 'xø '8\ úWø<0ûWú ø' ú iû
uû4ø* Q! ø¨ùüöúWø¨öú ýCûuûbúNøhö?ý`û2ù ø$üûDüúüûP.ø A:û2öúWBû uûbúüÿ4ûP
û4ÿù:-xúüö (ø' ÿúNVû uø"=!,>=!*`Q9üöø¨öú_Aø¨ùsûX höù]ø% uø<û£û ûbú]øUsûDEúüöø¨öú
uù ú_AZÿú]øWöú ' ûÞø¨û ûbú]ø¨öø A uûBû hûbúsÿbû½ø'ö£úsö£ÿxø¨ûiø¨ùsûiøTA:û\`ø¨ùüû
úa38û** ø¨ùüûP£öúüû 9ö hû hùWcý>( =!,>=>-mûSNüö_V£û4úNø sûDEúüöø¨öú ø¨ùüû
&û xø' 8 * úW uøüúxøhû_A BûÞý =!,>=!( hûÉý> uöøuø¨ûbúöúþøhùüö!ýChA* ,E/0û
0£ûø'\xÿbÿbûsøCB UxúNAU=,>=!C Hhö0û % uûÿ %£û.JføTA:û!Wú_A:hö3BøTA:û
öúWBû hûbúsÿbûh8,ýCÿ höûMsø*
<!ENTITY % Top ’program’>
<!ENTITY % Statements ’statements’>
<!ENTITY % Statement ’if|while|affect’>
<!ELEMENT program
((%Decls;), (%Statements;))>
<!ELEMENT statements
(%Statement;)*>
!
<!ELEMENT affect
((%Var;), (%Exp;))>
-¼ÕÅNÐ#"NÐ%$µb¶·¹bÁ/·mÎ<¾,Åc¾¨¿N¾¨¶µb·¾ÈiÝ,¸Ýq¹bÁA254768
c^ uû Vû sý`û*ùVû*ö "W£û iû4úNøhû^û4úüû xø' ,øhùxø9W :üÿ4ûd# hû 9Wú2ø¨ùüû
<ÿ4öjø¨û W hû4øuø A7- höúNøhû ø'a "Wúüöxøhû W % ýöø¨ù ^ % hûU hû0ûU
"xøø¨ùWúøhùüû#bcae úsû* øhùüö Hhûø¨ùüû#üûhöúüû *ùø' hV<öüû!û.J<ø' '
jøhø' uö0Qø¨ûöúW "xø¨öú"úiûxÿùfûû û4úNø3 û 'xø' 8 sûDEúüöø¨öú$3 hû4û!jøhø' uö0Wsø¨û
öúöW hû &8.* ,ùüö2Hhö0üö£öøTAföBhû üûuöWúüû `øhùxø W½úWWø#ùVûû J)û ø¨öhû
WúãùPýÖø')ý> höø¨ûXa hû <Wú` "gWû<uûbúuûPWú_A/ & "CWú`üú \0söW
Wúû*
9ö hû& uùcý>dø¨ùsû<û4ÿbö_DEÿjø¨öWúÂøhùxø*ÿWú 0û#ûbúsû 'jø¨ûO xú QF),
affect(Var variable, Exp value)
with attributes {fixed String S1 = "=",
fixed String styleS1 = "kw",
fixed String AO = ";",
fixed String styleAO = "kw"}
-¼ÕÅNÐÐW·m¶µÈNµb·µU¹bÁ·mÎN¾ M2¹Ós¾¨¶µb·¹¶½ÔN»¾hÁ§Ô]ºÁz¹¶Åc¾¨¿N¾¨¶µb·m¼Õ¿]ŵÉÓ<µb¶»¾¨¶½µb¿NÈI·mÎN¾
µ»»¹xÀ¨¼µb·¾È!Ó]¶¾¨·m·MÚxÏBÓ]¶m¼Õ¿x·¾¨¶
•
øhùüûOQ=;"øhùüûOWúû]38ö *¢û* úsû ÿMWúqøhùüû <ÿböxøhû1öúNø¨û xÿbûO0NA
û 'xø xúMúüûÂöúNøhû xÿbûd0NA2øTA)û8
•
øhùüûd0uö£ÿVQöhöø' @hû ÿ hûxø¨öú"hû "WúNøhö£ÿ&WúA:hû
•
hû ø¨ùüûWúû\38ö_\û.J<ø' '&[AQú]øWÿÞø¨öÿ!7 2 hû@ V<ösûX û 'jø'
xøuø' uö0Qø¨ûöúøhùüûdxúûdüû DEúüöø¨öú 8.
•
\ hûÞøhøTAN- höúNøhû ,ø<üúW uûQF),E>Wÿ4ÿ üö£úW!ø'½ø¨ùüûhû*û J<ø '<[A<úNøxÿ4ø¨öÿ7
•
( iöúüö " uû hÿ4û<D£û½ø¨ùxøÑÿWúNøxö£úhû ÒöúW Ujø¨öú$ øhùüû<ø' üÿ4ø hû
ûüöø @WúWUø¨ùüûd hû
•
øhùüû =!,>= øhùüû&FQÿùüû "W*
tiny.g
TinyParser.java
TinyLexer.java
TinyParserTokenTypes.java
TinyParserTokenTypes.txt
TypeChecker.xpro
tiny.xml
AffectNode.java
AffectNodeImpl.java
StatementType.java
...
API of Tiny
tiny.dtd
AbstractTypeCheckerTinyVisitor.java
TraversalTypeCheckerTinyVisitor.java
AbstractTinyVisitor.java
TraversalTinyVisitor.java
tiny.ast
tiny.dtd
or
tiny.xsd
tiny.xsd
Antlr
tiny.xpp
Visitor
Generator
API
Generator
Import
Parser
Generator
Pretty
Printer
Generator
Resource
Generator
DTD
or Schema
Generator
- ¼ÕÅNÐÐ0#ºÕºE·mÎN¾»mÓs¾À¨¼Ø×<Àµb·m¼¹¿N»Åc¾¨¿N¾¨¶µb·¾È!Áz¶¹´êµb¿ 0,³W¸
û JW %ûøhùWúgN½ø'.ø¨ùüûhû2ø:Bûbúsû 'jø' Òøhùüû û4úNV<ö ú û4úNø!ýC
sø' "xøhö£ÿAaûbúüû 'xøhû ú_Aa úüû#QF), ûbÿ4öDüÿxø¨öú;3 hû4û 9ö uû !<û
58 :úüû ) +%IOCdûbÿbö_DEÿxø¨öú 3 hû4û öW hû8>)Wúfø¨ùüûø A:û -ÿùsûbÿgWû CV<öhöø' 3 !$#)#
V%ö£úsû8.*
,ùsö^W0)-Tuûbÿ4øhöWú hûhû4úNø.ýChA:ø' ý> höø¨û/Wú_A:hû 38û*W* øTA)û.-mÿùüûbÿgWû Wú
û Vxø 2ÿ "söû '8úO ' %07A$uö£úÉø¨ùsû#VQöhöø' düûhöú jøhø¨û húY*&
øhùüû hûüû ½ýCxúNøø'ùVûX % uû üû4ø'Wö%xúãû J)WúxøhöWú<ú øhùüö½ý`ûR-TgNúPýú
ûÞø¨ù:AùüûÿWúf uûBû >ø )( #W ! * fö£úWuøxúüÿbûý#û$ hûhûbú]øÉøhù hû4ûû
JN-øhûbúuöWú>\ø¨ùüû!V<öuöø 9jøhø¨û hú2ø¨û4ÿùüúsöSNüûV !höú% uû Eû.JQöV<öø AX ûbÿùWúsö ýöøhù
W % ö£úWYV)5XW£öøhøhö£úÉø¨ùsûø' hû4ûø' hVû '>3V<öuöød û4ø¨ùW)Iÿ8Wúø¨ùüû<uû
"Wú]ø¨öÿ&xÿ4ø¨öú>07AXhöúU % uûÂÿ "W£û.JaûbÿÞø'*
,E "gxûIøhùüû üû Vû ûbúNø^ V<öhöø P0uû Wú÷øhùüû QF), üû DEúüöø¨öúûhöû
F: U uø',E:\sø' "xøhö£ÿA û4úüû 'xøhûøý MVQöhöø' ÿhû
L S% NM" L SI%XWú %HH% L &C " L
SIB%*%,ùüû"0Wuø' Wÿ4øV<öuöø düû4ÿ hû&ø¨ùüû#VQöhöø û4ø¨ùW:(3úüû<0NA
û 'jø' '8 *,,ùüûO% %
L
CU"
L
EI%½öúüùüû höø'C Öø¨ùsû
L
S% NM"
L
SI%&WúÉö %û
û4úNø'#øhùüûUV<öuöø< ûÞø¨ù:½ö£ú` üû ø'aû [ ^üûsøhù)- D uø½ø' uûbûfø 'hVû ?*
,ùsö(VQöhöø' 2ÿWúf0û)û J<ø¨û4úüû Wú öø(V<öuöøX û4ø¨ùW:X uûDEúüû 3 hVû höüû4ú 8fø
ûbÿ4öAMWú^Wú_A)uö*
,ùWúgNø'!ø¨ùsû=) +%MIC\Sû4ÿbö_DEÿjø¨öúaWúû F) " uø,:Eöøö>Hhö0û
ø ûbÿ4öA øhùüûaV<öuöøXhöWúxø hûÉö?*û* ø'`û4úüû xø¨ûaV<öhöø2ýöøhù6üö*Sû hû4úNøÉú û
uû4ø húãøTA)û2xú] ' û4øhû * ,ùüûX 'xú: höøTA øhùüö%û úöIxø¨öú ö%xø
øhùüûa3QF),@8ÑøTA:ûUûVû?*öW hû X hûhûbú]ø'ø¨ùüû ),+!%MIOC ûbÿbö_DEÿxø¨öú CUøTA:û
-ÿùüû4ÿ.gWû +* øhùüö!û4ÿbö_DEÿjø¨öúY/ø¨ùüû\[A)ø¨û sø' "xøhö£ÿA^Wûbúüû 'xøhû
øhùüûøý ÿ hû4ÿ4ø'_A7-øTA:ûXV<öuöø d3
L S%H M" L SI% Wú%HH% L &C " L SIB%8.* 9Ñú_A
WhûW V<öuöø iûÞø¨ù:ùhVûø' 0û@ Vû höüû4ú>ø ö %û ûbú]ø`ø¨ùsûø A:û -ÿùüûbÿgWû 3 uûbû
öW hû " ø¨ùüû &Cû 'xø 8.*@,ùüû#)VWúNø'û&uö£úW D£û$V<öhöø'Ñöø
Vö.ÿuøWúWM0søxö£úM % uûd hû0W£ûV<öuöø' @ %*
XProfile TypeChecker;
Formalism tiny;
import tiny.visitors.TinyEnv;
Profiles
Object check(%Top, TinyEnv env);
Object check(%Decls, TinyEnv env);
Object check(%Decl, TinyEnv env);
Object check(%Statements, TinyEnv env);
Object check(%Statement, TinyEnv env);
String check(%Exp, TinyEnv env);
String check(%ArithmeticOp, TinyEnv env);
String check(%ConditionOp, TinyEnv env);
String check(%ArithmeticExp, TinyEnv env);
String check(%ConditionExp, TinyEnv env);
String check(%Var, TinyEnv env);
Strategy TOPDOWN;
- ¼ÕÅNÐWÐ! `¼»m¼Õ·»m¼ÕÅP¿<µb·mÔ]¶¾»#¹bÁ\µÑ·MÚxÓs¾hÏ8ÀÎN¾ÀÄj¾¨¶Á|¹¶1254768
public Object check(AffectNode node, TinyEnv env) throws VisitorException {
String varName = node.getVariableNode().getValue();
String typeLeft = env.getType(varName);
String typeRight = check(node.getValueNode(), env); //visit the value node
!
if (typeLeft == null)
"
errors.setError(node, "This variable " + varName + " was not declared");
#
else {
$
if (!typeRight.equals(TinyEnv.ERROR) && (!typeLeft.equals(typeRight)))
&%errors.setError(node, "Incompatible types: " + varName + " is a" +
typeLeft.equals(TinyEnv.INT)?"int":"bool") +" variable");
}
return null;
}
õ÷öøhùø¨ùsû:) +%MI OC#WúûEöøö"Huö0W£ûø"û4ÿbö_ AUø¨ùsûÂø' uûbû*ø' 'Vû '
3 ø¨ùüûCø ø¨öú*ú:üû`øø¨ùüûCüûuøhö£újø¨öúú:üû3'88LV<öuöø *G,ù:NWúAø¨ùüû
úW:üûú)ø¨ùüû\xø¨ùO hû&V<öhöø¨ûZöúuøhûOB&ø¨ùsûú:üûø¨ùüû½ø hû4û*ø hûüÿbû
øhùüû"V<öhöø' & üúNøhö ûUú/höIbû0ûfø' uûbû\WúW`0HhVû(øhùüûUuöI4û(`øhùüûUû4úüû 'xø¨û
V<öhöø' * Q sûû4úüûbúüÿbû$ üù xú_A:hö(Wúø¨ùüû^QF), üû DEúüöø¨öú öUû iû
ø ûbúsû 'jø¨û½øhùüûÿ uûHWúüöúM0Wuø' Wÿ4øWú)ø' hVû 'V<öuöø ýöø¨ùø¨ùüû höùNø
V<öhöø'#Wÿ4ÿ üöú.ø'øhùüûUö_Vûbú xøhùY* û.JW %£ûfýöø¨ùøhùüûiø 'hVWû Bû4ÿbö_DEû
Wú 9ö hûWú_AIø¨ùüû"V<öuöø#,øhùüû CMxúi&û 'xø \xúø¨ùüû"V<öhöø'
ø¨ùüû<û xø' *ÿú]øWöúüû/0ûÞøý#ûbûbúZø¨ùsû% :xøU3 !8Wú ø¨ùüûhû%û xø' "38ö *¢û
+!%MIB@ %
L
H$
L
xú %Wÿbÿ sö£ú!ø'ø¨ùüûQF), üû DEúüöø¨öúM 9ö uû !dû
58`ýö 0ûÂÿûY*
Traversal Test:
%Top -> while, affect;
- ¼ÕÅNÐЦ¸¶µÛj¾¨¶»µbº»mÓs¾À¨¼Ø×<Àµb·m¼¹¿Áz¶¹´ ·mÎN¾¶¹x¹·Ü`ß9·¹ 4µb¿NÈ M2
mú F: U uø',E:9ý`û Whû>øhùüû hVa uû Eû.JQöV<öø A` û4ÿùxúüö (øö %£û ûbúNøø¨ùüû
V<öhöø' *ø¨ûbÿùüúüöSNüû(WúZúxøÂø¨ùüûÿhöÿsøhöWú/2Pû4ÿbö_DEÿU û4ø¨ùW:YE_A
sûbúWøhû +A@üû DEúüû6úqûWÿù6Sû 'jø'
3
* múWüûbûYø¨ùüûöúNø :sÿ4ø¨öúfV<öhöø' @ Dû&W ùüö0üöø'> WhöúføhùüöÿhöÿEsø¨öú`3EN +AC ûÞø¨ù: 8.*2Q
Wûbúüû höÿ û4øhù: 38ú iû IFM"
L
S 8ÉöÉû JQû4ÿsøhû1ýùüû4ú Wú7A;V<öhöøM û4øhù:÷ö
ÿ£ûY*<,ùüû%7Gø¨ùüödû4úüû uö£ÿ% û4øhù:ZöÑø'UöúNVgWûø¨ùsû höùNø+V<öuöø û4øhù:
3|ýöøhùa<uø' ú_A7-øTA:û.ú:üû8C0NAXuö£ú" hû üû JQö_VQöøTA*
,ùüû#uû# hû Eû JQö_VQöøTAö! súNø¨ö û -û J)ûbúhö_V]û*,EXWÿ4ÿbû£û 'xøhû½ø¨ùüû½öúNVgWû#
-ÿ4ûHxúUö£úWüö uûbÿÞø¨öúUø0W£û*ö9uøjø¨öÿA :üÿ4û^xøÿ %üöxø¨öú)-Yø¨ö iûÑýùüû4úUø¨ùüû
0uø 'WÿÞø V<öhöø' 9öGûbúsû 'jø¨û+* ,ùüö9ø0û`ÿú]øxö£ú ûWÿù<xö 93û xø' xøTA)û8
øhùüûhVK^ uûBû uûbúüÿ4ûfø'ø¨ùüû%VQöhöøM C&@!%M#"! B$&% '!IFK]0WZû4ÿ4ø ø.ÿ?*2õ÷öø¨ù
øhùüö!ø'0ûöø!ö% Huö0W£ûÉø' ÿùWúWûÉøhùüû V<öuöø% iûÞø¨ù: ú ûPWúWãø' ùVû
sö"Sû uûbúNø@ ûbú]ø'*,ùüö>Qø¨öúUö>#hö %£ö_DEÿxø¨öúM&øhùüû \ø¨öR-T
ûÞø¨ù:M)-W 7ûÞø¨ù:M)-Wÿùø¨ùxøûÞø¨ù:M)-WA<ú öÿ_A"û [ %øhùüû>hû hÿù(Sø¨ùüû>0ûø iûÞø¨ù:ø'&_A*9õ û
ùhVû,ÿ % hûø¨ùüûhû`øý2 7Wÿùüû0NA&höúd hV! \øhö_- û4ø¨ùW:ö %£û
ûbú)-ø'xø¨öú ?* ,ùüû&û "Wúüÿ4û! uûûSNüö_V£û4úNøH0sø @ 7Wÿù.ö@ \üÿù)ûhö£û
ø" uûöI4û*
( *) ,+- /. 10
,ùsûM uû Eû.Jsö_V<öøTA] iû4ÿùWúüö hûþø' ö %û ûbú]øiø¨ùüûXV<öhöø' %xøhøhû húãø¨û4ÿùüúsöSNüû
"gWûø¨ùüû*û JQûbÿsø¨öú^GWüöøhöWúÿ:üûd0û hû 9|øhû `ø¨ùüûV<öhöøÿ9Huö0W£û*
mú1ø¨ùüöýCAdþÿWúüÿbûsøa<Sû4ÿ4ø[-T uö£û4úNøhû % iöú *!':%! ûbÿbö_DEÿ/
>V<öuöø ÿxúa0û&üû.ýöøhùsø %:üö_AQöúføhùüû& uÿbû ÿ:sûHüúögWû ø¨ùsû D uø
Vû uöúW2+Q!ûbÿÞø *!"!h5* Qú(û4ÿ4ø`ÿWúU0û@üûDüúüû Z[uø 07Aö "W£û iû4úNøhö£ú ø¨ùüû
L
+A9ö£ú]ø¨û Wÿ4ûWúøhùüûbúU uûbÿ üû$3 hû4û@ û4ø¨ùW:Bú 9ö hû !$#78GúUxúNA#V<öuöø *
3
2 cVMa \43FYBYMW`Q*bUVZ VW`QY=^R W65 TBR Q_X[MZR aEQ*\SY:TBR87MR WXY95 \S^_`Q3d _jZ&T Y;:R=<1b_XR Z\>7 _`Q _j\SYaEQ8?A@PB\8BF\S^RU_jabYBTBR Q VMaSR*WXRUQEQ aERUVMTV9CWXR DcmYMaERAbUVMQ\EQ8B ZYVMQE5&R b\$BBZY \SaER R*\EaEV#7MR aQSVW bE^Y_Xb R9BBR \Eb8F!\E^VZf\E^R7,l*YMa
Ñû JW %û&ö_ø¨ùsû%û4ÿ4ø 9ö hû!)!!ö hû4ÿ üû ú V<öhöø' ¦öøÑýö9ø' 'xÿbû
sø/ø¨ùüûÂÿûPVQöhöø'*
VisitorImpl
+visit(node:Node,params:Object): Object
#invokeVisit(params:Object[]): Object
+addAspect(aspect:Aspect): void
+removeAspect(aspect:Aspect): void
+addAspectOnOperator(op:Operator,aspect:Aspect): void
+removeAspectOnOperator(op:Operator,aspect:Aspect): void
+addAspectOnType(type:Type,aspect:Aspect): void
+removeAspectOnType(type:Type,aspect:Aspect): void
- ¼ÕÅNÐ .Ð #¼»m¼Õ·¹¶Ã¼Õ·mÎfµ»mÓs¾À¨·Ü§Û#cß*0 $¦å
package fr.smarttools.debug;
import fr.smarttools.tree.visitorpattern.Aspect;
import fr.smarttools.tree.Type;
public class TraceAspect implements Aspect {
public void before(Type t, Object[] param) {
System.out.println ("Start visit on " + param[0].getClass());
}
public void after(Type t, Object[] param) {
System.out.println ("End visit on " + param[0].getClass());
}
}
- ¼ÕÅNÐ .B.PÐ0`»mÓs¾À¨··mÎ<µb··m¶µÀ¾»¹Ô]··mÎN¾ÛW¼Õ»¼Õ·´Â¾¨·mÎN¹xÈ]»
FQûVû '2ûbÿÞø'ÿWú`0ûfÿWúüúüûbÿÞø¨û]Wú`MV<öhöø' *M,ùüûA uûfû JQûbÿsø¨û öú`uû
-SNüû4úüÿbûP3?Wÿ4ÿ üöú>ø'føhùüû\ hûöuø' xø¨öú$ üû 8 *@,ùüöÑÿúsúüûbÿÞø¨öú 3?ý`ûGø¨ùüû
söuÿúüúsûbÿ4øhöWú 8ÿxúM0ûWúüûdxø9 üú]ø¨ö û*,ùüûd0û4ùhV<ö >G\V<öuöø ÿWúÉø¨ùN>0û
%:üö_DEûOWA<ú ö£ÿAa0NA^üöø¨öú$ ýöø¨ùW 'ýCÒø¨ùüûhû<ûbÿÞø'* û JW
#-W£ûWd 'üùüöÿüû0W\ %:üû> øhùüû>V<öuöø ýöø¨ù( ø¨û:-T07AN- uø¨û2û.JQûbÿQø¨öú>ýC
ûbÿ4öDEû dWú û4ÿ4ød hû W£ûd Wú7AaV<öhöø' *\,EMø¨ùüûhû"ûbÿÞø'dúø¨ùüû
V !dV<öuöø Eø¨ùüûdû4úüû höÿ û4ø¨ùW:`3 I1FM"
L
S[8,ýCû J<ø¨û4úüû+*
(
*) ,+ . - /.
õ÷öø¨ùIø¨ùüûÿWúüÿbûsø&CûbÿÞø-T hö£û4úNøhû W % ö£úW¦öøö Hhö0ûiø'PöøÂø¨ùüû
ø hû4ûø 'Vû 93V<öhöød û4ø¨ùW:Iÿ8!Wúøhùüû#hû UxúNø¨öÿ< <ÿ4ûhöú 3hû "Wú]ø¨öÿ%Wÿ
-øhöWú8 *e\û4ø W WHhûø¨ùjøø¨ùsû@V<öhöø`ÿ:üû@/øhùüû<& "$&%O'*) +>û 'jø' ù
øhùüö@hùû
visit(AffectNode node ...) {
codeBefore
visit of the first son
codeBetween1_2
visit of the second son
codeAfter
}
9Ñúüûÿxú^0hû Vûø¨ùxøø¨ùüû uû "Wú]ø¨öÿ& ø#3Bö?*û&\û JQÿbûsøø¨ùüû uûbÿ uöVû½ÿ'8
ö üö_VQöüûiöúNø;ú !Cüö£û4ÿbû@ÿ:sû* ,ùüûhû !Cüö£û4ÿbûÿWú<0û`ø' hûxø¨û<£ögWû
ûbÿÞø'*ýöøhùZúsû4ý HöúNø' Wúsÿù höú\ö*¢û<0û hû 0ûÞøý#ûbû4ú Wú |øhû ø¨ùsû#VQöhöø
ûÞø¨ù:ÿ #ø¨ùüû"ú*fõûiùVû"üûDEúsû`Uúüû4ý V<öhöø' (3Bú û V)5PV<öhöø 8
øhùxøø'gWû(U W iû4úNøU ø' hû4ûUø 'Vû >Wú úüûP < " hûPhû "Wú]ø¨öÿaxÿ4ø¨öú
3Bö?*û*Òö£úfø¨ùüû@ ûbÿÞø'8 uùcýú ú9ö hû !$)* ,ùüö V<öuöø `ÿWú>ÿ@ø¨ùüûhû
ûbÿÞø'9ú>ø¨ùüûhû*úüûÞý HöúNø'CxúüÿùW höú*,ùüû hû hûüøhùüûuûdûbÿ4ø9 \uøùVû
B/3 H
û4øhù:d38ÿ:üûø'\0ûÑû.Jsû4ÿsøhûP0û4ømý`ûbû4úÉø¨ùüûö
th
WúW2ö !th
Wú8 *,ùsö,úüûÞý6V<öuöø `ÿWú2ÿúüúüû4ÿ4ø9Wúüû! % uûû4ÿ4ø9sûhÿ hö0ûUöú>ø¨ùüûV V<öhöø' *
öW hû !h5@hùPý>9øhùüûø A:û -ÿùsûbÿgWû uû "Wú]ø¨öÿ<ÿböxøhûýöø¨ù ø¨ùüûm&? B û 'jø'
WhöúUøhùüö*úüû4ý û4ÿ4ø*\,ùüû hûö*úX % hû# hû4ÿ höVWûiÿGüúögWûø¨ùüû#V !
3hû4û 9ö hû &û &£öúüû N8 BV V<öhöø' 20sø,öø`ö`úüû4ÿbû' [A>ø#WhûøWÿgNd3 uûbû
öW hû !5%ö£úsû &<Wú78#ø'!ø' Wú öøø¨ùüûV<öuöø@ hûø'@øhùüûdúW*
VisitorAspect
+current(): void
+visit(): Object
+invokeVisit(): Object
+backward(): void
+forward(): void
+ignore(): void
+jumpTo(): void
+between(): Object
+before(): void
+after(): void
+addAspect(): void
+removeAspect(): void
+addAspectOnOperator(): void
+addAspectOnType(): void
TreeTraversal
+traverse(node:Node): void
+backward(): void
+forward(): void
+ignore(): void
+jumpTo(): void
Semantic1
+before(): Object
+after(): Object
+betweenN_M(): Object
SemanticN
+after(): Object
+before(): Object
+betweenN_M(): Object
current, visit, before, after
ignore, backward, forward, jumpTo
ignore, backward, forward, jumpTo
before, after, between
- ¼ÕÅNÐ/. Ð\Û]âÛx¼»¼Õ·¹¶
public void before(AffectNode node, Object param) {}
public void between1_2(AffectNode node, Object param) {}
public void after(AffectNode node, Object param) {
String varName = node.getVariableNode().getValue();
String typeRight = (String)typeStack.pop();
!
String typeLeft = (String)typeStack.pop();
"
#
same if code than Figure 8 (lines 6 to 12)
$
}
-¼ÕÅNÐ .âЦ¸&ÚxÓs¾hÏ8ÀÎN¾ÀÄj¾¨¶¹bÁ·mÎN¾ M29¹Ós¾¨¶µb·¹¶
,ùüûø A:û -ÿùsûbÿgWû B* ýCû.J<ø¨ûbúWüûfýöø¨ùUxúiöúüöø¨ö£öIjø¨öúiÿùüûbÿg<ú<V
uö_-0£ûd3hû4ûö hû ! 78Bú_AU0NAfÿ %Huö£úW!øhùüûømý2<û4ÿ4ø'd3hû4ûöW hû !'&8.* ,ùüû
"Wöúö£ú]ø¨û hûøøhùüö % iöú ø A:ûöø'( "gWû½øhùüû½û J<ø¨û4úhöú Wú_A:hû
Hhö0û ýöø¨ùsø %:üöDüÿxøhöú^ú_AP07AMüöúfúsû4ý
û4ÿ4ø*Cmúø¨ùsöýCAHWúR-A:uû< uûU ":W #xú` uû - '0W£û*@cý`û Vû Òø¨ùüûhû Wú_A:hû< hûU % uûfÿ %û J
ø ' 0ûbÿhûMø¨ùüûXW£öøhø¨öú ø¨ùüûXhû "WúNøhö£ÿUWúãø¨ùüû2ø' uûbû2ø' 'Vû '
3Bÿ % hû 9ö uû !h5Mxú Pû 78.* 12W hû4úNøAý`û"uøWAIùPý øMhù uû"xø
0ûÞøý#ûbûbúOhû UxúNø¨öÿY 0û %ö£úgWûø'føhùüû½ÿ % "Wúø hûbûø' 'Vû '238û**ýùxø
ø öWúüûXhû UxúNø¨öÿ!ýCWúNø!ø :]Wú ú:sûMxú úWøø¨ùüûXWøhùüû 8 `ý#û
Oø'WA ûbÿùxúüö "ø'ûhû>ø¨ùüû( ' " öú$ø¨ùsûhûXû4ÿ4ø<0NAùüöüö£úW
øhùüûduøxÿ.g "Wúû ûbú]ø*
fø¨ùsû$V)5 V<öuöø 3hûbû 9öW hû !'8 ø¨ùsû hûöX]`Wûbúüû höÿO iûÞø¨ù: ø¨ùxø
"Wúûiøhùüû.úüû.JQø>ú:üûø/V<öhöøXWÿ4ÿ üöúø'Zø¨ùüû.ÿ uûbú]ø HhöøhöWúY`ø¨ùüûø hûbû
public void before(AffectNode node, Object param) {unplugVariableCheck = true;}
public void visit1(AffectNode node, Object param) {unplugVariableCheck = false;}
public void after(AffectNode node, Object param) {
env.setInitialized(node.getVariableNode().getValue());
}
-¼ÕÅNÐ ."NЦå8¿]¼Õ·m¼µbºÕ¼Þµb·m¼¹¿>ÀÎN¾ÀÄ Áz¹¶·mÎN¾ M2¹Ós¾¨¶µb·¹¶Ü§Û]âÛW¼»m¼Õ·¹¶uß
TypeCheckerVisitor typeCheck = new TypeCheckerVisitor();
TinyEnv env = typeCheck.getEnv();
InitVarCheckerVisitor initVarCheck = new InitVarCheckerVisitor(env);
new Visitor(new LeftToRightTreeTraversal(),
new Semantics[]{typeCheck, initVarCheck}).start(tree, null);
- ¼ÕÅNÐ/. Ðä9¹´*Ós¹P»m¼Õ·m¼¹¿>¹bÁ/·MÃ9¹µ»mÓs¾À¨·»
øhùüûhû hÿù^&ø¨ùsûÂúsû J<ø@ û4øhù:Uø'!ÿ WúWUøhùüû*ö£ú7V<ÿxøhöWúM¦ø¨ùüûV %ûbÿÞø'>ú
øhùüûuûdVQöhöø'*
ïsóôî \óîsòï
F: U uø',E:Ñöÿ %HuûOöúüûûbúüû4úNød|øýC hû\ %:ûø¨ùjøÑÿ " &üúüöÿxøhû
ýöø¨ù ûxÿù Wø¨ùüû &07AZû JQÿùWúöúO[AQúsÿù ú# û'Wû*M,ùüûhû û'Wû< uû
øTA:ûMWúÉÿWúX0û*ÿWúhöüû uû^,ûVû4úNø'*WÿùP %:W£û uûöuøhû
öøhûúPÿ4ûbú)-ø 'E|öøhûúPÿ4ûbú)-ømýC hûÿ %Húüû4úNöøhûúPÿ4ûbú)-ø/öøhûúPÿ4ûbú)-øhùüû# û'û!ÿWúNöøhûúPÿ4ûbú)-ø' £û %3Bÿ* * 9ö hû!8 ø' öuø¨û4ú ø
û!ûbÿ4öDüÿÑøTA)ûC û'Wû*ø`ÿWú uûxÿ4ø`ø ø¨ùüû 07AUHhö0AUHuøhö£ú½úüû4ý
û'û*,ùüûÿúNø û öB uûHWúhö0û "WúöúÂø¨ùüû cý + û'û2Wú
sûöVû höúZø¨ùüû ø ø¨ùüû4ö <ûbÿ4öDüÿ^üûuøhö£újø¨öú 3'8 * ,ùüûUÿ %HúsûbúNø"F) "
ø-,E:" hû2øhù:ûVû4úNø[-T uöVû4úY* ,ùüö"hû4ÿ4øhöú hûhûbú]ø'ø¨ùüûPsö"Sû uûbú]øU %:û"
F: U uø',E:xúMüûhÿ uö0ûøhùüûd0ûbùV<ö >øhùüûd û'ûÿWúNø £û *
Document 1
Document 2
Document GI
View1 / Doc1
View2 / Doc1
View1 / Doc2
Graphic
Interface
(View/DocIG)
Message controller
Document manager
Parser manager
Base
- ¼ÕÅNÐ . Ð0¶ÀÎN¼Ø·¾¨À¨·mÔN¶¾¹bÁ¦³x´µb¶m·¸S¹x¹º»
,ùüû "WöúM|ømýC uûd ":W£û@F) " ø',E: hû*øhùüûPýö£úW
•
Wÿù ÿú]øWöúExú QF),*hmú9ö hû ! W(IFBD
H!
WúW (IFBD
H$
ÿWúNøxö£úiø¨ùsûQF),E2Wúiýùüö£ÿùfø¨ùüû@hû #öý2 gNö£úW*(IFBD
H$ö û4ÿbö
úsû* ø#ÿúNø'Wö£úWøhùüû@QF),;üûuÿ hö0üöú½øhùüû@uø üÿÞø' uû/øhùüû 93Bû**9ø¨ùüû@QF),
&ø¨ùsû ö hû 5%û ! 78 *
•
,ùüû !"$#&%'($#*),+-# ":W£û Uxúû#øhùüû@VQöû4ý>søhùüû! û4ú:CWúfø¨ùsûø:0
•
Wÿù%' öEWúöúüûûbúsûbúNøG %:ûBuùcýöúøhùüûÿú]ø¨û4úNøE9<ÿW iû4úNøöú&
"xøBsûûbúWüö£úW#WúiøhùüûøTA)û@Søhùüû>V<öû4ýd* û.JW %£û) û>V<ö£ûÞý>2söA
øhùüûø hû4ûöú2ÿ hû)-T[AQú]øKJføhû J<ø2 "xø:xø¨ùüû CC 'sùüö£ÿH uû uûhû4úNø'xø¨öúY*
•
,ùüû+ # ! # + + $#,ÿù:hû&øhùüûB höùNøE hû &ø@hûB E>D£û*G,ùüû4úYWöøE üúW
øhùüû( hû #WúW`0sö ø¨ùüûfÿ hûHúüöú$QF),*,ùsû + + $#
uûÑø¨ùsöø' uûbû½ø' 0sö (<ÿ ûbúNød %:W£û<Wú ÿúüúüû4ÿ4øÂöøÑø2øhùüû# û'û
ÿúNø û *
•
,ùüû +!"2ö@< %:ûÂøhùxøÿúNø'Wö£úW@üû DEúüöø¨öú@ uû hÿ4ûWhû.öúaF) "
ø-,E:Eÿ ø A:ûú]ø' iû4ú:WEø':0 Wÿ4øhöúWEû4øhÿ*
9!ÿ hû@úüû4ý øTA:û@G %:W£ûÿWúM hûöø¨û øhùüû %hûVûúUøhùüûd
iûûÿú:-ø û *a,ùxiûûÿú:-øö\úüû(iûûÿú:-ø¨ùüûfý2hA:½iûûÿú:-ø')û J<ø¨û4úãø¨ùsû(Bûxø'W hû\F: U uø',E:& \
ûbÿ4öDEÿ&W Huû ,ø'û \0ûOF) " ø',E:öú^WúWøhùüû ûbú7VQö Wú ûbúNø*
õ÷ùüûbú ( %:W£ûúsûbûWÑø'>ÿ % \üúsö£ÿxø¨ûýöø¨ùOWúWøhùüû ! %:W£ûöøÿ hûxø¨û
û'û&xúPHuøöø>úÉøhùüû ûûÂÿWúNø' £û *,ùsûbúYüø¨ùsûd û'ûÿú]ø' û
0W 7sÿø'`ø¨ùüöC ûûÑø'½øhùüûW uöjø¨û!£öuøhûbúüû 3 %:û8ø¨ùjø,ýö+ hûxÿ4ø
øföø*9,ù:L ":W£ûø¨ùjøýCWúNøø'U hû4ÿbû4öVû\ûbÿ4ö&ø A:û! iûû ø¨ùüû
û'û ÿúNø £û ùhVû*ø'"0û4ÿ û £öuøhûbúüû &ø¨ùüûhûÂø A:û iûû*2,ùsûA
ùhVû½ø'2ö %û ûbú]øÂøhùüû%
L
@
L
H! %fö£ú]ø¨û [ Wÿbû<WúOW V<öüû%%M )F)N)J%
L
@
ûÞø¨ù:a ûVû A.øTA:û\WH uøhûO û'û*,ùüûbúYSøhùüûAùhVû ø( hûöuø¨û !ú
øhùüû\ ûûÿúNø £û <3hû4ûÿ:üûZ[Wuø0ûPý8!WúW$0søxö£ú.ø¨ùüû4ö !üúsöSNüû# %:û
öüû4úNø¨ö_DEû @ öø*
idDoc= msgController.register(this);
)N)J%
L
@ãöú)ø¨ùüû %M " û4ø¨ùW:OøWúW! ø¨ùüû½ÿÒøhùüû½û J)û4ÿ4ø¨û iûû*
cûûM uû)øTA:ûf0)Zûbÿ4ø2ö?*û)ø¨ùsû hû)ö Wúüû$ûbÿbö_DEÿ ÿ( fûVû [A øTA:ûO
û'û* ,ùüû4ö fÿ % %ú 0ûbùhV<ö >ö>ùüû öú;úüûa0ø' 'xÿ4ø>ÿ>øhùxøföiø¨ùüû
û fÿ(dø¨ùsû^ iûû* ûÞý4g<öú( û'Wû2ÿWú;0û.ÿ uûjø¨û;0NA
û.J<ø¨ûbúWüö£úWfø¨ùxøÿ % %ú.ÿ@ >WúNA Wø¨ùsû û.Jsöuøhö£úW( û'Wû ÿ*
múÉøhùüûcýöú!û JW %ûüøhùüû %:W£û*û.J)ûbÿ4øø< hû4ÿbû4öVû C4%
L
@*C I
L
H
JIF9%
L
@ WúmDO%
L
@; iûû#uûbúNø½ø.øhùüû( %:W£û>öüû4úNø¨ö_DEû 0NA K$(IFMWú
ÿ ö£úW" Wú^xúúNA: %@uûbúsû *
msgController.addMsgListener("SelectMsg", idDoc, Msg.ANONYMOUS);
msgController.addMsgListener("CloseDocMsg", idDoc,
Msg.ANONYMOUS);
msgController.addMsgListener("CutMsg", idDoc,
Msg.ANONYMOUS);
=!<ÿW iû4úNø&3Bö?*û!QF),E'8Cxú(V<ö£ûÞý>> hûö£úsûûbúWüûbúNøA hûöuø¨û hûPú>øhùüû!
û[-ûÿú]ø' û * Q <ÿ ûbú]øM<ûÉúWø2úüûbû÷ø gNúPý ùWcý "Wú7A;V<öû4ý>M uû
uûxø¨û ø'2öø*Âõ÷ùüû4ú/ %:üö_DEÿxø¨öúIö "üûøhùüû<<ÿ ûbú]ø Hø'd(
":söDEÿK-øhöWú% ûû*,ùüûøTA:û>@ø¨ùxø û'ûö£úsö£ÿxø¨ûýùüö£ÿù" %:üöDüÿxøhöWúiù0û4ûbú
WúüûWú2ø¨ùüû û'û0H:WA>ÿú]øWöú,øhùüûxø¨ùX\ø¨ùüû %:üö_DEûUú:üû%3 Öø¨ùüû
:Wø#øhùüû>ø' hû4ûh8.* \ ûXgNöú<@ û'Wûø¨ùsûÉÿùWúWûÉö%Oûbÿ4öDüûY*
F:üÿù iûûýö90ûPhûbú]øUWúA ø' ø¨ùüûXV<öû4ý>ø¨ùxø" uûP uûöuøhû hûþø' hû4ÿbûbö_Vû
øhùüûuû& %:üö_DEÿjø¨öú^ ûûÿ ö£úW" ø¨ùsö@W<ÿ û4úNø*m9ø¨ùsû > ":W£ûýö
úWWø@ uûbÿbû4ö_Vûø¨ùüû M*
,ùüûa û'WûÿúNø û fù 0üöø-möú; û'û^Dø¨û höú ÿ0üööø A* øfö
û'û ú øhùüû`ÿúNø û *,ùxøDø¨û höúÑÿ0üööøTA ùG0û4ûbú#üÿ4ÿbûW_A#Whû
GuûVû Wûbÿ4öDüÿúüû4ûW0û4úüÿù " gNöúNüû0Wö£úW7súöúhû xÿ4øhöúW7Wú
sø' "xøhö£ÿA2ø 'WúWjø¨öú" û'ûöúNø'"WúWøhùüû C "xø&3?FO9@Q=;; û'û'8 *
,ùüû# uÿùüöø¨û4ÿ4ø hû\BF: U uø',E:ö!sûhöúüûø'fûuû½ÿWúüúüûbÿÞø¨öúýöø¨ùaWø¨ùüû
sûVû û4úNøû4úNV<ö ú û4úNø'@ ,ø:* F: ûÂû J)û uö û4úNø' 5 hû*öúM hûø
W V<öüû uûVû Bûjø' hû@ F) " ø',E:@õû0^hû V<ö£ÿ4û!WúUø'%hû*ø¨ùüû
!ÿö£û4úNøø:Y súüúüöúUWú^P* , xø P*
ï ôó F\ïþìíî\ïHó
F: U uø',E:ù!d38ÿ* 9ö uû !890hû$ú.ø¨ùsû\W<ÿ û4úNø VQöû4ý>*ÿúüÿ4ûsø
ö *û*ø¨ùüûdhû öúNøhû xÿbûöø¨ùüûd û4ý gÉöúýùüöÿù^VQöûÞý>!ú^%<ÿW iû4úNø<3QF),@8
ÿWú]0ûPüöWAû;WúW "WúsöW xøhûY* ûWÿù û4ú <ÿ ûbú]ø#öøö%Hhö0û
øP0sö/Wú üöWAOúüû< % hû#V<öû4ý> hùWcýöúMüö*/û hûbú]ø&ûbÿÞø' ø¨ùüûø hûbû
xÿbÿ üöúø'!üö"Sû uûbú]ø "xø*Ebdcae2ø¨ûbÿùüúö£û hû`û.J<ø¨ûbúWhö_V]û_A#hû!ø0sö
øhùüö 2xúUø¨ùüûdüö*Sû hû4úNø>VQöû4ý>*
- ¼ÕÅNÐ/. WÐ0#¿¾ ]µb´*Ó]º¾¹bÁ ,¶µbÓ]Î]¼Àµbº`»¾¨¶åM¿x·¾¨¶Á|µÀ¾
Q V<ö£ûÞý ú X<ÿ ûbú]ø ö0üöød07AO_A<ö£úM2ø 'Wú[ "xøhöWú ø'Éöø'QF:,*
õûùVûû.JWû hö ûbúNøhû>ýöø¨ùøý üö*/û hû4úNø2 Wÿùüûødû -ø' hû4ûø' 'xú
"xøhöWúWúW$0üöO 'sùüö£ÿ V<ö£ûÞý>*!,ùüû&D uø Wÿù.ýCø'fý> uöøhû#"VQöhöø'
øhùxøÂø' Wú[ %Âø¨ùsûø' hû4ûUWú/sö uûbÿ4øA 0üöWø¨ùüûiùsö£û ' uÿù7A 2 üùüöÿÿ
#-HWúüûbú]ø'*",ùxøÂýC uø WúZûfÿ4öûbúNø&0sø uûSNüö hûZø'P hû4ÿ %üö£ûiû Vû A øhö û"
ÿùWúWû,ýC úüû,ö£úø¨ùüû`ø' 'xú "xø¨öúY*,ùüû9hûbÿúøhûbÿùüúüöSNüûý2Òø'ûbÿ4öA<
ø hû4ûø 'Wú[ "xøhöWú(uö£úW\bdFWe:, ø\ :üÿbû! 9c^e 3#ûWúXca g:WXe Wúûh8
sûhÿ hösø¨öú^G 'üùsö£ÿ\ÿ %Húüû4úNø'ø'ÿ uûxøhû*,ùüû Ccae uûWøöø¨ùsûbú.öúNøhû
ûiÿböûbúüÿ AiýùüûbúUhöú bdFWe:,fxú9c^eû4úöúüû<ø¨ùüûø¨ûbÿùüúsöSNüûùB Vûfø' 0û
ûhöû ø'"û uúY % uû ûbúøfúsû4ý V<öû4ý üûuöúWLWúUý`û_-Tsø¨û^ >uûbúsö£ú
V<öû4ý>øhù ùúüûÞøý gN*
XSLT
Transformation
BML description
of embedded
graphic components
BML
Interpreter
Graphic components of
the view with style
properties
Base
Style
definitions
Syntax tree
- ¼ÕÅNÐ . 'гWÀÎN¾¨´µ*¹bÁÅP¶µbÓ]Î]¼ÀµbºÛW¼¾¨Ã À¹¿N»m·m¶mÔNÀ¨·m¼¹¿
. .
Q ùüöùüû [- £û Vû9ø 'WúW Ujø¨öú$Wúû/ÿ£û m+O+G/ù!0Sû4ûbúOüûDüúüû ú)ø
CbdF)e), øaûbÿ4öAZø¨ùsû(W hû4øuø A7- höúNøhö£úa2bdcae <ÿW iû4úNø*Mø' Bûxø hû# uû
uö ö Âø'Éø¨ùuû"BbdFWe:, 0søöøöd \üÿù % uûÿúüÿ4öhû % hû% uû0ûUWúZöø
ÿWú^û [ ø 'Wú[ "xøhöWú@úWAXú^0sø hûbû ö£úsÿ hû ûbú]øEW Hhû* ++
ÿúuöø'><uû4ø>E W£ûsûDEúüöø¨öú&3hû4û9ö uû ! 78ýùüöÿùM Ujø¨ÿùPxøhøhû uú,ýöøhù
û.J)£öÿböødV uö0W£û 0sø hûbû*#,ùsûhû<V uö0W£û uû<uûZöú ø¨ùsû< höùNø uø
uûbÿ uöVû ÿ*
Rules
formalism tiny
...
affect(x, y) -> h(x, label("="), y, label(";"));
plus(x, y) -> h(x, label("+"), y);
...
- ¼ÕÅNÐ .;Ð0þÓ<µb¶m·¹bÁ·mÎN¾Ê#Ó]Ói»mÓs¾À¨¼Ø×<Àµb·m¼¹¿
õûùhVûaüûDüúüû Ujøhø¨öú/üúsÿ4ø¨öúO38ùW höIú]ø@ "Vû uøhö£ÿ!£öú û4úNø
öúüû4úNø'xø¨öúYEûÞø¨ÿ*8ø¨ùjø>üûuöúsû @ "hA hû*ø'!ý> uöøhû*ø¨ùüû4ö 9 hûÞøhøTAN- höúNøhû ö£úÉø¨ùüû
uöWùNø% uø%ø¨ùüûX û* õ÷ùüû4ú m+O+ û4ÿbö_DEÿjø¨öú( hû2ø' WúxøhûþöúNøObdFWe:,
ø A:ûuùüûbû4ø'(3hû4û 9ö hû #78 /ø¨ùsû%üûhöúüû úWAúüû4ûIø'Éö£úWüö£ÿxø¨û!øhùüû!û J)ûbÿÞø¨û
sø'Qø( "xø$38ûböø¨ùsû 9c^e @,@cae ø¨û.JQø xøføhùüûa % û4úNø.8%hû @ ø¨ùüû
[A:uø¨û ø' ÿù:hû2ø¨ùsûX höù]ø!ö %û ûbú]øxøhöWú ø¨ùüû "xøhøhö£úW$üúüÿÞø¨öúM3 uûbû
<alias:template match="plus[*[1]][*[2]][count(*)=2]">
<alias:variable name="left" select="./*[1]"/>
<alias:variable name="right" select="./*[2]"/>
<bean class="fr.smarttools.view.GNodeContainer">
<property name="layout">
<bean class="fr.smarttools.view.HFlowLayout"/>
</property>
<add>
<alias:apply-templates select="$left"/>
</add>
<add>
<bean class="fr.smarttools.view.FJLabel">
<args>
<string>+</string>
</args>
</bean>
</add>
<add>
<alias:apply-templates select="$right"/>
</add>
</bean>
</alias:template>
- ¼ÕÅNÐ ÐʳWÌW¸ãÓ]¶¹ÅP¶µb´ Á|¹¶·mÎN¾ ¹Ós¾¨¶µb·¹¶
Parsing
transformation
XSLT
XSLT
transformation
XSLT
transformation
text.xsl
html.xsl
bml.xsl
XSL stylesheet
for text output
XSL stylesheet
for HTML output
XSL stylesheet
for BML output
Xpp file
Typed XML tree
-¼ÕÅNÐ,.PÐ
-¶¹´ Ê`Ó]Ó!·¹*ʳW̸
,ùüû "!#$%"&'%()* m+O+] û\ûbÿbö_DEûÑø¨ùxøøhùüû&£û |ø
xú höù]øM0sø' uûbûM ÉûWÿù +CSD
L
û 'jø' 2ýö0ûIù höIú]øAföúsû Wú
uû 'xøhû`07AIøhùüû+&$uöú+*X,ùüû, Wú- "!#^ "xøhøhö£úWMüúüÿÞø¨öú\ hû"üû DEúüû
öú ø¨ùüûOhVxö0ûOQø'sø "xø'* m+O+-ÿWúf0û û.JQøhûbúsû 07A üöúãúüû4ý
"xøhøhö£úW%súüÿ4øhöúW@üûDüúüûM ûVû AMVWö0£ûdsøsø> "xø*
. 9. . 0/') 9.J+ 9)
9cae Qø'søsû Vû [A>ø 'Wú[ "xøhöWú W£û!û4ÿbö_DEûùcýqø'#0WüöP ùüö£û ' uÿù7A
üùüöÿ<ÿ %HúsûbúNø*F) û2Eøhùüûuû,ÿ %Húüû4úNø uûC<ÿböxøhûýöøhù!ú:üû
ø¨ùüû ø' uûbû/xú hû " gWû * 9Ñøhùüû ^ uû ú_A6[A<úNøxÿ4ø¨öÿ/7 ^Wú uû
Z[Wuø" sö£ú A üùüöÿ90)ZûbÿÞø'a3BúWø% U gWû8 * ,ùüö" " gNöúZøhûbÿùüúüöS:sû)ö"
ÿúNVû4úüöûbúNø&ýChAÑø'>0ûB0ûø@ "xøhÿù&WúNA 'üùsö£ÿ70)Zû4ÿ4ø¦ýöøhù öø'¦ÿ hûHúsö£ú
úW:üûöú>øhùüû!<ÿ ûbú]ø,ø hûbû*Òõ÷ùüûbúX& uø2/ø¨ùüû<ÿ û4úNø`ø' hû4ûö2 %:üö_DEû+Wú
WHxø¨û# iûûöhû4úNø*ø'>ø¨ùüû\VQöû4ý>døhùxøW<ÿ ûbú]ø*&,ùüû<Hxøhû< û'û
ÿúNø'Wöú¦øhùüûxøhù Qøhùüû %:üö_DEû&W0sø' uûbû WúÂøhùüûúüû4ý`0sø' uûbû*G, Wú "xø¨öú
û uû#W£öûø>øhùxøúüû4ý W0sø' uûbû½ø'>ÿ hûxø¨û#(<ÿùüöû hÿùNA^ üùüöÿ
ÿ %Húüû4úNø' +U 'üùsö£ÿE0sø' uûbû*@,ùüû&xø¨ù.ÿú]øWöúüûöú.ø¨ùüû&Hxø¨û& û'û
ööúNøhû W hû4øhû ø¨ùWúWg:½ø'.ø¨ùüû( " gWû ÿ %Húüû4úNø'<Wú ø¨ùüû(0£ûÞø¨û üùüöÿ
ø hû4û %:üö_DEÿjø¨öúY*
+
=ûDEúüöø¨öúd uøTA:ûa3úNø\ÿ \ûÞø¨ÿ*8` uû<uø hûZöú uû 'xøhû<bcae hûW hÿbû
D£ûøhùxø> uû UxúûP0NAfø¨ùsûCuû %:û*õ÷ùüû4ú^\V<öû4ý 3 9Wú7A xø¨ùüû 9
%:)-W£û8úsûbûW ø A:ûö£úW "xø¨öúYø¨ùsûChû> %:û@WhûV<öhöø' ø'DEúU uöxøhû
öúW "xø¨öúö£ú½ø¨ùüûC uû hÿ4û@3 uû uûhû4úNøhûUGQF),E8.* ,ùüû hû> uû`øhù hû4ûCüÿ4ÿbû¨ö_V]û
uû uÿù £û VûED ø\ú Mûbúüû ' hû uÿbûfø hû4ûøhùüûbú úZø¨ùsûfÿ hû4úNø\xúWû
-ûbÿ4öDEÿ uû hÿ4û*ø' hû4ûWúXDEúA úÉøhùüûdWÿÞø¨ö_VûV<ö£ûÞýC-TûbÿböDEÿ hû hÿ4ûÂø hû4û*Q,ø
û Vû [AMø¨ûYEøhùüûd hûøö@hVû 7üû^07A2ø¨ùüûÂúüûÞý>_APüúöúW "xøhöWúY*
6.
Q ûbÿ4öBbdcaefWúû">F) " uø',E:9ÿû C
CSS%Mh9ý2\sûhöúsû
øaüû.-uÿ uö0û,ø¨ùüûCø' üÿ4ø hû9Eø¨ùsû9Whû Òö£ú]ø¨û Wÿ4û* üÿù"!üûuÿ uösøhöWúY)F) " ø',E:
0Wüööødhû ö£ú]ø¨û [ Wÿbû%0NAø' Wú[ öúUø¨ùüö sûhÿ hösø¨öúýöø¨ùIø¨ùüû<bdF)e),
û4ú)-Wö£úüû*,ùüû @öø¨ù:Wú_AaUV<ö£ûÞý ø¨ùsö!üûuÿ hösø¨öú+*9ö uû )"hùPý>sÿù
#üûhÿ uöQø¨öúY 9ö hû5½øhùüûhÿùüû Ujø¨öÿ üùX&öø9QF:, xú9ö uû ! X3 Wû
!$8#ø¨ùüûd uûWøhö£ú*
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE layout SYSTEM "lml.dtd" >
<layout>
<frame title="Smarttools V3">
<set title="InfiniteMultiplication.exp">
<split position="55" orientation="0">
<split position="50" orientation="1">
<view title="Beans view" Type="BmlView" style="default.xsl" />
<split position="70" orientation="1">
<view title="Beans view3" Type="BmlView" style="xml.xsl" />
<view title="EditionStruct" Type="StructEditionView"
style="edstruct.xsl"/>
</split>
</split>
<split position="25" orientation="1">
<view title="Beans view2" Type="BmlView" style="generic.xsl" />
<split position="60" orientation="1">
<view title="GTree" Type="GtreeView" style="" />
<view title="Debug Type="DebugView" style="" />
</split>
</split>
</set>
</frame>
</layout>
-¼ÕÅNÐЦÌE´*ºÕ·m¶¾¾»mÓs¾À¨¼Ø×<Àµb·m¼¹¿f¹bÁ·mÎN¾ `å&¹bÁ
-¼ÕÅPÔ]¶¾J. Ó<µbÅc¾J.
<uôóÒîsôð#í
F: U uø',E:!ù<0û4ûbú]hû ø'$üûVû #SNüöÿg:_A xø'WøTA:û V hö!û4úNV<ö
û4úNø'\9hû Vû '2 "Wöú)- ûbÿ4öDüÿXWúû*^ø'&D uø#ö£ÿxø¨öúW½ý`û
hû(üûüöR-ÿxø¨ûIø2ø¨ùüû<Wúûhû 0NA.ø¨ùüû<[A)ø¨û öø'uû_ &öøÂö0H:Wøuø' û+*
ö£ú)-øWúsÿbû7Sû4ÿbö_DEÿû4úNV<ö úW iû4úNøý`û uûÿ hûjø¨ûø'ÑûsöøÒøhùüûC hûW hÿbû]ø' "Wúüöxøhû
QF), üûDüúüöøhöWú\ V<öhöø\ û4øhù: D£û*Pc^üÿù` % uûfÿ %û J Wú/Hcý`û
frame
set
horizontal
split
vertical
split
vertical
split
vertical
split
vertical
split
DebugView
"Debug"
GtreeView
"GTree"
StructEditionView
"EditionStruct"
BmlView
"Beans view"
BmlView
"Beans view3"
BmlView
"Beans view2"
layout
- ¼ÕÅNÐPâÐ&³WÀÎN¾¨´µb·m¼ÀÅP¶µbÓ]Îi¹bÁ·mÎN¾0³W¸ ¼Õ¿ - ¼ÕÅPÔ]¶¾
Qú½ö£ú]ø¨û 'xøhûû4úNV<ö ú û4úNø hV &<ýCGüûVWûû
4
*öW hû !söA:a uÿbû(D£ûO3[*ZhV8&Wú öø'<<ÿ4öjø¨ûãÿ\Dû 3[*ÿ8&ú`üö*/û hûbú]ø# "xø
3Bö?*û*9uö£ú(üö*/û hû4úNø! hûÞøhøTAN- höúNøhû 8@hùPýú$ú 9ö hû )&)*C,ùsûhû øý
û4úNø' hûdöúgWûYEø¨ù:Wø¨ùüûdhûû4ÿ4ø¨öú)ö£úMúüûd<ÿW iû4úNøöÿ % \üúsö£ÿxø¨û)øø¨ùüû
xø¨ùüû *,ùüûd Uxö£úUø':>ø¨ùsöûbú7VQö Wú ûbú]ø hûd%07A<øhûbÿ:üûøTA:û -mÿùüû4ÿ.gWû !WúW^
07ANø¨ûbÿ:üû&hö \xø' *BQ!ø¨ùüûhûÂø':>hûÂø¨ùsûdV<öuöø @jøhø¨û húUø¨ûbÿùüúüöSNüû\WúÿWú
0û WA<ú iöÿ_Aû J<ø¨û4úüû]3Bû**ýöøhù.ø 'Wÿ4ö£úWU >üû0öú"Bûjø' hû89hö %_AM0NA
ÿúüúüû4ÿ4øhö£ú(ûbÿÞø'*
-¼ÕÅNÐ "NÐ #å¹bÁ·mÎN¾xµÛµ*¾¨¿xÛW¼Õ¶¹¿]´Â¾¨¿x·
Q! øhùüû F) " uø,:# hÿùüöø¨ûbÿÞø' uû>ý2\üûhöúüû ø)ûhöA/)úüû4ýÖÿ
"HK-úsûbúNø hû V:£ûÞø'iÿWú]S:sö£ÿgNA]0ûP hûöuø¨û hû ú øhùüûP û'Wûÿú]ø' û * mú øhùüö
ý2hA¦ý#ûùhVûû.JWû hö ûbúNøhûýöø¨ù/Xüöuø' uö0Qø¨û Vû uöWú/CF) " ø',E:*ø'Uûüöø
W %(úfWú7A;W£ûÞø-mÿ %xøhö0W£û)õû0 0 Pý>hû >øhùWúgN>ø 7V`W£ûÞø*
,ùsö&W£ûÞøÂýCdüûuöúsûøPV<ö£öIbûfÿ %Húüû4úNø'û J) uûhû öú 9cae;WúIø
ùWúûMhû iöúNø¨û 'WÿÞø¨öú* ø"uûiøhùüû ,9,1; xø'<ÿ,øZÿ " \súüö£ÿxø¨ûUýöøhù
F: U uø',E:ø¨ùW WùUuû V:û4ø*Qfû4úüû £öIxø¨öú"ø¨ùsöû.JWû hö ûbúNø39ö uû 78
ý2C#û û höú½õû0PFQû [V<ö£ÿ4û 38ö*û*üúsöøCW V<öüöú#xø\xú uû V<öÿbû
Debug
view
Source
view
Bytecode Document
(.class)
Source Document
(.java)
Evaluator
visitor
Debug
aspect
Packages
view
Classes
view
Methods
view
Instructions
view
links
-¼ÕÅNРЦ¸ÒÎN¾È¼E¾¨¶¾¨¿x·ÛW¼¾¨Ã»¹bÁ/·ÎN¾
-¼ÕÅPÔ]¶¾ "
ø Wøhùüû W£öÿjø¨öú8.*mú)ø¨ùüö "Wúsúüû W£öÿjø¨öúÑÿxú Wÿ4ÿbûÑø'fø¨ùüûhû½õ û0
uû [VQöÿbû V<ö øWúW õû0; Wø<ÿ(Wú;xø Ujø'$3Bû**fbcae2FO9@Q=;B8
ýöø¨ùWsøý2 A<ö£úU0HQøùPý øhùüûdhû V<ö£ÿ4û öö %£û ûbúNøhûY*
Document
BUS
XSLT transformation
BML document
BML player
graphical view
VIEW
XSLT
XSLT transformation
BML document
SERVLET
XSLT
APPLET
BML player
graphical view
WEB SERVICE
WSDL
CLIENT C#
.net
HTTP
SOAP
SmartTools
- ¼ÕÅNÐ Ð#¹Þà ·¹ÂµÀÀ¾»»·¹³x´µb¶m·¸/¹j¹º»
î \ñ ðï
,ùsû hû2 hûB "Wú7AûSNüö_V£û4úNø &ÿ " '0W£û [A)ø¨û " ) "!)!%!$&?*,ùüû Uxö£ú\sö"Sû
-û4úüÿbûöø¨ùxøF) " ø',E:@ø' Wú_AXhû@bcae`xúM0)ZûbÿÞø-T höûbú]ø¨ûUø¨ûbÿùüúWö£û*
múø¨ùüöý2hAH @A:ø¨û ö@ûbú$xú.ÿWúøgWû&WVKWúNø'û Wú7AX uøhùüû @üû
ûbúNø2 "üû! üúW V\WúWUbdcae)øhûbÿùüúöû*ø`ù %úüöAiöúNøhû xø¨û
sö"Sû uûbúNøÂø:dxúIøhûbÿùüúüöSNüû 3Bû**\V<öuöø düûhöú/xøhøhû hú+Eûbÿ4ø8ø¨ùWúWg:*ø
öø'> %: @ uÿùüöøhûbÿÞø' hû&xúù>û4úüû uö£ÿdV<ö£öIjø¨öWú.ø:*
9 VQöhöø' 9 Wÿù2öCø' ú_A(0hûPú>ø¨ùüöC hûhû hÿùÉý2 g # YWúW Vû [A
ÿhû½ø'(Wøhùüû !sûVû û4úNø' &)%! W"!$ *õû½ûhû4úNø¨öA$Whû<Uhö "W£ö_DEûOVû uöú
\øhùüû! \ø¨öR-T ûÞø¨ù: :%!1Söúuø¨ûX Whöú N +A û4øhù:*mú>ø¨ùüö#ýCAsöø`ö
Hhö0û
•
øP0QøWöú \üÿù % hû< uû0£û#V<öuöø dW %"38ö *û* ýöøhùsøÂÿuø.8ø¨ùWúgN
øøhùüû=),+!%MIOC \û4ÿbö_DEÿjø¨öWú
•
ø ûÞø"$hö "W£ûPg<öú !søxøhöVûXW % ö£ú "!':"!Cüûüö£ÿxø¨ûþø W
•
øÉöúNø :sÿbû%xú û4ÿ4ø[-T uö£û4úNøhû ' % ö£úWXú)ø¨ùüû½øOø¨ùsû\VQöhöø'
üû.-uöúfxøuø¨û húY* 9 7Wÿùqö2ÿ " '0W£û)ýöøhù " hû$û4úüû !úüû *!?*
mú F) " uø',E:9ûbÿÞø'>ÿWú;0û^WA<ú iöÿ_Aÿúüúüû4ÿ4ø¨û ø V<öuöø (Wúú
ø 'Wú[ "xøhöWúöúsûbûüûasú£ögWû & *
øhùüû %: hÿùüöø¨ûbÿÞø' uû@ý`û üûhöúüûO% ûû ÿúNø û @hö ö ø
øhùüûX,E:0
5
5 C0sø!öø!ö< uûø' höÿ4øhû ø'OW !úsûbûW*`,ùxø!ýC%SNüöø¨ûPWúãû[AxúUuø 'Wöù]ø ýC "Qø¨öWúY*9õ û@Wúiø uø'WWAiÿ %Húüû4úNø#øhûbÿùüúWö£û3 sÿù
)G19 2Q&¦õû0 FQû [VQöÿbû90)ZûbÿÞøhõû0 û4øhÿ*8 ø'.ö % Vûføhùüû Eû.Jsö0üö£öøTA
9ø¨ùüûúüû J<ø uÿùüöøhûbÿÞø' hû Vû höúY* @xøö£ú]ø¨û 'xøhöú
6
Eý`û hû bcae WúMÿúNø öúNøhû xø¨öú \ø¨öÿuø¨öú] WÿùY*1õ÷öøhùf öúüö UüûVûW iû4úNø
û + uø uö£úWû JQöø¨öú^|øý2 hû!ÿ %Húüû4úNø(3c^Q<;[8 øWú Wø<ÿ
3?FO9@Q=; Wø<ÿ 8 sý`ûÂùVû 0QøWöúüû^%[A:uø¨û ýùüû hûöøöû[AÉø'
•
iöúúüû4ý ÿ %Húüûbú]ø'
•
0sö Püöuø hö0sø¨û ûbú7V<ö ú ûbú]ø½öúÿúüúüû4ÿ4ø¨öúZýöøhù Éõû0/0 cý>uû Ñø¨ùüû
* , xø P
•
ø 'Wú[ öøöúNøU%söø' hö0søhûMVû uöWúaWhö£úW; QÿÞø¨ö_Vû ?*
&öúNøhû Wÿ4øhöVû2 uûSNüö hû û4úNø' 7Wÿù½öüö*/û hû4úNø &ý`û uû
bcae2øhûbÿù)-úWö£û* c^ uû Vû jý`û WAÑø¨ùüûB ûø 'WúW Ujø¨öú %:üû7 \ø¨ùsûB<ÿW iû4úNø
*ý#û ø¨ùsû Sø¨ùjøÂödSNüöø¨û"Wú höö£úýChA$B0üösö£ú T*#,ùsö
Wÿù( "gWû#ø¨ùüûû.J)H uøCYV<öû4ý>CHuö0W£ûøhù Wù>øhùüûúsû4ømý2 gNd3|ø¨ùWúWg:#ø
bcae uû hööIxø¨öú 8.*
,ùüû&W'û 9õ 571 ûbÿbö_DEÿxø¨öú@" hÿ4û "xøøUû4úüû 'xøhûø:ö
hûjø#hû4ø& \F) " uø,:*^e Wúû\sûhöúsû <xú ûbú)- hû ½ÿWú üö hû4ÿ4ø'_A
ø'gWû^WVWú]øWûMø¨ùüûUúú höû4ø A` "xø% hV<ösû;0Wsø(/WhûMWø¨ùüû
õ 51 ø¨ûbÿùüúWö£ûöúhöüû>F) " uø,:*Gmú%õû0%ö£ÿxø¨öú!ÿú]ø¨û J<øø¨ùüö
)-û uøTAÉöö "H uøxúNø> >ö£ÿxø¨öúWö£ú]ø¨)-û )-û '0üööøTA*
ð#íó òfQôð#í
õû>ùVû( hûhûbú]ø¨û ^|ømýC uû(û4úüû xø' ýùüöÿù :sÿbû# ' %
ú ûbú]ø' uø' ú_A"0hû(úUbcaeOWú(0WZû4ÿ4ø[-T uö£û4úNø¨û>øhûbÿùüúWö£û*,ùüû %uø
ö %H uø'WúNøÂÿú]ø' hö0søhöWú/#øhùüö&W 7WÿùZöÂøM Hhû"xø*ø¨ùüû%' ûøhö û"Wú
ýöø¨ùa"súüö ýChAL%hûÞø!)VWúüÿ4ûa ' " öú"Bûxø'W hûöúNøhû xø¨û)öúNø
^ %:W \ uÿùüöø¨û4ÿ4ø hûÒýöø¨ù û J<ø¨û4úhö0ûX 'üùüöÿV<ö£ûÞýöú ûbúWö£úüû<Wú û4ú
ø\bdcae*<õ ûùhVWûÑÿùhûbú2ø'#uû*úWú)-TW uö£ûÞø [AUQ=;T`ø'#0û!ûbúPWúW2ø½øgWû
WVWú]øWû sø'W hû! `û.J<ø¨û uú+üû Vû ûbú]ø'@ üúW>õ 571 û4ÿbö_DEÿjø¨öú* 9Ñú
øhùüû"uû "Wú]ø¨öÿUûVû?&ý`û"W hûuûbú]ø#Psûüöÿxøhû`ûbÿÞø- höûbú]ø¨û/ ' %
ö£úW^)-W 7ö£úW^)-Wÿù <ÿ4öjø¨ûãýöøhùãø¨ùüû(VQöhöø' <üûuöú]xøuø¨û hú ÿ %öWú]ø!ýöø¨ùãø¨ùüûX=:9dc
ûbÿ4öDEÿxø¨öú*õ ûû.JWû4ÿ4ø>\ ûhûÞø9 "Wöú)- ûbÿ4öDüÿxúû#ø#0û!0uû
5
3 ^R 3 Y YMW6CPQ/PQSRUQ cmYMaER?QSY95^_XQ \S_`b V\SRUT ZYM\S_XYMZQJ3FRUaScQ/\SY3^&VZTBWXR?\SaER RUQ$VZTmV bY YaETB_XZV\S_XYMZWXVMZ[MPVM[MR \SYb YMZZRUb\ bYMcA5 Y QSVMZ\EQ
WúIø¨ùüû!õ 571 û4ÿbö_DEÿxøhöWú*U,ùüû%hû (3?WúW üûuöúsû '8d üÿù/Wúû uû
úWWø(WHhûqø 0û)û.J)Sû uø Wúûø¨ùsû uö£û* ,ùüû hû hûý`ûa Hhûa
uû "Wú]ø¨öÿ û4ý2 g!ûA!ø' hû!xúU hûSNüö uö£úW# öúüö " gNúPý>£ûû*=!
"Wöú)-ûbÿ4öDEÿ%Wúû uû uûuûbú]ø& û#HWøhûbú]ø¨öGBöÿxøhöúW*öúOVK hö!DEû
xúUýö\ÿbû uøxö£ú_AUöúNø :üÿ4ûúüûÞý ûbúM 0£û %*
H\ï¦íó?
.F0`»mÓs¾À¨· Ï 0`»mÓs¾À¨·Ï#¶m¼¾¨¿x·¾È $¦¶¹ÅP¶µb´*´*¼Õ¿]Å Ü50 $ß Á|¹¶ xµÛµÐ
Îx·m·mÓ4ÃÃÃе»mÓs¾À¨·|ͨй¶mÅ<Ð
<ÝÑеb·¹¶mÚjÆ`Ð&Ì@¹bÁ|µ»¹]Æ&µb¿NÈ*гx´µb¶µbÅcÈNµbÄx¼»ÞÐ c¸³ 0 ¸¹x¹º,³xÔ]¼Õ·¾!Á|¹¶Ô]¼ÕºÈ¼Õ¿]Å
¾¨¿ `¹xÀµ ,¾¨¿N¾¨¶µb·¹¶»ÞЦå8¿ ~§vku}<~8hh}QyP~zw|r}Qy\r}«hh}sw§}ipsr«¨~zè&y`nhj Æ cÔ]¿N¾
.;1 'Ð
â <Ð9¾¨¶mÅc»·m¶µµb¿NÈ $/Ð,ºÕ¼Õ¿x·ÐÒ¸ÒÎN¾È¼»À¨¶¾¨·¾·m¼Õ´Â¾¸¹x¹º9ÔN»!µÂ»¹bÁ§·MÃÒµb¶¾À¹x¹¶È¼Õ¿<µb·m¼¹¿
µb¶ÀÎ]¼Õ·¾À¨·mÔ]¶¾cÐ psw|h}srm«\r#tQW~8¨#ÒmrPmyÑw£} ÆNâ,.cÜ4ÏMâcß 1Æ PÔ]ºÕÚ>.;1 'Ð
"$ÐÒ¹¶m¶µ»Æ#ÝÑÐ,亾¨´Â¾h¿W·Æ`¸Ð#Ý,¾»mÓs¾¨ÚW¶¹Ô üÆ NÐ`å8¿NÀ¾¨¶mÓ]¼BÆ ÑеbÎ]¿@Æ,Ð#̵b¿]ÅNÆ,µb¿NÈ
ÑÐ$µ»À¨Ô<µbºBÐÉä `¸!0 ! ·mÎN¾½»mÚ»m·¾¨´Ðiå8¿ $/Ð `¾¨¿NÈ]¾¨¶»¹¿@Æ/¾È¼Õ·¹¶Æ 9mrÞumw§}b!rm«
~§v]o#" pk%$9p ¥'&)( pk%$&¦ol psr«¨~zè&y+*9},w£}ü¨uw§}!pQç%#t]rbuw§,Ör}É9myc~zwzy
pür«h~zè&y.-/hØrht0h}<~1*9})/w§mr})h}Q~§ ÆÛj¹ºØÔN´Â¾ "#¹bÁ pk%$&¦Sol ÆÓ<µbÅc¾»*."% "NÐ - ¾¨Ç@Ð
.; ' 'Ð
<ÝÑÐPäÒµb¶¹´Â¾¨ºBÆPÌ&Ð `¾¨¿]¶m¼¹]ÆPµb¿NÈ,ÐP³W¾¨¶mÓs¾¨·m·¾PЦä9¹¿x·¾ W·¦å8¿Á|¾¨¶¾¨¿NÀ¾&Á|¹¶¦³x·µb·m¼ÀA0#¿<µbºÕÚ»m¼»/¹bÁ
xµÛµ`äÒµb¶ÈѳxÎ<µb¶m¼Õ¿]ÅNÐ/åM¿åuÐM0·m·µbºÕ¼µb¿NȸРc¾¨¿N»¾¨¿@Æb¾È¼Õ·¹¶»Æ pÂy¨~.\ym9mr2myÑw£}
yP}Qpü¨Wuwz~zç Æ`Ûj¹ºÕÔ]´Â¾ ,." ¹bÁ S~8©lrc~8u.w§}3\r#tE©psw|©ÆäÒµb¿]¿N¾»ZÜ - ¶µb¿NÀ¾ÞßhÆ
³W¾¨Ó]·¾¨´Çs¾¨¶ ,.PÐQ³xÓ]¶m¼Õ¿]Åc¾¨¶Ï &¾¨¶mºµbÅNÐ
<ÝÑÐäÒµb¶¹´Â¾¨ºBÆá Ð4,ºµbÔN»¾¨¶Æµb¿NÈ NÐ µÚW»»¼¾¨¶¾Pи/¹ÞÃÒµb¶È]»)³W¾µb´*º¾»»ä9¹´*Ó]Ô]·m¼Õ¿]Å
µb¿NÈ.Ëf¾¨·µÀ¹´*Ó]Ô]·m¼Õ¿]Å>¼Õ¿ xµÛµÐåM¿ *ÐSä`Ð - ¹ EÆ@¾È¼Õ·¹¶Æ \r}s¨Wu¨}Q¨ç!9myj~zwzuyP}Q
*¦¤ut]¨uwBh}Qu
Æ<Ûj¹ºÕÔ]´Â¾J.ѹbÁ65
w£hç½y}QÂpsr}N ¦~B
ÆÓ<µbÅc¾» . "jâ . ,.PÆs³W¾¨Ó]·Ð .;1 'Ð
Ð - ¹¶µ EÆ ÐÝ`Ô]¶m¼»Æµb¿NÈ ÑÐ7 ¹ÔN»»¾¨ºBÐ jµÛPµ ËiÔ]ºÕ·m¼ØÏ8Ë>¾¨·mÎN¹xÈ - ¶µb´Â¾¨Ã9¹¶mÄüÐ(åM¿
ku}Q~8hu}syP~zwzrP}Qy8\r}«¨h}Qu r} & hvj}QrPØr2ç r«÷ :9§~z{u ÒuwBh}<~81y}Py;xu yP}Q
pQç4¨~86<
&
` &p>= j@?
ÆA`¹ÞÛsÐ Ð
' Ð µb´*´µÆB Ð `¾¨ºÕ´Æ1 Ð c¹Î]¿N»¹¿@Æ@µb¿NÈ NÐ #ºÕ¼»»¼È]¾»Ð
-uhwC}2yc~|~8hh}]
Ð10È]ȼ»¹¿
á¾»mº¾¨ÚjÆD ¾µÈ¼Õ¿]ÅNÆNË0Æ/.;1 Ð
*Ð `¾È¼Õ¿>µb¿NÈÐ<Ë2µbÅP¿xÔN»»¹¿@Ð xµ»m·0È]ÈE µ xµÛµ4ÏBÇ<µ»¾Èf»mÚ»m·¾¨´ Á|¹¶¼Õ´*Ó]º¾¨´Â¾¨¿x·m¼Õ¿]Å
Áz¶¹¿x·¾¨¿NÈ]»ÞÐÑåM¿UË.ÐüÛPµb¿UÈ]¾¨¿F9¶µb¿Nȵb¿NÈUÝÐ $µb¶m¼ÕÅc¹·Æ¾È¼Õ·¹¶»Æ *9m~zr}Nw|Ñlrc~8u*w£}
& v]mr¨~zwzyG\r#tQ~8h,pü¨w|¨}Qu Æ]Ûj¹ºÕÔ]´Â¾ ""NÐ\º»¾¨ÛW¼¾¨¶`³WÀ¨¼¾¨¿NÀ¾ $¦Ô]Ç]ºÕ¼»mÎN¾¨¶»Æ ,.PÐ
. <Ë)Ð c¹Ô]¶ÈNµb¿@Æ ÝÐ $µb¶m¼ÕÅc¹·Æ½ä`Ð PÔ]ºÕ¼HPÆIÐÂÝ`Ô]¶m¼Õ¿@Ƶb¿NÈ-ä`ÐÂÌ@¾JÒ¾¨ºÕº¾ÀÐ Ý,¾»m¼ÕÅP¿@Æ
åM´*Ó]º¾¨´Â¾¨¿x·µb·m¼¹¿.µb¿NÈ ¦ÛµbºÕÔ<µb·m¼¹¿U¹bÁ&·ÎN¾ - ä&Ï 0·m·m¶m¼ÕÇ]Ô]·¾ `¶µb´*´µb¶³xÚW»·¾¨´Ð,åM¿
\rP}«©¦r}f9ryw§}y}]y;jhK-huwL}.y}QÂktsÕh}Q~ByP~zwzrP}
ÆNÓ<µbÅc¾» 1 Æ