diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/syngen |
Initial commit
Diffstat (limited to 'support/syngen')
-rw-r--r-- | support/syngen/README | 47 | ||||
-rwxr-xr-x | support/syngen/bin/bytecode/syngen | bin | 0 -> 60008 bytes | |||
-rwxr-xr-x | support/syngen/bin/linux-elf/syngen | bin | 0 -> 296632 bytes | |||
-rw-r--r-- | support/syngen/doc/manual.dvi | bin | 0 -> 39760 bytes | |||
-rw-r--r-- | support/syngen/doc/manual.ps | 1344 | ||||
-rw-r--r-- | support/syngen/src/Makefile | 73 | ||||
-rw-r--r-- | support/syngen/src/boxes.ml | 104 | ||||
-rw-r--r-- | support/syngen/src/boxes.mli | 18 | ||||
-rw-r--r-- | support/syngen/src/depend | 14 | ||||
-rw-r--r-- | support/syngen/src/latexcode.ml | 146 | ||||
-rw-r--r-- | support/syngen/src/latexcode.mli | 4 | ||||
-rw-r--r-- | support/syngen/src/lexer.ml | 53 | ||||
-rw-r--r-- | support/syngen/src/lexer.mli | 8 | ||||
-rw-r--r-- | support/syngen/src/main.ml | 53 | ||||
-rw-r--r-- | support/syngen/src/parser.ml | 49 | ||||
-rw-r--r-- | support/syngen/src/parser.mli | 11 | ||||
-rw-r--r-- | support/syngen/src/picture.ml | 123 | ||||
-rw-r--r-- | support/syngen/src/picture.mli | 38 | ||||
-rw-r--r-- | support/syngen/src/syngen.m | 85 |
19 files changed, 2170 insertions, 0 deletions
diff --git a/support/syngen/README b/support/syngen/README new file mode 100644 index 0000000000..bba3f5ea9a --- /dev/null +++ b/support/syngen/README @@ -0,0 +1,47 @@ +Syngen: is a tool for generating syntax diagrams from BNF. The diagrams + are using the LaTeX picture mode and can therefore be integrated + in every LaTeX2e document. + +Version: 0.4, but fairly stable + +Author: Jens Kl"ocker (kloecker@springer.de) + +Contents: src/ -- the complete source code for syngen + bin/ -- two compiled versions: + bin/linux-elf/ - one for Linux in ELF format + bin/bytecode/ - and one bytecode program, executable + only with cslrun + doc/ -- the users manual (dvi, ps) + +Status: Freeware, but if you find it useful please write a nice + postcard to me: Jens Kl"ocker + Gro"se Ringstra"se 27 + 69207 Sandhausen + +Installation +------------ + +1. If possible pick up a binary from bin/ and copy it to a + appropriate position -- that's all. At this time there is + only one for Linux in ELF binary format. If you like, you + can also use the manpage src/syngen.m and install it. + +2. If you don't find a binary for your system, you can use + either the ready compiled bytecode program together with + cslrun or compile syngen for your system: + + edit src/Makefile + make native (for the native code version) + make install + +Caml Special Light +------------------ + +Caml Special Light (CSL) was an experimental ML implementation, written +at INRIA, France, by Xavier Leroy. It is now obsolete -- the +new system is Objective Caml. + +However, you should still get a version of CSL from INRIA. Look at + + host: ftp.inria.fr + directory: lang/caml-light diff --git a/support/syngen/bin/bytecode/syngen b/support/syngen/bin/bytecode/syngen Binary files differnew file mode 100755 index 0000000000..c75fcf06ae --- /dev/null +++ b/support/syngen/bin/bytecode/syngen diff --git a/support/syngen/bin/linux-elf/syngen b/support/syngen/bin/linux-elf/syngen Binary files differnew file mode 100755 index 0000000000..db71f6699f --- /dev/null +++ b/support/syngen/bin/linux-elf/syngen diff --git a/support/syngen/doc/manual.dvi b/support/syngen/doc/manual.dvi Binary files differnew file mode 100644 index 0000000000..b00ea7c7a5 --- /dev/null +++ b/support/syngen/doc/manual.dvi diff --git a/support/syngen/doc/manual.ps b/support/syngen/doc/manual.ps new file mode 100644 index 0000000000..0cffb075ad --- /dev/null +++ b/support/syngen/doc/manual.ps @@ -0,0 +1,1344 @@ +%!PS-Adobe-2.0 +%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software +%%Title: manual.dvi +%%Pages: 9 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentPaperSizes: a4 +%%EndComments +%DVIPSCommandLine: dvips manual.dvi +%DVIPSParameters: dpi=300, compressed, comments removed +%DVIPSSource: TeX output 1996.11.16:1835 +%%BeginProcSet: texc.pro +/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N +/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 +mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} +ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale +isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div +hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul +TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} +forall round exch round exch]setmatrix}N /@landscape{/isls true N}B +/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B +/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ +/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N +string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N +end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ +/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] +N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup +length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ +128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub +get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data +dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N +/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup +/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx +0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff +setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff +.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N +/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id +gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp +add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add +/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{ +dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1 +adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 +idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string +putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval +adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg} +{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{ +adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2 +chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{] +}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup +length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ +cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin +0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul +add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict +/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook +known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X +/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for +65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 +0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V +{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 +getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} +ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false +RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 +false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform +round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg +rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail +{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} +B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ +4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ +p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p +a}B /bos{/SS save N}B /eos{SS restore}B end +%%EndProcSet +TeXDict begin 39158280 55380996 1000 300 300 (manual.dvi) +@start /Fa 1 44 df<13C0A9B51280A23800C000A911147E8F17>43 +D E /Fb 6 121 df<EA7FC0487EA2127F1203A9EBE1FE9038E7FF8001EF7F90B512F0EC +07F89038FC01FC496C7E157E497FA2497F1680150FA6151FA26D14005DA26D137E6D5B14 +019038FF07F8ECFFF001EF13C001E790C7FC3801C1FC212C7FAB25>98 +D<EB1FE0EBFFF84813FE00077F390FF07F80391FC01FC0383F800F90380007E0007E1303 +15F0127C00FC1301A2B6FCA315E000F8C8FC7EA2127C127E15E06CEB01F0381F8003EBC0 +07390FF81FE00003B512C06C148039007FFE00EB1FF81C1F7C9E25>101 +D<EB3FC0EBFFF0000313FC487F380FE07F391F801F80EB000F003EEB07C0A248EB03E0A2 +48EB01F0A86C1303007C14E0A26CEB07C0003F130F391F801F80EBC03F390FE07F003807 +FFFE6C5BC613F0EB3FC01C1F7C9E25>111 D<3801FFCE000713FF121F5A48C6FC00FC13 +3F5A487FA26C130E6C90C7FCEA7F8013FC381FFFE06C13F8000313FE38001FFF01001380 +141F0070EB07C012F814037E14077E6CEB0F80EBC07F90B512005C00FB13F838707FC01A +1F7B9E25>115 D<137013F8A8007FB512C0B612E0A26C14C0D800F8C7FCAF157015F8A4 +EBFC01A290387E07F0EB7FFF6D13C0010F1380903803FE001D287EA725>I<397FF81FFC +39FFFC3FFEA2397FF81FFC3903E007C00001EB0F809038F01F003800F81EEB7C3EEB3C7C +EB3E786D5A130F6D5A5C1303497E497E131E1478497EEB783EEBF81F497E3901E0078000 +0314C03907C003E0397FF01FFED8FFF813FFA2D87FF013FE201F7E9E25>120 +D E /Fc 1 46 df<7E12E012F8B4FC13C013F813FF14E014FEA214E0140013F813C090C7 +FC12F812E0128017126F882A>45 D E /Fd 7 112 df<15C01403EC0F00143C1470495A +EB0780011EC7FC1378EA01E0EA0380000FC8FC123C12F0A2123C120FEA0380EA01E0EA00 +78131EEB0780EB01E0EB0070143C140FEC03C014001A1C7C9823>60 +D<12C012F0123C120FEA0380EA01E0EA0078131EEB0780EB01E0EB0070143C140FEC03C0 +A2EC0F00143C1470495AEB0780011EC7FC1378EA01E0EA0380000FC8FC123C12F012C01A +1C7C9823>62 D<EBF180380389C038070780EA0E03121C123C383807001278A3EAF00EA3 +1410EB1C20A2EA703CEB5C40EA308C380F078014147E9318>97 D<137CEA01C338070080 +EA0E07121E001C1300EA3C0248C7FCA35AA5EA70011302EA3004EA1838EA0FC011147E93 +14>99 D<147C14CEEB019E1303140CEB0700A4130EA3EBFFF0EB0E00A25BA55BA55BA55B +A45B1201EA3180127948C7FC1262123C17297E9F16>102 D<EA01E0120FEA01C0A4485A +A448C7FCA2131FEB6180380E80C0EA0F00000E13E0A2381C01C0A438380380A3EB070400 +701308130E1410130600E01320386003C016207E9F1A>104 D<137CEA01C33803018000 +0E13C0121E001C13E0123C1278A338F003C0A3EB07801400EA700F130EEA3018EA1870EA +07C013147E9316>111 D E /Fe 2 42 df<127012F8A3127005057C8D0D>1 +D<15C0A2156081A28181B612FE81C8EA01C0ED00F0163C160F163C167016C0ED0380B712 +005DC8120C5D5D157015605DA2281A7E972D>41 D E /Ff 55 127 +df<127012F8B012701200A5127012F8A31270051C779B18>33 D<13C01201A3EA07F0EA +1FFC487EEA7DDF3871C780EAF1C3EAE1C7A338F1C0001279127F6C7EEA0FF8EA03FC6C7E +13CFEBC780EA61C312F1A212E1EAF1C73871CF00EA7DDFEA3FFEEA1FF8EA07F0EA01C0A3 +120011247D9F18>36 D<EA03C0487E487EEA1E78EA1C38A4EB7BF813F3EA1EE3000F13C0 +EBC38013831307001F1300EA3F87EA7BCFEA71CEEAF1FEEAE0FCA2EB7870EAF07CEA71FE +387FFFF0383FCFE0381F03C0151C7F9B18>38 D<1238127C127EA2123E120EA3121E123C +127812F812F012C0070E789B18>I<137013F01201EA03C0EA0780EA0F00121E121C123C +123812781270A212F05AA87E1270A212781238123C121C121E7EEA0780EA03C0EA01F012 +0013700C24799F18>I<126012F012787E7E7EEA0780120313C0120113E01200A213F013 +70A813F013E0A2120113C0120313801207EA0F00121E5A5A5A12600C247C9F18>I<1360 +13F0A7387FFFC0B512E0A26C13C03800F000A7136013147E9718>43 +D<123C127E127FA3123F120F120E121E127C12F81270080C788518>I<387FFFC0B512E0 +A26C13C013047E8F18>I<127812FCA412780606778518>I<EA01F0EA07FC487EEA1F1FEA +1C0738380380007813C0EA7001A238E000E0A9EAF001007013C0A2EA780300381380381C +0700EA1F1FEA0FFE6C5AEA01F0131C7E9B18>48 D<EA018012031207A2120F123F12FF12 +FB12631203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<131F5B1377A213E7120113C7EA03 +8712071307120E121E123C1238127812F0B512F8A338000700A6EB7FF0A3151C7F9B18> +52 D<383FFF80A30038C7FCA8EA3BFCEA3FFE7F383E0780383803C0380001E01300A212 +6012F0130100E013C0EAF003387C0F80383FFF006C5AEA07F8131C7E9B18>I<137E48B4 +FC00071380380FC3C0EA1F03123C383801800078C7FC1270A2EAF3F8EAEFFEB5FC38FE0F +8038F803C0EAF00114E01300A312701301007813C0EA3C03381E0F80380FFF006C5AEA03 +F8131C7E9B18>I<EA03F8EA0FFC487EEA3E0F3878078038F003C0EAE001A214E0A312F0 +EA7803EA3E0FEA1FFFEA0FFEEA03F8EA000114C0A2130300301380EA7807EB0F00133EEA +3FFC6C5AEA0FE0131C7E9B18>57 D<123C127EA4123C1200A81238127C127EA3123E120E +121E123C127812F01260071A789318>59 D<14C0EB03E01307EB1FC0EB3F80EBFE00485A +EA07F0485AEA3F8048C7FC12FCA2127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07 +E01303EB00C013187E9918>I<387FFFC0B512E0A26C13C0C8FCA4387FFFC0B512E0A26C +13C0130C7E9318>I<126012F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07 +E0A2EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FC5A126013187E9918>I< +EA0FF8EA3FFE487E38F80F80EAF003A2130738001F00133E13FCEA01F05B485AA55BC8FC +A5EA0380487EA36C5A111C7D9B18>I<137013F8A213D8A2EA01DCA3138CEA038EA4EA07 +07A5380FFF80A3EA0E03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>65 +D<EA7FF8EAFFFE6C7E381C0F80130314C01301A313031480130F381FFF005BA2EA1C0FEB +07801303A5149CA3007F13FC38FF81F8387F00F0161C7F9B18>82 +D<383FFFE05AA2387001C01303EB07801400C65A131E131C133C5B137013F0485A5B1203 +485A90C7FC5A001E13E0121C123C5A1270B5FCA3131C7E9B18>90 +D<EAFFF8A3EAE000B3ACEAFFF8A30D24779F18>I<126012F07EA21278127CA27EA2121E +121FA26C7EA212077FA26C7EA26C7EA212007FA2137CA2133C133EA27FA27F1480A21307 +EB030011247D9F18>I<EAFFF8A3EA0038B3ACEAFFF8A30D247F9F18>I<387FFFC0B512E0 +A26C13C013047E7F18>95 D<EA0FF0EA1FFC487EEA3C1F38180780EA0003A213FF120F5A +EA7F83EA780312F012E0A2EAF007EA7C1F383FFFF8EA1FFDEA07F015147E9318>97 +D<127E12FE127E120EA5133EEBFF80000F13C0EBE3E0EB80F0EB00701478000E1338A512 +0F14781470EB80F0EBC3E0EBFFC0000E138038067E00151C809B18>I<EA01FEEA07FF00 +1F1380EA3F07383C030048C7FC127012F05AA47E1270387801C0123CEA3F07381FFF8000 +071300EA01FC12147D9318>I<EB1F80133F131F1303A5EA03F3EA0FFBEA1FFFEA3E1FEA +780FEA700712F0EAE003A5130712F01270EA780FEA3E3F381FFFF0380FFBF83803E3F015 +1C7E9B18>I<EA03F0EA0FFC487EEA3E1F38780780EA700300F013C0EAE001A2B5FCA300 +F0C7FC1270387801C0123CEA3F07381FFF8000071300EA01FC12147D9318>I<EB1FC0EB +7FE013FFEA01F1EBC0C01400A3387FFFC0B5FCA23801C000AEEA7FFFA3131C7F9B18>I< +3803F1F03807FFF85A381E1F30383C0F00EA3807A5EA3C0FEA1E1EEA1FFC485AEA3BF000 +38C7FC123CEA1FFF14C04813E0387801F038F00078481338A36C1378007813F0EA7E0338 +3FFFE0000F13803803FE00151F7F9318>I<127E12FE127E120EA5133FEBFF80000F13C0 +EBE1E013801300A2120EAA387FC7FC38FFE7FE387FC7FC171C809B18>I<EA0380EA07C0 +A3EA0380C7FCA4EA7FC012FF127F1201AEB5FCA3101D7C9C18>I<127E12FE127E120EA5 +EB3FF0A3EB0780EB0F00131E5B5B5BEA0FF87F139C131EEA0E0FEB0780130314C0387FC7 +F812FF127F151C7F9B18>107 D<EAFFC0A31201B3A4B51280A3111C7D9B18>I<38FBE3E0 +38FFF7F0EBFFF8383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318>I< +EA7E3F38FEFF80007F13C0380FE1E013801300A2120EAA387FC7FC38FFE7FE387FC7FC17 +14809318>I<EA01F0EA0FFE487E383E0F80EA3803387001C0A238E000E0A5EAF0010070 +13C0EA7803383C0780EA3E0F381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF8000 +7F13C0380FE3E0EB80F0EB00701478000E1338A5120F14781470EB80F0EBC3E0EBFFC000 +0E1380EB7E0090C7FCA7EA7FC0487E6C5A151E809318>I<38FF0FC0EB3FF0137FEA07F8 +EBE060EBC0005BA390C7FCA8EAFFFC7F5B14147E9318>114 D<EA0FF7EA3FFF5AEAF81F +EAE007A212F0007CC7FCEA7FF0EA1FFCEA07FEEA001F38600780EAE00312F0130738FC0F +00B5FC5BEAE7F811147D9318>I<487E1203A4387FFFC0B5FCA238038000A9144014E0A2 +1381EBC3C0EA01FF6C1380EB7E0013197F9818>I<387E07E0EAFE0FEA7E07EA0E00AC13 +01EA0F073807FFFC6C13FE3801FCFC1714809318>I<387F8FF000FF13F8007F13F0381C +01C0380E0380A338070700A3138FEA038EA3EA01DCA3EA00F8A2137015147F9318>I<38 +7F8FF0139F138F380F0700EA078EEA039EEA01DC13F81200137013F07FEA01DCEA039E13 +8EEA0707000E1380387F8FF000FF13F8007F13F015147F9318>120 +D<387F8FF000FF13F8007F13F0380E01C0EB0380A21207EB0700A2EA0387A2138EEA01CE +A213CC120013DC1378A31370A313F05B1279EA7BC0EA7F806CC7FC121E151E7F9318>I< +383FFFF05AA2387001E0EB03C0EB078038000F00131E137C5B485A485AEA0780380F0070 +121E5A5AB512F0A314147F9318>I<EB07E0133F137FEBFC0013E0AB1201EA7FC0485AA2 +6C7EEA01E01200AB13FCEB7FE0133F130713247E9F18>I<126012F0B3B012600424769F +18>I<127CB47E7FEA07E01200AB7FEB7FC0EB3FE0A2EB7FC0EBF0005BAB1207B45A5B00 +7CC7FC13247E9F18>I<EA0E0CEA1F1EEA3FBEEAFBF8EAF1F0EA60E00F067C9B18>I +E /Fg 4 16 df<12FEEAFFE0EA01FCEA001FEB03C0EB00F01438141E14076E7E6E7E6E7E +1570811518151C150C150E150615078116801501A216C01500A316E01660A62323A18142 +>12 D<1660A616E016C0A415011680150316005D1506150E150C151C151815385D5D4A5A +4A5A4AC7FC141E143814F0EB03C0011FC8FCEA01FCEAFFE048C9FC2323A1A242>I<12C0 +A67E1260A41270123012381218121C120C120E120612077E7F6C7E6C7E13707F7F130FEB +0380EB01E0EB0078141FEC07F0913800FFE0150F232380A242>I<ED0FE015FF913807F0 +00021FC7FC1478EB01E0EB0380010FC8FC131C5B5B5B485A485A90C9FC5A1206120E120C +121C1218123812301270A21260A312E05AA62323808142>I E /Fh +4 64 df<1302131E137EEA01FE120F12FFA2120F1201EA007E131E13020F0C7E852A>27 +D<7E12F012FCB4FC13E013FEA213E0130012FC12F012800F0C67852A>45 +D<1206A4120FA3EA1F80A2EA3FC0A2EA7FE0A3EAFFF00C0F86A72A>54 +D<EAFFF0EA7FE0A3EA3FC0A2EA1F80A2EA0F00A31206A40C0F86902A>63 +D E /Fi 24 121 df<12FEA707077C860F>46 D<137013F81203127F12FFA312431203B3 +A6387FFFC0B5FCA27E12247CA31B>49 D<EA01FCEA07FF001F13804813C04813E0EA7E0F +38FC07F012F8387803F81238123012101200A3EB07F0A2EB0FE014C0131F1480EB3F0013 +7E5B5B485A485A485A485AA248C7FC383FFFF04813F8A36C13F015247EA31B>I<EA01FC +3807FF804813C04813E0EA3F0F387C07F01238123012101200A214E0130F14C0131F3801 +FF80140014C014E0380007F0EB03F8130114FCA612401260387803F8EAFE07B512F06C13 +E06C13C0000F13803801FE0016257EA31B>I<EB1FC0EB3FE0A2137FA213F7A2120113E7 +1203A2EA07C7A2120F1387121F1307123F123E127E127C12FCB512FE14FFA36C13FE3800 +07E0A7EB03C018237FA21B>I<EB0FF0497E497EA3497E137E147EEBFE7FA213FC0001EB +3F80A33903F81FC0A3D807F013E0140FA2D80FE013F01407A248B512F8A34814FCEB8001 +A2D87F0013FE1400A200FE14FF157F007C143E20237EA225>65 D<387FFFF0B512FC14FF +158039FE007FC0141FEC0FE0A21407A2140FA2EC1FC0143FECFF80B6120014FC14FF15C0 +39FE003FE0EC0FF01407EC03F8A6EC07F0140F143FB612E015C015006C13F81D237CA225 +>I<EB0FF8EB7FFF48B512C0000714F0390FF80FF8391FE003FCEBC00148486C7EA248C7 +127FA3007E8000FE1580AC007FEC7F00A36C6C13FEA26C6C485AEBE003390FF80FF86CB5 +5A000114C06C5CD90FF8C7FC21257DA328>79 D<48B4FC000F13C04813E014F0381E07F8 +EA180312101200A2137FEA07FFEA1FE3EA3F83EA7F0312FEA31307EA7F0F13FB123FEA1F +E33807C1F015177F961A>97 D<EA01FE3807FFC0001F13E05A1383387F00C0007E134000 +FE1300A9007F13101470383F81F013FF7E000713C03801FE0014177E9618>99 +D<14F8EB01FCABEA03F1EA0FFDEA1FFF5AEA7F831301127E12FEA9127E127F1387EA3FFF +EA1FFDEA0FF93803F0F816237EA21C>I<48B4FC000713C04813E0003F13F0EB83F8EA7F +0114FCEAFE00A3B5FCA214F848C7FCA3007F13081438383FC0F813FF120F6C13E0C61380 +16177F9619>I<3801FE0E380FFFDF4813FF4813F3EB87F0387F03F8A6383F87F013FF6C +13E014C03819FE000038C7FC123C383FFFC014F86C13FC14FE5A4813FF38FC007F48131F +A36C133F007F13FE13FF6C13FC000F13F0000313C018227F961B>103 +D<12FC12FEA512FC1200A6127C12FEB3A3127C07247EA30C>105 +D<127C12FEB3AF127C07237EA20C>108 D<3A7C0FC01F803AFE3FF07FE090397FF8FFF0 +D9FFFD13F839FFC3FF87903801FE03A200FE13FCAF3A7C00F801F025177D962C>I<387C +1FC038FE3FE0EB7FF0EBFFF8EAFF871303A212FEAF387C01F015177D961C>I<13FF0007 +13E0001F13F84813FC1381387F00FE007E137E00FE137FA9007F13FEA2383F81FC13FF6C +13F8000713E00001138018177F961B>I<387C1F8038FE7FE0B512F0A2EB07F8EAFE0314 +FC1301A9EB03F8A2EAFF0FEBFFF014E04813C0EB3F0090C7FCA9127C16217D961C>I<EA +7C1CEAFE3C137C13FC12FF13E013801300A25AAD127C0E177D9613>114 +D<EA07F848B4FC003F1380A2EA7C0FEB03007F007EC7FCEA7FE0EA3FFC7F6C7E6C138000 +0313C0EA003FEA400712601270EAFC0FB512801400EA3FFEEA07F812177F9615>I<EA0F +80487EA5EA7FFEB5FCA26C5AEA1FC0AD13C113E3380FFF80A23807FE00EA03F0111D7F9C +14>I<387C01F038FE03F8B01307A2130FEA7FFBEA3FF3380FC1F015177D961C>I<387C01 +F8EA7E03007F13F0383F87E0EA1F8F380FCFC0EBFF806C13007E6C5A6C5AA2487E12037F +3807DF80380FCFC0381F87E0123FEB03F0387E01F800FE13FC387C00F816177F9619> +120 D E /Fj 1 66 df<13101338A3135CA3138EA3EA0107A238020380A33807FFC0EA04 +01A2380800E0A2001813F0123838FE03FE17177F961A>65 D E /Fk +16 90 df<1306A3130FA3EB1780A2EB37C01323A2EB43E01341A2EB80F0A338010078A2 +EBFFF83802003CA3487FA2000C131F80001E5BB4EBFFF01C1D7F9C1F>65 +D<B512C0380F00788080140E140FA4140E141E5C14F8EBFFF0EB003C8080801580A5EC0F +00A2141E1478B512E0191C7F9B1D>I<90381F8080EBE0613801801938070007000E1303 +5A14015A00781300A2127000F01400A8007014801278A212386CEB0100A26C13026C5B38 +0180083800E030EB1FC0191E7E9C1E>I<B512FC380F003C140C1404A214061402A21301 +1400A35B13FF13037FA3140113001402A31406A2140C143CB512FC181C7E9B1C>69 +D<B512F8380F007814181408A2140C1404A213011400A35B13FF13037FA490C7FCA8EAFF +F8161C7E9B1B>I<90381F8080EBE0613801801938070007000E13035A14015A00781300 +A2127000F01400A6ECFFF0EC0F80007013071278A212387EA27E6C130B380180113800E0 +6090381F80001C1E7E9C21>I<39FFF0FFF0390F000F00AC90B5FCEB000FAD39FFF0FFF0 +1C1C7F9B1F>I<EAFFF0EA0F00B3A8EAFFF00C1C7F9B0F>I<EAFFF8EA0F8090C7FCB01408 +A31418A2141014301470EB01F0B5FC151C7E9B1A>76 D<B46CEBFF80000FECF800A2390B +C00178A33809E002A23808F004A3EB7808A3EB3C10A3EB1E20A3EB0F40A2EB0780A3EB03 +00121C3AFF8307FF80211C7E9B26>I<B4EB1FF0390F8003809038C00100120BEA09E0EA +08F0A21378133C133E131E130F14811307EB03C1EB01E114F113001479147D143D141FA2 +808080121CB46C7E1C1C7F9B1F>I<EB3F80EBE0E03803803848487E000E7F487F003C14 +8000381303007814C0A20070130100F014E0A8007014C000781303A200381480003C1307 +001C14006C130E6C5B6C6C5A3800E0E0EB3F801B1E7E9C20>I<B5FC380F01E0EB007880 +141C141EA4141C143C5CEB01E001FFC7FCEB01E0EB0070147880A61510A2141CA239FFF0 +0E20C7EA03C01C1D7E9B1F>82 D<3807E080EA1C19EA30051303EA600112E01300A36C13 +007E127CEA7FC0EA3FF8EA1FFEEA07FFC61380130FEB07C0130313011280A300C01380A2 +38E00300EAD002EACC0CEA83F8121E7E9C17>I<007FB512C038700F0100601300004014 +40A200C014201280A300001400B1497E3803FFFC1B1C7F9B1E>I<39FFF003FC390F8001 +E00007EB00C06D13800003EB01006D5A000113026C6C5A13F8EB7808EB7C18EB3C10EB3E +20131F6D5A14C06D5AABEB7FF81E1C809B1F>89 D E /Fl 11 85 +df<1418A21438A21478A214B8EB0138A2EB023C141C1304130C13081310A21320A2EB7F +FCEBC01C1380EA0100141E0002130EA25A120C001C131EB4EBFFC01A1D7E9C1F>65 +D<48B5FC39003C038090383801C0EC00E0A35B1401A2EC03C001E01380EC0F00141EEBFF +FC3801C00E801580A2EA0380A43907000F00140E141E5C000E13F0B512C01B1C7E9B1D> +I<903803F02090381E0C6090383002E09038E003C03801C001EA038048C7FC000E148012 +1E121C123C15005AA35AA41404A35C12705C6C5B00185B6C485AD80706C7FCEA01F81B1E +7A9C1E>I<48B512F038003C00013813301520A35BA214081500495AA21430EBFFF03801 +C020A448485A91C7FCA348C8FCA45AEAFFF01C1C7E9B1B>70 D<903803F02090381E0C60 +90383002E09038E003C03801C001EA038048C7FC000E1480121E121C123C15005AA35AA2 +903801FF809038001E00141CA400705BA27E001813786C139038070710D801F8C7FC1B1E +7A9C20>I<3A01FFC3FF803A003C00780001381370A4495BA449485AA390B5FC3901C003 +80A4484848C7FCA43807000EA448131E39FFE1FFC0211C7E9B1F>I<EA03FFEA00781370 +A413E0A4EA01C0A4EA0380A4EA0700A4120EA4121EEAFFC0101C7D9B10>I<3801FFC038 +003C001338A45BA45BA4485AA438038002A31404EA0700140C14181438000E13F0B5FC17 +1C7E9B1A>76 D<D801FEEB01FED8003E14E0012EEB03C01505A21509014EEB0B80151315 +2313470187EB4700A21587EC0107D80107130E14021404A20002495AEB0388149014A000 +045C14C0A2000C1380001CEB007839FF8307FF271C7E9B25>I<D801FCEBFF80D8001CEB +1C00012E13181510A2132701475B13431480A2903881C040A3EB80E0D801005B1470A300 +020139C7FCA3141D48131E140EA2120C001C1304EAFF80211C7E9B1F>I<001FB512C038 +1C070138300E0000201480126012405B1280A2000014005BA45BA45BA4485AA41203EA7F +FE1A1C799B1E>84 D E /Fm 39 128 df<121C123CA41204A21208A212101220A2124012 +80060E7D840E>44 D<EA7FF0EAFFE0127F0C037D8A10>I<127012F8A212F012E005057B +840E>I<1207120F121FA2120E1200AA127012F8A212F012E008147B930E>58 +D<14021406A2140E141EA2143F142F144F14CF148FEB010FA21302A213041308A2011013 +8014071320EB3FFFEB40071380A2EA0100A2120212061204001E14C039FF807FF81D207E +9F22>65 D<48B512C039001E00F015781538153C5BA4491378A215F0EC01E09038F00780 +9038FFFE009038F00F80EC03C03801E00115E0A3EA03C0A315C038078003EC0780EC0F00 +141E380F007CB512E01E1F7D9E20>I<90B5128090381E00E015701538151C5B150EA35B +A449131EA44848133CA3157848481370A215E0EC01C0380780031580EC0E005C380F0070 +B512C01F1F7D9E22>68 D<48B512FE39001E001C150C1504A25BA490387804081500A214 +0C495AEBFFF8EBF018A23801E010A3EC001048481320A21540A248481380140115001407 +380F001FB512FE1F1F7D9E1F>I<48B512FC39001E003815181508A25BA4491310EC0800 +A3495A1430EBFFF0EBF0303801E020A44848C7FCA4485AA4120FEAFFF81E1F7D9E1E>I< +ECFC04903807030C90381C00980130137813E04848133848481330A248C7FC120E001E14 +20A2481400A25AA45AECFFF0EC0780A2EC0F001270A3141E7E0018133E001C132E6C13CC +38038304D800FCC7FC1E217A9F23>I<D801FEEC7FC0D8001EECFC005E0117EB0178A201 +27EB02F01504A215080147EB09E015111521A20187495AEB83801583A23A010381078014 +82A2148400024AC7FC14881490A2390401E01EA214C0000C1380001C143E3AFF8103FFC0 +2A1F7D9E29>77 D<01FFEB3FE0011FEB0F001504EB1780A201275BEB23C0A3903841E010 +A214F0134001805B1478A348486C5AA3141E00025CA2140FA24891C7FC80A2120C001C13 +02EAFF80231F7D9E22>I<EB01FCEB070790381C01C090383000E001E013604848137048 +5A0007143890C7FC120E121E121C123CA2481478A44814F0A215E0140115C01403007014 +80EC070000785B0038131E5C6C13706C5B38078380D801FCC7FC1D217A9F23>I<48B512 +8039001E00E015701538153C5BA4491378A215F015E09038F003C0EC0F00EBFFFC01F0C7 +FC485AA4485AA4485AA4120FEAFFF01E1F7D9E1F>I<903807E04090381C18C090383005 +80EB600313C000011301018013001203A391C7FC7FA213F86CB47E14E06C6C7E131FEB01 +F8EB0078A21438A21220A2143000601370146014E000705B38E80380D8C606C7FCEA81F8 +1A217D9F1A>83 D<EBF180380389C038070780EA0E03121C123C383807001278A3EAF00E +A31420EB1C40A2EA703C135C38308C80380F070013147C9317>97 +D<EA0780123FEA0700A4120EA45AA213F0EA1D0CEA3A0E123CEA380FA21270A4EAE01EA3 +131C133C1338EA607013E0EA31C0EA1F0010207B9F15>I<137EEA01C138030080EA0E07 +121E001C1300EA3C0248C7FCA35AA5EA70011302EA3004EA1838EA07C011147C9315>I< +1478EB03F8EB0070A414E0A4EB01C0A213F1EA038938070780EA0E03121C123C38380700 +1278A3EAF00EA31420EB1C40A2EA703C135C38308C80380F070015207C9F17>I<137CEA +01C2EA0701120E121C123CEA3802EA780CEA7BF0EA7C0012F0A4127013011302EA3804EA +1838EA07C010147C9315>I<1478EB019CEB033CA2EB07181400A2130EA5EBFFE0EB1C00 +A45BA55BA55BA5485AA35B1231007BC7FC12F31266123C1629829F0E>I<EB1E30EB7138 +EBE0F03801C070EA03801207EB00E05AA3381E01C0A4EB0380A2EA0E07130B38061700EA +01E7EA0007A2130EA21230EA781C485AEA6070EA3FC0151D7F9315>I<EA01E0120FEA01 +C0A4485AA448C7FCA2131E1363380E8180380F01C0120EA2381C0380A438380700A3EB0E +1000701320A2131CEB0C4000E013803860070014207D9F17>I<13C0EA01E0A213C0C7FC +A7120E12131223EA4380EA4700A21287120EA35AA3EA38401380A21270EA31001232121C +0B1F7C9E0E>I<EB0180EB03C0A2148090C7FCA7133C13461387A2EA0107A2EA020E1200 +A35BA45BA45BA45BA21230EA79C0EAF1800063C7FC123C1228829E0E>I<EA01E0120FEA +01C0A4485AA448C7FCA2EB03C0EB0420380E08E013111321EB40C0381C8000001DC7FC12 +1EEA1FC0EA38E01370A2EB384038707080A3EB310012E0EA601E13207D9F15>I<EA03C0 +121FEA0380A4EA0700A4120EA45AA45AA45AA3127112E2A4126412380A207C9F0C>I<39 +1C0F80F0392630C318394740640C903880680EEB0070A2008E495A120EA34848485AA3ED +70803A3803807100A215E115623970070064D83003133821147C9325>I<381C0F803826 +30C0384740601380EB0070A2008E13E0120EA3381C01C0A3EB038400381388A2EB0708EB +031000701330383001C016147C931A>I<137CEA01C338030180000E13C0121E001C13E0 +123C1278A338F003C0A3EB07801400EA700F130EEA3018EA1870EA07C013147C9317>I< +3801C1E0380262183804741C1378EB701EA2EA08E01200A33801C03CA314383803807814 +7014E0EBC1C038072380EB1E0090C7FCA2120EA45AA2B47E171D809317>I<EA1C1EEA26 +6138278380EA47871307EB0300008EC7FC120EA35AA45AA45A123011147C9313>114 +D<13FCEA0302EA0601EA0C03130713061300EA0F8013F0EA07F8EA03FCEA003E130E1270 +EAF00CA2EAE008EA4010EA2060EA1F8010147D9313>I<EA018013C0EA0380A4EA0700A2 +EAFFF0EA0700120EA45AA45AA31320EA7040A21380A2EA3100121E0C1C7C9B0F>I<000E +13C0001313E0382301C0EA4381EA4701A238870380120EA3381C0700A31410EB0E201218 +A2381C1E40EA0C263807C38014147C9318>I<380E0380EA1307002313C0EA4383EA4701 +130000871380120EA3381C0100A31302A25BA25BEA0E30EA03C012147C9315>I<380383 +80380CC440381068E013711220EB70C03840E0001200A3485AA314403863808012F3EB81 +0012E5EA84C6EA787813147D9315>120 D<000E13C0001313E0382301C0EA4381EA4701 +A238870380120EA3381C0700A4130E1218A2EA1C1EEA0C3CEA07DCEA001CA25B12F05BEA +E060485AEA4380003EC7FC131D7C9316>I<EA7070EAF8F013F8EAF0F0EA60E00D05749E +17>127 D E /Fn 24 122 df<EB3F80EBC1E038010070000213785AA2000F137C1380A2 +EB00781206C712F814F0EB01E014C0EB0380EB0700130E5B5B13605B485A380300201206 +000813405A383FFFC0481380B5FC161E7E9D17>50 D<137F380183C0380201E0EA040000 +0713F05A1301A2000013E0A2EB03C0EB07801400131CEA01F8EA000E7F148014C0130313 +071230127812F8A200F0138038800F00EA400E6C5AEA1078EA0FE0141F7D9D17>I<0007 +B512FC3900F8007C0178131C150C5B1504A414043901E00800A31438EBFFF8EBE0383803 +C010A4EC00081510485AA21520A2156015C0380F00011407B612801E1F7E9E1F>69 +D<3A07FF83FFC03A00F8007C000178133CA2495BA648485BA490B5FCEBE0004848485AA6 +4848485AA64848485A01807F39FFF07FF8221F7E9E22>72 D<3807FFFE3900F807809038 +7801E0EC00F05B15F8A415F03801E00115E0EC03C0EC0780EC1E00EBFFF03803C0388014 +1E140EA2140F48485AA51502D80F001304EB800F39FFF00788C7EA01F01F207E9E21>82 +D<EA07F8EA0C0CEA1E061307121C1200A313FFEA07C7EA1E07EA3C0E127800F01310A313 +1EEB2E2038784F40381F878014147D9317>97 D<13FEEA0383380E0780121C0038130090 +C7FC12785AA45AA37E5BEA70026C5AEA1C18EA07E011147D9314>99 +D<1438EB01F8EB00781438A21470A614E013FCEA0382EA0601121CEA3C00383801C01278 +12F0A438E00380A412F0EA700738380F00381C37803807C7E015207D9F19>I<13F8EA07 +0EEA0E07121C383803801278127012F0A2B5FC00F0C7FC5AA46C5AEA7002EA3004EA1C18 +EA07E011147D9314>I<EB07C0EB1C60EB30F01360EBE0E0EBC0001201A5485AEA3FFCEA +0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<140EEB3E11EBE1A33801C1C238 +0381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FCA21218121CEA0FFF14C0 +14E0381800F04813305A5AA3006013606C13C0381C0700EA07FC181F809417>I<EA01C0 +EA03E0A213C0EA0180C7FCA6EA0380121F12071203A2EA0700A6120EA65A121EEAFF800B +1F7F9E0C>105 D<13E0120712011200A2485AA6485AEB81FCEB80F014C0EB81801400EA +07045B13181338137C131C120E7FA2130F7F1480EA1C03381E07C038FF8FF016207E9F18 +>107 D<13E0120712011200A2EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B20 +7F9F0C>I<390387C07C391F9861863907A072073903C03403EB80380007EB7807EB0070 +A5000EEBE00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<38038F80381F90 +E0EA07A03803C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF01414 +7E9319>I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438E001E0A214C013 +0300F0138038700700EA380E6C5AEA07E014147D9317>I<EBE3E03807EC383800F01C49 +7E140F48487E1580A53903800F00A2140E141E141C5C38074070EB61C0011FC7FC90C8FC +A3120EA4121EEAFFC0191D809319>I<EA038E381FB380EA07C71203EB8300EA078090C7 +FCA5120EA65A121EEAFFC011147E9312>114 D<EA01F9EA0607EA080312181301EA3802 +EA3C00121F13F0EA07FCEA01FEEA001FEA40071303A212601306EAF004EAC818EA87E010 +147F9312>I<1380EA0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840 +EA0F800D1C7C9B12>I<39FF9FE1FC393C078070391C030060148015401580EA0E079038 +0D81001309EB19C21311380F21C4EA0720EB40C814E8EB80F0A26C485A1460000213401E +147C9321>119 D<381FF0FF3803C0780001137014403800E0C0EBE180EB73001376133C +A2131C132E134E1387EA0107380203801204380C01C0383C03E038FE07FC18147F9318> +I<390FF83F803901E00E00EBC00C140813E000005B143014205C13705CA20171C7FC1339 +133A133E133C133813181310A25BA25BEA70C0EAF08000F1C8FC12E61278191D809318> +I E /Fo 76 128 df<90381F83E09038F06E303901C07878380380F8903800F03048EB70 +00A7B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA +0701A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<90381F81F89038F04F0439 +01C07C06390380F80FEB00F05A0270C7FCA6B7FC3907007007B23A3FE3FE3FE02320809F +26>14 D<EA7038EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA1008A2EA2010EA40200F +0E7F9F17>34 D<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>39 +D<13401380EA01005A12061204120C5AA212381230A212701260A412E0AC1260A4127012 +30A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E120812 +0C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A +5A0A2E7EA112>I<1303AFB612FCA2D80003C7FCAF1E207E9A23>43 +D<127012F012F8A212781208A31210A31220A21240050E7C840D>I<EAFFF0A20C02808A +0F>I<127012F8A3127005057C840D>I<EA03F0EA0E1C487EEA1806EA380738700380A400 +F013C0AD00701380A3EA780700381300EA1806EA1C0E6C5AEA03F0121F7E9D17>48 +D<13801203120F12F31203B3A6EA07C0EAFFFE0F1E7C9D17>I<EA03F0EA0C1CEA100E48 +7E00401380128000F013C0EAF803A3EA200712001480A2EB0F00130E5B5B5B13605B485A +48C7FC000613405A5A00101380EA3FFF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA +200F007813801307A2EA380F12001400A2131E131C1370EA07F0EA003C130E130FEB0780 +A214C0122012F8A300F013801240EB0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2 +130EA2131E132EA2134E138EA2EA010E1202A212041208A212101220A2124012C0B512F0 +38000E00A7EBFFE0141E7F9D17>I<EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161C +EA180EEA10071480EA0003A214C0A3127012F0A200E013801240EB0700EA20066C5AEA08 +38EA07E0121F7E9D17>I<137CEA0182EA0701380E0380EA0C0712183838030090C7FC12 +781270A2EAF1F0EAF21CEAF406EAF807EB0380A200F013C0A51270A214801238EB070012 +18EA0C0E6C5AEA01F0121F7E9D17>I<1240387FFFE014C0A23840008038800100A21302 +485AA25B5BA25BA21360A213E05B1201A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA +1006EA3003382001801260A3127038780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C +7EEA103F38300F80EA6007EB01C012C01300A31480EA600100201300EA1002EA0C0CEA03 +F0121F7E9D17>I<EA03F0EA0E18487E487E13071270EB038012F0A214C0A5EA7007A212 +38EA180BEA0E13EA03E338000380A3EB07001230EA7806130EEA700CEA2018EA1070EA0F +C0121F7E9D17>I<127012F8A312701200AA127012F8A3127005147C930D>I<5B497EA349 +7EA3EB09E0A3EB10F0A3EB2078A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB0780 +A348EB03C0A2120C001E14E039FF801FFE1F207F9F22>65 D<B512E0380F0078141EA280 +1580A515005C141E147CEBFFF0EB007C141FEC0F80EC07C0140315E0A515C014071580EC +0F00143EB512F01B1F7E9E20>I<90380FE0109038381C309038E002703803C001390780 +00F048C71270121E15305A1510127C127800F81400A91278007C1410123CA26C1420A27E +6C6C13406C6C13803900E00300EB380CEB0FF01C217E9F21>I<B512F83807801EEC0780 +EC03C0EC01E0EC00F015701578A2153CA3153EA8153CA2157C1578A215F0EC01E0EC03C0 +EC0780EC1E00B512F81F1F7F9E23>I<B61280380F000F14031401140015C01540A31440 +1500A214C0130113FF130113001440A3EC0020A31540A315C01401EC0380140FB6FC1B1F +7E9E1F>I<B61280380780071401A2140015C01540A4EC2000A3146014E013FF13801460 +1420A391C7FCA87FEAFFFE1A1F7F9E1E>I<90380FE0109038381C309038E002703803C0 +0139078000F048C71270121E15305A1510127C127800F81400A7EC3FFEEC01F000781300 +127C123CA27EA27E6C7E3903C001703900E002309038380C1090380FF0001F217E9F24> +I<39FFF07FF8390F000780AD90B5FCEB0007AF39FFF07FF81D1F7E9E22>I<EAFFF0EA0F +00B3ABEAFFF00C1F7E9E10>I<3807FFC038003E00131EB3A3122012F8A3EAF01CEA403C +EA6038EA1070EA0FC012207F9E17>I<EAFFF8EA0F8090C7FCB21402A414061404A2140C +141C147CB512FC171F7E9E1C>76 D<B46CEB07FE000715C0A2D805C0130BA2D804E01313 +A301701323A26D1343A36D1383A290380E0103A3EB0702A3EB0384A2EB01C8A3EB00F0A2 +1460121FD8FFE0EB7FFE271F7F9E2A>I<B4EB0FF8390F8003E0EC0080EA0BC0EA09E0A2 +EA08F01378A27F7FA27FEB0780A2EB03C0EB01E0A2EB00F01478A2143C141EA2140F1407 +A214031401123E38FF80001D1F7E9E22>I<EB1FE0EB70383801C00E48487E3907000380 +4814C0001EEB01E048EB00F0A2007C14F8A20078147800F8147CA900781478007C14F8A2 +003C14F0003E1301001E14E06CEB03C06C148039038007003801E01E38007038EB1FE01E +217E9F23>I<B512E0380F007C141E80EC0780A215C0A41580A2EC0F00141E147CEBFFE0 +90C8FCAEEAFFF01A1F7E9E1F>I<B57E380F00F0143C8080A21580A41500A2141E5C14F0 +EBFF80EB01C0EB0070A280143CA3143EA31504143F141FEC0F0839FFF00788C7EA01F01E +207E9E21>82 D<3803F040380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127C +EA7F80EA3FF86CB4FC00071380C613C0EB1FE013031301EB00F014707EA46C136014E06C +13C038F8018038C60300EA81FC14217E9F19>I<007FB512E038780F010060EB00600040 +1420A200C0143000801410A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF003FE39 +1F8000F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213F8EB +7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>86 +D<3BFFF07FF81FF03B1F000FC007C06C903907800180170015C001805C00071502EC09E0 +13C000035DEC19F01410D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C14 +60013C144090383D000F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E +2F>I<397FF81FF8390FE007C03907C0030000031302EBE0063801F00400005BEBF818EB +78106D5AEB3E60EB1E406D5AA213076D7E497E1305EB08F0EB18F8EB1078EB207CEB603E +EB401EEB801F3901000F801407000214C000061303001FEB07E039FFC01FFE1F1F7F9E22 +>I<387FFFFE387E003C127800701378006013F814F0384001E0130314C0EB07801200EB +0F00131EA25B137C13785B1201EBE002EA03C0A2EA0780000F13061300001E1304003E13 +0C123C48133C14FCB5FC171F7E9E1C>90 D<12FFA212C0B3B3A512FFA2082D7CA10D>I< +EA0804EA1008EA2010A2EA4020A2EA8040A3EAB85CEAFC7EA2EA7C3EEA381C0F0E7A9F17 +>I<12FFA21203B3B3A512FFA2082D80A10D>I<EA1FE0EA3030EA7818131CEA300E1200A3 +13FEEA078EEA1E0E1238127800F01310A3131E127838386720380F83C014147E9317>97 +D<121C12FC121CAA137CEA1D87381E0180EB00C0001C13E01470A21478A6147014F014E0 +001E13C0381A018038198700EA107C15207E9F19>I<EA01FCEA0706EA1C0F1238130600 +78C7FC127012F0A61270127800381380A2381C0100EA0706EA01F811147F9314>I<EB01 +C0130F1301AAEA01F1EA070DEA0C03EA180112381278127012F0A61270A21238EA180312 +0CEA070D3801F1F815207F9F19>I<EA03F0EA0E1C487E487EA21270EB038012F0A2B5FC +00F0C7FCA31270A26C1380A2381C0100EA0706EA01F811147F9314>I<137CEA01C6EA03 +0F1207EA0E061300A7EAFFF0EA0E00B2EA7FE01020809F0E>I<14E03803E330EA0E3CEA +1C1C38380E00EA780FA5EA380E6C5AEA1E38EA33E00020C7FCA21230A2EA3FFE381FFF80 +14C0383001E038600070481330A4006013606C13C0381C03803803FC00141F7F9417>I< +121C12FC121CAA137C1386EA1D03001E1380A2121CAE38FF8FF014207E9F19>I<123812 +7CA31238C7FCA6121C12FC121CB1EAFF80091F7F9E0C>I<13E0EA01F0A3EA00E01300A6 +1370EA07F012001370B3A31260EAF06013C0EA6180EA3F000C28829E0E>I<121C12FC12 +1CAAEB1FE0EB0780EB060013045B5B5B136013E0EA1DF0EA1E70EA1C38133C131C7F130F +7F148014C038FF9FF014207E9F18>I<121C12FC121CB3ABEAFF8009207F9F0C>I<391C3E +03E039FCC30C30391D039038391E01E01CA2001C13C0AE3AFF8FF8FF8021147E9326>I< +EA1C7CEAFC86EA1D03001E1380A2121CAE38FF8FF014147E9319>I<EA01F8EA070E381C +0380383801C0A2387000E0A200F013F0A6007013E0A2383801C0A2381C038038070E00EA +01F814147F9317>I<EA1C7CEAFD87381E018014C0381C00E014F014701478A6147014F0 +14E0381E01C0EB0380381D8700EA1C7C90C7FCA8B47E151D7E9319>I<3801F04038070C +C0EA0E02EA1C03EA38011278127012F0A6127012781238EA1C03EA0C05EA0709EA01F1EA +0001A8EB0FF8151D7F9318>I<EA1CF0EAFD18EA1E3CA21318EA1C00AEEAFFC00E147E93 +12>I<EA0FC8EA3038EA6018EAC008A3EAE000127CEA3FE0EA1FF0EA07F8EA003CEA800E +130612C0A21304EAE00CEAD818EA87E00F147F9312>I<1202A31206A2120EA2123EEAFF +F8EA0E00AB1304A5EA07081203EA01F00E1C7F9B12>I<381C0380EAFC1FEA1C03AE1307 +120CEA061B3803E3F014147E9319>I<38FF83F8383E00E0001C13C06C1380A338070100 +A21383EA0382A2EA01C4A213E4EA00E8A21370A3132015147F9318>I<39FF9FE1FC393C +078070391C030060EC8020000E1440A214C0D80704138014E0A239038861001471A23801 +D032143A143E3800E01CA2EB6018EB40081E147F9321>I<38FF87F8381E03C0380E0180 +EB0300EA0702EA0384EA01C813D8EA00F01370137813F8139CEA010E1202EA0607380403 +80000C13C0003C13E038FE07FC16147F9318>I<38FF83F8383E00E0001C13C06C1380A3 +38070100A21383EA0382A2EA01C4A213E4EA00E8A21370A31320A25BA3EAF080A200F1C7 +FC1262123C151D7F9318>I<EA7FFFEA700E1260EA401C133813781370EA00E0120113C0 +EA038012071301120E121EEA1C03EA3802EA7006130EEAFFFE10147F9314>I<B512FC16 +01808C17>I<B812F02C01808C2D>I<EA7038EAF87CA3EA70380E057C9E17>127 +D E /Fp 38 122 df<EAFFF0A40C047F8C11>45 D<12FCA606067C850E>I<137013F012 +03127F12FFA2127F1203B3A4387FFF8014C0A2148012217DA019>49 +D<EA03F8EA0FFE487E481380387C1FC038780FE0EAF00714F01270EA6003122012001307 +14E0A2EB0FC0A2EB1F80EB3F00133E5B5B485A485A485A485A48C7FC121E5A387FFFF0B5 +FCA27E14217EA019>I<EA03FCEA0FFF481380383E1FC0EA3C0F007813E0EA30071210EA +000FA214C0A2EB1F80EB3F00EA03FE5B13FF38001F80EB0FC0EB07E014F0A6128000C013 +E0EAF00FEAFC1F387FFFC06C1380000F1300EA03F814227EA019>I<EB1FC0A2133FA213 +7F13F7A2EA01E7A2EA03C7A2EA0787A2EA0F07A2121E123E123C127C127812F8B512FCA4 +380007C0A716207F9F19>I<383FFFC0A490C7FCA713FC13FF1480EB8FC0383E07E0123C +14F01200A612201260007013E0EAF80F387C1FC0EA7FFF6C1380380FFE00EA03F814217E +9F19>I<EA03FCEA0FFF481380383F0FC0EA3E07007E13E0A7003E13C0EA3F0F381FFF80 +3807FE00487E383F0FC0387E07E0EA7C0300FC13F0A8387E07E0EA7F0F383FFFC06C1380 +6C1300EA03FC14227EA019>56 D<387FFFC0B512F014FCA238FE01FE6D7E80A2805CA214 +7E14FEEB03FCB55A5C14FC38FE01FEEB007F801580A6EC7F005CB55A5C5C6C13E019207C +9F21>66 D<EB1FF8EBFFFE0003EBFF805A380FF81F391FE0070048487E497E48C8FCA312 +7E12FEAA127E127FA36C6C13406D13C0381FE001380FF80F6CB5FC6C1480C6EBFE00EB1F +F81A227DA020>I<EB1FF0EBFFFE0003EBFF805A380FF81F391FE0070048487E497E48C8 +FCA312FEA6ECFFC0A4140FA2127FA3EA3F8013C0EA1FE0EA0FF86CB5FC7EC61400EB1FF8 +1A227DA021>71 D<007EEB0FE012FEACB6FCA438FE000FAE127E1B207C9F24>I<127E12 +FEB3AC127E07207C9F0F>I<007FEB03E0EAFF8013C0A213E0A2EAFBF0A2EAF9F8A2EAF8 +FCA2137EA2133FA2EB1F83A2EB0FC3A2EB07E3A2EB03F3A2EB01FBA2EB00FFA2147FA214 +3F0078131F1B207C9F24>78 D<EB3FE03801FFFC487F390FF07F80391FC01FC0EB800F00 +3F14E0EB00074814F0A2007E130300FE14F8AC007E14F0007F1307A26C14E0EB800F001F +14C0EBC01F390FF07F806CB51200000113FC38003FE01D227DA024>I<387FFF80B512F0 +14F814FC38FE01FE1300147FA814FE1301B512FC14F814E048C7FCAC127E18207C9F20> +I<387FFF80B512F0808038FE01FEEB007E147FA6147EEB01FEB55A14F014C0EAFE1F6D7E +A26D7EA26D7E130180130080147FA2EC3F80A2007E131F19207C9F20>82 +D<007FB512F0B6FCA339001FC000B3A9130F1C207E9F21>84 D<EA03FE381FFF804813C0 +EA3C0F383807E012201200A2133FEA07FFEA1FC7EA3F07127E12FCA3130FEA7E1FEA7FF7 +EA3FE7EA0F8713157F9418>97 D<EA03FCEA0FFF481380EA3F07EA7E01007C130000FCC7 +FCA9007E134014C0EA3F07EA1FFF6C13803803FC0012157E9416>99 +D<EB03F0ABEA03E3EA0FFBEA1FFFEA3F07EA7E03A212FCA9127C127EEA3F0FEA1FFFEA0F +FBEA07E314207E9F1A>I<EA03FE380FFF804813C0383F87E0EA7E03EB01F012FCA3B5FC +A200FCC7FCA4007E13201460383F83E0EA1FFF6C13C03801FE0014157F9417>I<3803FC +3C380FFF7C4813FC383F0FC0EA3E07007E13E0A5003E13C0EA3F0F381FFF801400EA13FC +0030C7FC1238383FFF8014E06C13F014F8007F13FCEA780048133CA36C137C387E01F838 +3FFFF06C13E000031300161F7F9419>103 D<127C12FCAA133FEBFF8000FD13C0EB8FE0 +EAFE07A212FCAE127C13207D9F1A>I<127E12FEA61200A5123E127EB3123E07217FA00B> +I<127812F8AAEB07C0130FEB1F80EB3E005B5BEAF9F0EAFBE012FFA27F7F12FDEAF8FC13 +7E137F7FEB1F8014C0130FEA780712207D9F18>107 D<127C12FCB3AC127C06207E9F0B> +I<397C3F01F839FCFF87FC00FDEBCFFE90388FEC7F39FE07F03FA200FC13E0AED87C0313 +1F20157D9427>I<EA7C3F38FCFF8000FD13C0EB8FE0EAFE07A212FCAE127C13157D941A> +I<EA01FE380FFFC04813E0383F03F0387E01F8A2EA7C0000FC13FCA8387E01F8A2383F87 +F0381FFFE06C13C03801FE0016157F9419>I<EA7C7E38FDFF80B512C0EAFE0F38FC07E0 +A2EB03F0A9EB07E0A238FE1FC0B5128000FD1300EAFCFC90C7FCA8127C141E7D941A>I< +EA7C70EAFCF012FD12FFA21380EAFE00A25AAC127C0C157D9411>114 +D<EA07FCEA1FFF5AEA3C0FEA78021300A2127F13F0EA3FF8EA1FFCEA0FFEEA03FFEA001F +EA400FA212F0EAFC1EEAFFFEEA3FFCEA0FF010157F9413>I<121F5AA5EA7FFC12FFA3EA +3F00AC1308131CEA1FFC13F8EA0FC00E1B7F9A12>I<387C07E012FCAF130FA2EA7C17EA +3FE7EA1FC713157D941A>I<39F007C01ED8F80F133E14E0007C143C157C131FEB1DF000 +3E14F8133C14F81338001FEBF9F0EB7879EB707DA2390FF07FE0143F13E0A2000714C0EB +C01F1F157F9422>119 D<38F803E0EA7C07007E13C0383F0F80EA1F1F380F9F00EA07FE +5B6C5A12015B7F487E487EEA0F9FEA1F1FEB0F80383E07C0387C03E000FC13F0EAF80114 +157F9417>I<00F813F0EAFC01007C13E0EA7E03123E14C0EA1F07A2EB8780EA0F8FA238 +07CF00A2EA03DF13DEEA01FEA25B1200A21378A213F85BA21201EA43E0EA7FC05B007EC7 +FC141E7F9417>I E /Fq 25 122 df<130E131F137F485A127FB5FCA27EC6FCB3AD003F +13FE4813FFA26C13FE182B7CAA21>49 D<13FF000313E0000F7F4813FC487FA2387F83FF +D8FE0113807F007C137F003C14C012380018133F1208C7FC147FA21580A2ECFF00A2495A +495A5C495A495A495A495A49C7FC13FE13F8485A485A485A485A48C8FC123E007FB51280 +B612C0A46C14801A2B7DAA21>I<EBFF80000313F0000F7F4813FE5A387F81FFEA3E0000 +1C148012180008137FC7FC14FFA21500A2495A495A1307EBFFF05C8014FCEB03FEEB00FF +1580147F15C0A7124012600070EBFF8012FCD8FF03130090B5FC6C5B6C5B6C5B000713E0 +C613801A2C7DAA21>I<903801FFE0010F13FE017FEBFF8090B6FC5A00071500EC807F39 +0FFE000FD81FF87F497F003F91C7FC5B485AA4485AAC6C7EA46C7E7F001F15806D1303D8 +0FFE13073907FF803F91B512C012017E6D1400010F13FC010113E0222C7CAA2A>67 +D<007FEC0FE0486CEB1FF0B090B6FCA6903880001FB26CC7EA0FE0242A7BA92F>72 +D<127FEAFF80B3B3A4EA7F00092A7BA914>I<387FFFFCB612C08115F881EB800FEC03FE +140181A75DA21403EC0FFC90B55A5D15C04AC7FCEB81FF138081147F816E7EA26E7EA26E +7EA26E7E1403816E7EA26E1380A26CC7127F212A7BA92A>82 D<EBFFC0000713F0001F13 +FC14FE1301381C00FF12181210C7FCA390B5FC1207EA1FF0EA3FC0485A5B5AA41381EA7F +8713FE6C5A6C5A3807E07E181B7E9A1F>97 D<EB7FE03803FFFC4813FF5A381FE03F383F +C00E387F8006140090C7FC5AA97EEB80011403383FC00F381FE03F6CB5FC7E6C13FC3800 +7FE0181B7E9A1D>99 D<EC0FC0EC1FE0AE13FE3807FF9F4813DF4813FF383FF07FEBC01F +EA7F80A2EAFF00ABEA7F80A2383FC03FEBE07F6CB5FC6C13DF6C131F3900FC0FC01B2A7E +A922>I<EB7FE03803FFF8487F001F13FFEA3FE09038C03F80EA7F80EC1FC0EAFF00A390 +B5FCA2158090C8FCA56C7E1540393FC001C0381FF01F6CB5FC7E0001140038007FF01A1B +7E9A1F>I<EB1FF813FF5A5A3807F838EBF008000F1300A9EA7FFFB51280A26C1300EA0F +F0B3A46C5A152A7FA914>I<9038FFC0780003EBF1FC000F13FF48EBFE1C393FC0FF0049 +7E007F1480A7003F14006D5A6CB45A6C5B000B13F0001813C090C8FC121C121E381FFFFC +ECFF8015E06C14F04814F85A397E0007FC4813011400A36C1301007E14F8387FC00F6CB5 +12F06C14E000071480C6EBFC001E287F9A21>I<127FEAFF80A7EA7F00C7FCA7123FEA7F +80B3A7EA3F00092B7EAA0F>105 D<127C12FEAE147F495A5BEB07FC495A495A495A495A +495AB5C7FC5BA27FA280806D7EEAFE3F6D7E6D7EA26D7E6D7E807F6D1380007C137F192A +7CA920>107 D<267E03FC13FF27FF0FFE031380496C4813C049018F13E0903A707FDC1F +F09039C03FF00F018013E0A2010013C0B2007E90391F8007E02C1B7C9A35>109 +D<387E03F838FF0FFE497E5B01601380EBC07F1380A21300B2007EEB3F00191B7C9A22> +I<EB7FE03803FFFC487F001FEBFF80EBE07F393FC03FC0397F801FE0A2EB000F4814F0A9 +6C14E0EB801FA2393FC03FC0EBE07F6CB512806C1400000313FC38007FE01C1B7E9A21> +I<387E0380EAFF0F131F133F137FA2EBF80013E05B5B90C7FCB0127E111B7D9A16>114 +D<EA03FE381FFFC04813F05AEA7E0338FC00E0146014007EEAFFC013FC387FFF806C13C0 +6C13E06C13F07E38007FF8EA400713011260127012F838FE03F0B5FC6C13E0001F138038 +03FE00151B7E9A19>I<EA07E0487EA7387FFFC0B512E0A26C13C0380FF000B11420EBF8 +E03807FFF0A26C13C03801FE0014237FA218>I<007E133FB4EB7F80B314FFA25B387F83 +7FEA3FFEEA1FFC3907F83F00191B7C9A22>I<007C013EEB0F8000FE013FEB1FC0007F49 +EB3F801580A2EB80FF003F9138C07F00A214EFD81FC1147E9138E7E0FEA213C33A0FE3C7 +F1FCA214C313F70007903883FBF8A2EBFF816CECFFF01401A2806C485CA26C486D5A2A1B +7F9A2D>119 D<007FEB1F80EC3FC09038807F80393FC0FF006C6C5AEA0FF13807F3FC6C +B45A5C6C5B7E6D5A6D5AA2497E497E5A803803FBF83807F1FC380FE0FE121FEBC07F393F +803F80007F14C039FF001FE0007EEB0FC01B1B7F9A1E>I<00FCEB0F806CEB1FC0EC3F80 +7E7E9038807F00123F13C0001F13FEA2EA0FE0EBE1FC13F112075CEA03FB5C1201A26CB4 +5AA36D5AA2133F5C131FA249C7FCA3137EA2EAC0FC12FF5B5B5B13801A277E9A1E>I +E /Fr 14 116 df<1238127C12FEA3127C1238070774861F>46 D<EB1FC0EB7FF048487E +3803F0FC3807C03C48487EEA1F00381E03EF383E0FFFEA3C1F397C3E3F8038783C1FEB78 +0F12F8EAF0F8EBF007A7EBF80FD8F87813001278EB3C1E387C3E3E383C1FFC383E0FF838 +1E03E0001FC8FC390F8007803807C00F3803F07F3901FFFE006C6C5AEB1FE019257DA41F +>64 D<EB7FE03801FFF8000713FC380FC07CEA1F00003E1338003C13005AA212F85AA67E +1278A26C133C123E6C137C380FC1F83807FFF0000113E038007F80161A7C991F>99 +D<EB01FE13031301EB001EA8137E3803FF9E4813DE380FC3FEEA1F00003E137E003C133E +5A141E12F85AA67E0078133EA2007C137E7E6C13FEEA0F833907FFDFE06CEB9FF03900FE +1FE01C257EA41F>I<137F3803FFC04813E0380FC1F0381F00F8003E137C003C133C5A14 +1E12F85AB512FEA300F0C7FCA27E1278127C003C131E123E6C133E380FE0FC3807FFF800 +0113F038007FC0171A7D991F>I<9038FE0FC03903FFBFE04813FF380F83F9391F01F1C0 +391E00F000003E7F003C1378A4003E13F8001E5BEA1F01380F83E048B45A5CD83CFEC7FC +90C8FCA37E381FFFE06C13FC80487F393E003F800078130F00F8EB07C0481303A46C1307 +007CEB0F806CEB1F00381FC0FE6CB45A6C5BC613C01B287E991F>103 +D<137013F8A3137090C7FCA7EA7FF812FF127FEA0078B3A2B512F8A315267BA51F>105 +D<EA7F8012FF127F1207A8903887FFC015E015C09038807E005CEB81F8EB83F0EB87E0EB +8FC0EB9F8001BFC7FC13FF808013F3EBE3E0EBC1F0EB80F8A2147C80A280397FF87FE039 +FFFCFFF0397FF87FE01C257FA41F>107 D<EAFFF8A3EA0078B3ADB512FCA316257CA41F> +I<387F87F838FF9FFC387FBFFE3807FC1FEBF00F9038E0078013C0A31380AE397FF87FF8 +39FFFCFFFC397FF87FF81E1A80991F>110 D<13FCEA03FF481380381F87E0EA1E01383C +00F0007C13F800781378A248133CA76C137C00781378A2007C13F8003C13F0381E01E0EA +1F873807FF806C1300EA00FC161A7C991F>I<387F87F038FF9FFC387FBFFE3807FC1F90 +38F00F809038E007C09038C003E01401138015F01400A6140101C013E0A2EC03C0EBE007 +9038F00F809038FC3F00EBBFFEEB9FFCEB87E00180C7FCAAEA7FF8487E6C5A1C2780991F +>I<387FE07F39FFE1FF80D87FE713C03801EFC7EBFF079038FC038091C7FC5B5BA35BAC +387FFFE0B5FC7E1A1A7E991F>114 D<3803FE70381FFFF05AEA7E07EAF001EAE000A37E +007E1300EA3FF06CB4FC6C13C0C613F0EB07F813000070133C00F0131CA27E6C133C1478 +38FF01F8EBFFF000F713C000E11300161A7C991F>I E /Fs 19 128 +df<127812FCA212FEA2127A1202A41204A31208A212101220124007127B8510>44 +D<132013E01201120F12FF12F11201B3AD487EB512C0A212287BA71D>49 +D<EB0FC0EB3FF0EBF018EA01C03803803C3807007C5A000E1338001E13005AA35AA3EAF8 +3FEBC1C038F900E000FA1370143800FC133C141EA25A141FA41278A46C131EA2001C133C +121E000E13786C13703803C1E03801FFC038007E0018297EA71D>54 +D<137E3801FF80380781C0380F00E0001E1370481338A248133CA200F8131EA4141FA412 +78143FA27E001C135F7E6C139F3803831FEA00FCEB001EA3143E143CA21438001C137800 +3E137014E0383C01C038180380381C0F00EA0FFEEA03F818297EA71D>57 +D<3801FFFEA2380007E01303B3AA1230127812FCA214C0EAF8070040138038200F00EA30 +0EEA0C3CEA03F0172A7DA81E>74 D<B538800FFEA23A07F00003F06C48EB01C016001502 +5D5D5D5D5D5D4AC7FC14025C5C1418143C147E14BEEBE11F01E27FEBE40F9038E807C001 +F07FEBE0036E7E811400157C157E153E81A2ED0F8016C0150716E0486C14F8B538803FFF +A228297EA82E>I<D8FFE0EB3FFE7FD803F8EB03E00002EC01C0017CEB0080137E133E7F +A26D7E8013076D7E8013016D7E80147C80143F80EC0F8015C01407EC03E015F01401EC00 +F8A2157C157E153E151FA2150F1507A200071403486C1301EAFFF8150027297EA82C>78 +D<120FB4FCA2121F7EACEB07E0EB1838EB600EEB8007158090380003C0A2EC01E0A215F0 +A715E0A2140315C01580EB8007000EEB0F00EB401C380C303838080FC01C2A7EA921>98 +D<137F3801C0E038070010000E1378001E13F85A1470007C13200078130012F8A8127812 +7C003C1308A26C1310000E13206C13603801C18038007E00151A7E991A>I<13FC380387 +80380701C0000E13E0EA1C00003C13F0A2481378A212F8A2B512F800F8C7FCA51278A26C +1308A26C1310000E13206C13403801C18038007E00151A7E991A>101 +D<120FB4FCA2121F7EACECFFC0A2EC7E0014305C14405C0103C7FC1304130C131E133E13 +5F138FEB0780801303806D7E1300801478147C147E39FFF1FFE0A21B2A7EA91F>107 +D<120FB4FCA2121F7EB3B2EAFFF0A20C2A7EA911>I<3A0F07F007F03AFF183818389039 +201C201C3A1F400E400E000F010F130F01801380A201001300B13BFFF0FFF0FFF0A22C1A +7E9931>I<380F07F038FF1838EB201C381F400E000F130F1380A21300B139FFF0FFF0A2 +1C1A7E9921>I<137E3803C3C0380700E0000E1370481338003C133CA248131EA200F813 +1FA80078131EA26C133CA2001C13386C13706C13E03803C3C038007E00181A7E991D>I< +380F0F8038FF11C0EB23E0EA1F43EA0F83EB81C0EB800090C7FCB07FEAFFFCA2131A7E99 +17>114 D<3807F080EA1C0DEA3003EA600112E01300A27E6C1300127EEA7FE0EA3FFC6C +7EEA07FF38003F801307388003C0A2130112C0A200E01380130300F01300EACC0EEA83F8 +121A7E9917>I<39FFF01FF0A2390F8007800007EB03001402A26C6C5AA2EBE00C000113 +08A26C6C5AA2EBF830EB7820A26D5AA2EB3EC0EB1E80A26DC7FCA31306A21C1A7F991F> +118 D<EA700EEAF81FEAFC3FA2EAF81FEA700E10067AA81D>127 +D E /Ft 5 90 df<B612C0380F80070007130114001540A215601520A314201500A31460 +14E013FF138014601420A315081400A21510A31530A2157015E0000F1303B6FC1D227EA1 +21>69 D<903807F00890383C0C18EBE0023901C001B839038000F848C71278481438121E +15185AA2007C14081278A200F81400A7EC1FFF0078EB00F81578127C123CA27EA27E7E6C +6C13B86C7E3900E0031890383C0C08903807F00020247DA226>71 +D<39FF8007FF3907C000F81570D805E01320EA04F0A21378137C133C7F131F7FEB0780A2 +EB03C0EB01E0A2EB00F014F81478143C143E141E140FA2EC07A0EC03E0A21401A2140000 +0E1460121FD8FFE0132020227EA125>78 D<3803F020380C0C60EA1802383001E0EA7000 +0060136012E0A21420A36C1300A21278127FEA3FF0EA1FFE6C7E0003138038003FC0EB07 +E01301EB00F0A214707EA46C1360A26C13C07E38C8018038C60700EA81FC14247DA21B> +83 D<D8FFF0EB7FC0D81F80EB1F00000F140C000714087F00035C6C6C5B7F00005C6D13 +C0017C5BD93C01C7FC133EEB1E02EB1F06EB0F84EB078814D8EB03D014E01301AC1303EB +3FFE22227FA125>89 D E /Fu 15 122 df<4AB41480021FEBE00191387F0078D901F8EB +0E03D903E0EB0707D90FC0EB018749C812CF013E156F49153F5B4848151F0003160F485A +491507120FA248481503A2123F90C91201A25AA2007E93C7FCA212FEAB007E92387FFFFE +A2007F9238007FC0EF1F807EA27F121FA26C7EA26C7EA26C7E12016C7E017C153F7F6D15 +7FD90FC014E7D903E0EB01C7D901FCEB0783903A007F803E0191391FFFF8000201018013 +00373D7CBB3F>71 D<EB3F803801C0F03803003C00047F000C7F486D7E001C80003E1303 +003F80A3121EC7FCA3143FEB0FF3EB7E03EA01F8EA03E0EA0FC0EA1F80EA3F00123E127E +16605AA31407A2007C130B127E003E903811F0C06C13603A07C1807F803A00FE003E0023 +257CA427>97 D<ED0F80EC03FFA2EC001F150FB3EB03F8EB1E07903870018F9038E0004F +D803C0132F4848131F120F90C7120F5A123EA2127E127CA212FCA9127CA2127E123EA212 +1E121F6C141F6C6C133F6C6C136F6C6C13CF3A0070018FC090393C0E0FFEEB07F0273C7D +BB2C>100 D<EB07F8EB3C1E9038F007803901C003C00003EB01E039078000F048C712F8 +481478001E147C123EA2007E143E127CA212FCA2B612FE00FCC8FCA6127CA2127E123E15 +067E6C140C7F000714186C6C1330C66C1360017013C090381E0700EB03FC1F257EA423> +I<ED07C090390FE018609039383820709039F01E40F03901E00F802603C00713600007EC +C00048486C7EA3001F80A6000F5CA36C6C485A00035C6C6C48C7FC3802F01EEB38383806 +0FE00004C9FCA2120CA2120EA27E7F6CB5FC15F06C14FC6C8039078000FF000EC7EA1F80 +48EC07C048140312780070EC01E012F0A50078EC03C000381580003C14076CEC0F000007 +141CD803C0137839007803C0D90FFEC7FC24387EA527>103 D<EA03E012FFA212071203 +B3EC1FE0EC607CEC801E9038E3000F01E41480A201E8130716C013F0A25BB3A6486CEB0F +E0B50081B5FCA2283C7EBB2C>I<1207EA0F80EA1FC0A3EA0F80EA0700C7FCADEA07C012 +FFA2120F1207B3ACEA0FE0EAFFFEA20F397DB815>I<2703E01FE0EB3FC000FFD9607CEB +C0F8913A801E01003C2807E3000F067FD803E40288131FA201E8D907907F04D0148001F0 +14E0A2495CB3A6486C496CEB1FC0B50081B53803FFFEA23F257EA443>109 +D<3903E01FE000FFEB607CEC801E3907E3000FD803E41480A201E8130716C013F0A25BB3 +A6486CEB0FE0B50081B5FCA228257EA42C>I<3803E03E00FF13C39038E107803907E20F +C0EA03E413E8EC0780EC030001F0C7FCA35BB3A5487EB512C0A21A257EA41E>114 +D<EBFF02380700C6000C132E0010131E123048130EA200E01306A37E7E6C90C7FC127FEA +3FF0EBFF80000F13E06C7F000113FC38003FFE1301EB003F00C07FEC0F8014076C1303A4 +6C1400A26C5B140600E45B00E25B38C1807038807F8019257DA41F>I<1330A61370A413 +F0A21201A212031207381FFFFEB5FCD801F0C7FCB3EC0180A9000014006D5AA2EB78026D +5AEB0E08EB03F019357FB41E>I<3CFFFE0FFFC03FFEA23C0FF000FE0007F06C48017CEB +03E0000317C0033CEB0180153E6C6CED0300A2153F6C6C1506156F1680017C5D15C716C0 +D93E015C158316E0D91F035C150116F0D90F875CEC860016F8D907CE5C02CC1378167CD9 +03FCEB7D804A133D163F010192C7FC4A7FA20100141E4A130EA237257FA439>119 +D<D8FFFEEB3FFEA2D807FCEB1FF06C48EB0F80000192C7FC0000140E017C5B017E13186D +5B6D5B90380F80E0ECC1C0903807E180D903E3C8FC14F7EB01FE6D5A147C147E147FA2EC +CF8001017F90380387E0EB070390380601F0010C7F90381C00FC49137C01307F49133F01 +E06D7E0001140F000781D81FF0EB1FF0B46C90387FFF80A229257FA42A>I<D8FFFEEB0F +FFA2D807F0EB07F86C48EB03E0ED01C06C7E16807F0000EC0300A2017C1306A2137E013E +5BA2013F131C6D1318A26D6C5AA2ECC07001071360A26D6C5AA214F101015BA2D900FBC7 +FCA214FF147EA2143CA31418A25CA35CA214E05C1218383C0180127E49C8FCA2EA7C06EA +300CEA1C38EA07E028367FA42A>I E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin +%%PaperSize: a4 +%%BeginPaperSize: a4 +a4 +%%EndPaperSize + +%%EndSetup +%%Page: 1 1 +1 0 bop 247 442 a Fu(Generating)28 b(syn)n(tax)e(diagrams)i(with)g +Ft(SYNGEN)778 585 y Fs(Jens)19 b(Kl\177)-29 b(oc)n(k)n(er)633 +672 y Fr(kloecker@spri)o(nger)o(.de)696 786 y Fs(No)n(v)n(em)n(b)r(er) +20 b(16,)g(1996)72 1001 y Fq(Contents)72 1103 y Fp(1)43 +b(Intro)q(duction)1387 b(1)72 1205 y(2)43 b(Ho)o(w)16 +b(to)h(mak)o(e)g(syntax)f(diagrams)1013 b(2)140 1262 +y Fo(2.1)46 b(Basic)16 b(elemen)o(ts)42 b(.)23 b(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 b(2)245 1318 y(2.1.1)50 +b(Blanks)19 b(.)j(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)63 b(2)245 1374 y(2.1.2)50 b(Non-terminals)13 +b(.)23 b(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 +b(3)245 1431 y(2.1.3)50 b(T)l(erminals)29 b(.)22 b(.)g(.)h(.)f(.)g(.)h +(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 b(3)245 1487 y(2.1.4)50 +b(P)o(arameters)33 b(.)22 b(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)63 b(3)140 1544 y(2.2)46 b(Building)17 b(up)f(diagrams)46 +b(.)22 b(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 b(4)245 +1600 y(2.2.1)50 b(Choice)20 b(.)i(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)63 b(5)245 1657 y(2.2.2)50 b(Concatenation)42 +b(.)22 b(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 b(5)245 +1713 y(2.2.3)50 b(Optional)17 b(comp)q(onen)o(ts)46 b(.)23 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)63 b(5)245 1770 y(2.2.4)50 +b(Rep)q(etitions)34 b(.)22 b(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)63 b(5)245 1826 y(2.2.5)50 b(Grouping)37 b(.)22 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 +b(6)140 1883 y(2.3)46 b(Options)36 b(.)22 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 b(6)140 +1939 y(2.4)46 b(A)15 b(complete)h(example)36 b(.)23 b(.)f(.)g(.)h(.)f +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)63 b(8)72 2041 y Fp(3)43 +b(Ho)o(w)16 b(to)h(read)g(syntax)f(diagrams)1032 b(8)72 +2184 y Fq(1)66 b(Intro)r(duction)72 2286 y Fo(A)21 b(v)o(ery)g(imp)q +(ortan)o(t,)g(but)g(unfortunately)g(mostly)g(neglected)h(job)f(in)h +(soft)o(w)o(are)d(engineering)k(is)72 2342 y(the)c(pro)q(duction)g(of)g +(go)q(o)q(d)f(do)q(cumen)o(tation.)31 b(One)19 b(often)g(arising)g +(problem)g(in)h(this)f(\014eld)h(is)f(the)72 2399 y(do)q(cumen)o +(tation)f(of)f(user)h(languages,)f(i.)8 b(e.)17 b(programming)g +(languages,)h(data)f(base)g(languages)h(or)72 2455 y(macro)d(languages) +g(in)h(text)f(pro)q(cessing)i(systems.)j(P)o(ossible)c(criterions)g +(for)f(a)g(go)q(o)q(d)g(presen)o(tation)72 2511 y(are)929 +2760 y(1)p eop +%%Page: 2 2 +2 1 bop 605 100 a Fn(2)45 b(Ho)o(w)14 b(to)h(mak)o(e)g(syn)o(tax)f +(diagrams)p 72 117 1737 2 v 72 248 a Fo(1.)35 b(clearness,)72 +341 y(2.)g(compactness,)72 435 y(3.)g(completeness)16 +b(and)72 529 y(4.)35 b(e\016ciency)16 b(in)g(pro)q(duction.)143 +610 y(A)o(t)21 b(this)h(time)g(nearly)g(all)g(authors)f(use)h(the)g(so) +f(called)i Fm(Backus-Naur-F)m(orm)g Fl(BNF)p Fo(,)e(whic)o(h)72 +667 y(original)14 b(w)o(as)e(in)o(v)o(en)o(ted)h(to)f(design)h(and)g +(not)f(to)g(do)q(cumen)o(t)h(or)f(teac)o(h)h(languages.)19 +b(F)l(or)12 b(an)g(example)72 723 y(lo)q(ok)j(at)f([1)o(].)20 +b(This)15 b(form)f(of)g(do)q(cumen)o(tation)h(satis\014es)g(p)q(oin)o +(ts)g(2{4.)k(In)c(particular,)g(criterion)g(4)g(is)72 +780 y(giv)o(en,)j(p)q(erhaps)g(the)f Fk(BNF)h Fo(can)g(b)q(e)g(tak)o +(en)f(directly)h(or)f(with)h(sligh)o(t)g(mo)q(di\014cations)g(from)f +(parser)72 836 y(sp)q(eci\014cations)c(suc)o(h)e(as)f +Fk(Y)m(A)o(CC)p Fo(.)g(But)g(clearness,)i(esp)q(ecially)i(for)c(b)q +(eginners,)i(is)f(not)g(giv)o(en.)19 b(Because)72 893 +y(language)d(do)q(cumen)o(tation)f(m)o(ust)g(b)q(e)h(useful)g(for)f +(exp)q(erts)g(as)g(w)o(ell)i(as)d(for)h(b)q(eginners,)h(the)g +Fk(BNF)g Fo(is)72 949 y(not)f(the)g(righ)o(t)g(tec)o(hnique)i(for)d +(that)h(purp)q(ose.)143 1006 y(One)j(p)q(ossibilit)o(y)i(for)c(a)i +(user)f(friendly)i(design)g(of)e(language)g(do)q(cumen)o(tations)h(is)g +(a)f(metho)q(d,)72 1062 y(whic)o(h)22 b(is)f(called)h +Fm(syntax)f(diagr)n(ams)p Fo(.)37 b(Go)q(o)q(d)21 b(examples)g(can)g(b) +q(e)h(found)f(in)h([2)o(])e(and)h([4],)g(where)72 1118 +y(they)13 b(are)g(used)h(to)e(explain)j(the)f(syn)o(tax)e(of)h +Fk(GOFER)g Fo(and)g Fk(CAML)f(LIGHT)p Fo(.)h(This)g(kind)i(of)d +(graphical)72 1175 y(represen)o(tation)g(is)h(clear)g(\(1\),)e(compact) +h(\(2\))f(and)i(the)f(language)h(can)f(b)q(e)h(do)q(cumen)o(ted)g +(completely)l(.)143 1231 y Fk(SYNGEN)i Fo(com)o(bines)i(the)e(adv)m(an) +o(tages)g(of)h(e\016cien)o(t)g(pro)q(duction)g(of)g Fk(BNF)g +Fo(with)g(the)f(clearness)72 1288 y(of)d(syn)o(tax)g(diagrams.)19 +b(The)13 b(program)f(tak)o(es)g(a)g Fk(BNF)p Fo(-lik)o(e)j(sp)q +(eci\014cation)g(of)d(the)h(language)g(as)f(input)72 +1344 y(and)j(the)g(output)g(is)g(the)g(corresp)q(onding)h(syn)o(tax)e +(diagram)g(in)i(L)1188 1336 y Fj(A)1207 1344 y Fo(T)1232 +1354 y(E)1258 1344 y(X)f(form.)k(F)l(or)14 b(that,)g(ev)o(ery)h(left)72 +1401 y(hand)h(side)h(of)e(the)h Fk(BNF)g Fo(m)o(ust)f(b)q(e)i(con)o(v)o +(erted)e(in)i(a)e(diagram)h(with)g(a)f(description)i(similar)g(to)e +(the)72 1457 y(righ)o(t)e(hand)h(side.)21 b(The)13 b(result)h(of)f(the) +h Fk(SYNGEN)p Fo(-run)g(on)g(this)g(description)h(can)f(then)f(b)q(e)i +(included)72 1514 y(without)g(additional)i(macros)d(in)i(ev)o(ery)f(L) +795 1505 y Fj(A)814 1514 y Fo(T)839 1523 y(E)866 1514 +y(X2e)g(do)q(cumen)o(t.)143 1570 y(As)k(a)g(\014rst)g(application,)j +Fk(SYNGEN)d Fo(w)o(as)g(used)h(to)f(pro)q(duce)h(the)g(syn)o(tax)e +(diagrams)h(for)g(the)72 1627 y(whole)e Fk(CAML)f(LIGHT)g +Fo(language.)24 b(The)17 b(result)h(can)e(b)q(e)i(found)f(in)g(the)g +(previously)h(refered)f(b)q(o)q(ok)72 1683 y(on)e(functional)i +(programming)d([4)o(].)72 1826 y Fq(2)66 b(Ho)n(w)22 +b(to)g(mak)n(e)e(syntax)i(diagrams)72 1928 y Fo(In)d(this)f(section)h +(w)o(e)f(will)i(sho)o(w)e(ho)o(w)f(to)h(mak)o(e)f(syn)o(tax)h +(diagrams.)28 b(Therefore)18 b(the)h(description)72 1984 +y(language)d Fk(ARA)f Fo(\(this)h(stands)g(for)f(Enric)o(hed)i(Regular) +f(Expressions)h(and)e(w)o(as)g(deriv)o(ed)i(from)e(the)72 +2041 y(german)22 b(\\Angereic)o(herte)h(Regul\177)-23 +b(are)24 b(Ausdr)q(\177)-24 b(uc)o(k)o(e"\))22 b(has)h(to)f(b)q(e)h +(explained)i(and)e(the)f(usage)h(of)72 2097 y Fk(SYNGEN)15 +b Fo(m)o(ust)g(b)q(e)h(describ)q(ed.)72 2219 y Fi(2.1)56 +b(Basic)19 b(elements)72 2305 y Fp(2.1.1)50 b(Blanks)72 +2390 y Fo(The)11 b(c)o(haracters)f(space,)i(horizon)o(tal)f(tabulation) +h(and)f(newline)i(are)d(considered)j(as)d(blanks.)20 +b(Blanks)72 2447 y(are)15 b(ignored,)g(but)h(they)f(separate)g(adjacen) +o(t)f(non-terminals.)929 2760 y(2)p eop +%%Page: 3 3 +3 2 bop 605 100 a Fn(2)45 b(Ho)o(w)14 b(to)h(mak)o(e)g(syn)o(tax)f +(diagrams)p 72 117 1737 2 v 72 248 a Fp(2.1.2)50 b(Non-terminals)72 +333 y Fo(Non-terminals)18 b(are)e(sequences)i(of)e(lo)o(w)o(ercase)h +(and)g(upp)q(ercase)g(letters,)g(digits,)h(underscore)f(and)72 +390 y(the)h(min)o(us)h(sign.)29 b(All)19 b(c)o(haracters)e(are)h +(meaningful)h(and)f(can)h(stand)e(on)h(ev)o(ery)g(p)q(osition)h(in)g +(the)72 446 y(string.)41 b(The)23 b(length)f(is)h(not)f(limited.)43 +b(In)23 b(the)f(corresp)q(onding)h(diagram)f(non-terminals)i(are)72 +503 y(represen)o(ted)16 b(b)o(y)f(rectangular)g(b)q(o)o(xes.)20 +b(Diagram)14 b(1)h(giv)o(es)h(a)e(summary)h(of)g(the)g(rules.)p +733 629 42 2 v 774 629 V 816 629 V 816 628 a Fh(-)857 +595 y Fg(\017)857 662 y(\016)1022 595 y(\014)1022 662 +y(\015)p 891 662 100 2 v 891 595 V 880 633 a Ff(a...z)p +1023 629 42 2 v 816 728 V 816 727 a Fh(-)857 695 y Fg(\017)857 +761 y(\016)1022 695 y(\014)1022 761 y(\015)p 891 761 +100 2 v 891 695 V 880 736 a Ff(A...Z)p 1023 728 42 2 +v 816 828 V 816 827 a Fh(-)857 795 y Fg(\017)857 861 +y(\016)928 795 y(\014)928 861 y(\015)p 891 861 5 2 v +891 795 V 881 834 a Ff(-)p 928 828 42 2 v 970 828 95 +2 v 816 928 42 2 v 816 927 a Fh(-)857 894 y Fg(\017)857 +961 y(\016)928 894 y(\014)928 961 y(\015)p 891 961 5 +2 v 891 894 V 881 932 a Ff(_)p 928 928 42 2 v 970 928 +95 2 v 816 1027 42 2 v 816 1026 a Fh(-)857 994 y Fg(\017)857 +1060 y(\016)1022 994 y(\014)1022 1060 y(\015)p 891 1061 +100 2 v 891 994 V 880 1035 a Ff(0...9)p 1023 1027 42 +2 v 1064 1026 2 399 v 1064 1026 a Fh(?)p 815 1026 V 1064 +1027 42 2 v 774 628 2 67 v 774 628 a(?)p 774 562 332 +2 v 1105 1026 2 465 v 1106 1027 42 2 v 1106 1026 a(-)572 +1157 y Fo(Diagram)f(1:)h(Non-terminals)h(\()p Ff(nonterm)p +Fo(\))72 1330 y Fp(2.1.3)50 b(T)l(erminals)72 1416 y +Fo(In)15 b Fk(ARA)g Fo(terminals)g(are)g(enclosed)h(in)f +Ff('')g Fo(c)o(haracters.)k(They)c(can)g(con)o(tain)g(an)o(y)f(ASCI)q +(I)i(c)o(haracter)72 1472 y(from)d(33)g(\()p Ff(!)p Fo(\))g(to)g(126)g +(\()p Ff(~)p Fo(\).)18 b(Exceptions)d(are)e(the)h(c)o(haracter)f +Ff(')g Fo(and)h(the)g(bac)o(kslash|they)g(m)o(ust)g(b)q(e)72 +1529 y(quoted)j(with)h(the)f(bac)o(kslash.)27 b(After)17 +b(compilation)i(with)e Fk(SYNGEN)p Fo(,)g(terminals)h(app)q(ear)g(in)g +(o)o(v)m(al)72 1585 y(b)q(o)o(xes.)i(The)15 b(complete)h(syn)o(tax)f +(is)g(giv)o(en)h(in)g(Diagram)f(2.)p 620 1711 V 620 1710 +a Fh(-)661 1678 y Fg(\017)661 1744 y(\016)732 1678 y(\014)732 +1744 y(\015)p 695 1744 5 2 v 695 1678 V 685 1719 a Ff(')p +733 1711 42 2 v 733 1711 V 774 1711 V 816 1711 V 816 +1710 a Fh(-)857 1678 y Fg(\017)857 1744 y(\016)1022 1678 +y(\014)1022 1744 y(\015)p 891 1744 100 2 v 891 1678 V +880 1719 a Ff(!...&)p 1023 1711 42 2 v 816 1811 V 816 +1810 a Fh(-)857 1777 y Fg(\017)857 1844 y(\016)1022 1777 +y(\014)1022 1844 y(\015)p 891 1844 100 2 v 891 1777 V +880 1820 a Ff(\(...[)p 1023 1811 42 2 v 816 1910 V 816 +1909 a Fh(-)857 1877 y Fg(\017)857 1943 y(\016)1022 1877 +y(\014)1022 1943 y(\015)p 891 1943 100 2 v 891 1877 V +880 1920 a Ff(]...~)p 1023 1910 42 2 v 816 2010 V 816 +2009 a Fh(-)857 1977 y Fg(\017)857 2043 y(\016)951 1977 +y(\014)951 2043 y(\015)p 891 2043 29 2 v 891 1977 V 881 +2020 a Ff(\\')p 952 2010 42 2 v 994 2010 71 2 v 816 2109 +42 2 v 816 2108 a Fh(-)857 2076 y Fg(\017)857 2143 y(\016)951 +2076 y(\014)951 2143 y(\015)p 891 2143 29 2 v 891 2076 +V 881 2119 a Ff(\\\\)p 952 2109 42 2 v 994 2109 71 2 +v 1064 2109 2 399 v 1064 2109 a Fh(?)p 815 2109 V 1064 +2109 42 2 v 774 1710 2 67 v 774 1710 a(?)p 774 1645 332 +2 v 1105 2109 2 465 v 1106 2109 42 2 v 1106 2109 V 1106 +2108 a(-)1147 2076 y Fg(\017)1147 2143 y(\016)1218 2076 +y(\014)1218 2143 y(\015)p 1181 2143 5 2 v 1181 2076 V +1171 2117 a Ff(')p 1218 2109 42 2 v 1218 2108 a Fh(-)651 +2240 y Fo(Diagram)f(2:)h(T)l(erminals)h(\()p Ff(term)p +Fo(\))72 2412 y Fp(2.1.4)50 b(P)o(a)o(rameters)72 2498 +y Fo(T)l(o)20 b(get)f(a)h(compact)f(represen)o(tation,)i(one)f(can)g +(use)g(a)g(diagram)f(to)h(represen)o(t)f(more)h(then)g(one)72 +2554 y(language)d(elemen)o(t.)27 b(F)l(or)17 b(ev)o(ery)g(represen)o +(ted)g(non-terminal)i(a)e Fm(p)n(ar)n(ameter)h(element)j +Fo(can)c(b)q(e)h(in-)929 2760 y(3)p eop +%%Page: 4 4 +4 3 bop 605 100 a Fn(2)45 b(Ho)o(w)14 b(to)h(mak)o(e)g(syn)o(tax)f +(diagrams)p 72 117 1737 2 v 72 248 a Fo(tro)q(duced.)22 +b(With)16 b(that)f(elemen)o(t)i(a)e(path)h(can)g(b)q(e)g(lo)q(c)o(k)o +(ed)g(for)g(all)g(non-terminals)h(not)e(men)o(tioned)72 +304 y(in)h(it.)k(Dra)o(wn)14 b(with)i Fk(SYNGEN)p Fo(,)f(parameter)f +(elemen)o(ts)i(are)f(enclosed)i(in)f(dashed)g(b)q(o)o(xes.)143 +360 y(P)o(arameters)9 b(ma)o(y)h(consist)h(of)f(all)h(ASCI)q(I)h(c)o +(haracters)e(from)g(33)g(\()p Ff(!)p Fo(\))g(to)g(126)g(\()p +Ff(~)p Fo(\).)17 b(Exceptions)12 b(are)72 417 y(the)f +Ff(>)g Fo(sign)g(and)g(again)g(the)g(bac)o(kslash,)h(whic)o(h)g(is)f +(used)g(to)g(represen)o(t)g(this)g(c)o(haracters.)18 +b(P)o(arameters)72 473 y(has)d(to)g(b)q(e)h(enclosed)g(in)g +Ff(<)f Fo(and)h Ff(>)f Fo(signs.)20 b(The)15 b(complete)h(rules)g(are)f +(sho)o(wn)g(in)h(Diagram)e(3.)p 620 599 42 2 v 620 598 +a Fh(-)661 566 y Fg(\017)661 632 y(\016)732 566 y(\014)732 +632 y(\015)p 695 632 5 2 v 695 566 V 685 606 a Ff(<)p +733 599 42 2 v 733 599 V 774 599 V 816 599 V 816 598 +a Fh(-)857 566 y Fg(\017)857 632 y(\016)1022 566 y(\014)1022 +632 y(\015)p 891 632 100 2 v 891 566 V 880 607 a Ff(!...=)p +1023 599 42 2 v 816 699 V 816 698 a Fh(-)857 666 y Fg(\017)857 +732 y(\016)1022 666 y(\014)1022 732 y(\015)p 891 732 +100 2 v 891 666 V 880 709 a Ff(?...[)p 1023 699 42 2 +v 816 799 V 816 798 a Fh(-)857 765 y Fg(\017)857 832 +y(\016)1022 765 y(\014)1022 832 y(\015)p 891 832 100 +2 v 891 765 V 880 808 a Ff(]...~)p 1023 799 42 2 v 816 +898 V 816 897 a Fh(-)857 865 y Fg(\017)857 931 y(\016)951 +865 y(\014)951 931 y(\015)p 891 931 29 2 v 891 865 V +881 908 a Ff(\\>)p 952 898 42 2 v 994 898 71 2 v 816 +998 42 2 v 816 997 a Fh(-)857 965 y Fg(\017)857 1031 +y(\016)951 965 y(\014)951 1031 y(\015)p 891 1031 29 2 +v 891 965 V 881 1008 a Ff(\\\\)p 952 998 42 2 v 994 998 +71 2 v 1064 997 2 399 v 1064 997 a Fh(?)p 815 997 V 1064 +998 42 2 v 774 598 2 67 v 774 598 a(?)p 774 533 332 2 +v 1105 997 2 465 v 1106 998 42 2 v 1106 998 V 1106 997 +a(-)1147 965 y Fg(\017)1147 1031 y(\016)1218 965 y(\014)1218 +1031 y(\015)p 1181 1031 5 2 v 1181 965 V 1171 1005 a +Ff(>)p 1218 998 42 2 v 1218 997 a Fh(-)633 1128 y Fo(Diagram)h(3:)f(P)o +(arameter)g(\()p Ff(param)p Fo(\))72 1302 y Fi(2.2)56 +b(Building)20 b(up)e(diagrams)72 1388 y Fo(The)h(basic)g(elemen)o(ts)g +(of)f(the)g(last)g(section)h(can)g(b)q(e)g(com)o(bined)g(to)f(syn)o +(tax)g(diagrams)g(according)72 1444 y(to)g(the)i(follo)o(wing)f(rules.) +33 b(The)19 b(op)q(erators)f(are)h(listed)h(in)g(rev)o(ersed)f(order)g +(of)g(their)g(priorit)o(y)l(.)32 b(A)72 1501 y(summary)15 +b(of)f(the)i(rules)g(is)f(giv)o(en)h(in)g(the)f(\(recursiv)o(e\))h +(Diagram)e(4.)p 455 1596 V 496 1596 V 496 1595 a Fh(-)p +536 1562 122 2 v 536 1628 2 67 v 656 1628 V 536 1630 +122 2 v 561 1604 a Ff(ARA)p 656 1596 42 2 v 656 1596 +V 656 1595 a Fh(-)697 1563 y Fg(\017)697 1629 y(\016)768 +1563 y(\014)768 1629 y(\015)p 731 1629 5 2 v 731 1563 +V 721 1606 a Ff(|)p 768 1596 42 2 v 768 1596 V 768 1595 +a Fh(-)p 808 1562 122 2 v 808 1628 2 67 v 928 1628 V +808 1630 122 2 v 833 1604 a Ff(ARA)p 928 1596 42 2 v +970 1596 415 2 v 496 1696 42 2 v 496 1695 a Fh(-)p 536 +1662 122 2 v 536 1728 2 67 v 656 1728 V 536 1730 122 +2 v 561 1704 a Ff(ARA)p 656 1696 42 2 v 656 1696 V 656 +1695 a Fh(-)p 696 1662 122 2 v 696 1728 2 67 v 816 1728 +V 696 1730 122 2 v 721 1704 a Ff(ARA)p 816 1696 42 2 +v 857 1696 528 2 v 496 1795 42 2 v 538 1795 V 538 1794 +a Fh(-)578 1762 y Fg(\017)578 1829 y(\016)649 1762 y(\014)649 +1829 y(\015)p 612 1829 5 2 v 612 1762 V 603 1802 a Ff(+)p +650 1795 42 2 v 650 1795 V 692 1795 V 692 1794 a Fh(-)p +731 1761 146 2 v 731 1828 2 67 v 875 1828 V 731 1830 +146 2 v 756 1802 a Ff(term)p 875 1795 42 2 v 691 1861 +2 67 v 692 1862 225 2 v 916 1861 2 67 v 916 1836 a Fh(6)p +916 1795 42 2 v 537 1894 2 100 v 538 1895 421 2 v 957 +1894 2 100 v(6)p 958 1795 42 2 v 958 1795 V 958 1794 +a(-)999 1762 y Fg(\017)999 1829 y(\016)1070 1762 y(\014)1070 +1829 y(\015)p 1033 1829 5 2 v 1033 1762 V 1023 1805 a +Ff({)p 1070 1795 42 2 v 1070 1795 V 1070 1794 a Fh(-)p +1110 1761 122 2 v 1110 1828 2 67 v 1230 1828 V 1110 1830 +122 2 v 1135 1803 a Ff(ARA)p 1230 1795 42 2 v 1230 1795 +V 1230 1794 a Fh(-)1271 1762 y Fg(\017)1271 1829 y(\016)1342 +1762 y(\014)1342 1829 y(\015)p 1305 1829 5 2 v 1305 1762 +V 1295 1805 a Ff(})p 1343 1795 42 2 v 496 1961 V 496 +1960 a Fh(-)537 1928 y Fg(\017)537 1995 y(\016)608 1928 +y(\014)608 1995 y(\015)p 571 1995 5 2 v 571 1928 V 561 +1971 a Ff([)p 609 1961 42 2 v 609 1961 V 609 1960 a Fh(-)p +648 1927 122 2 v 648 1994 2 67 v 768 1994 V 648 1996 +122 2 v 673 1969 a Ff(ARA)p 768 1961 42 2 v 768 1961 +V 768 1960 a Fh(-)809 1928 y Fg(\017)809 1995 y(\016)880 +1928 y(\014)880 1995 y(\015)p 843 1995 5 2 v 843 1928 +V 833 1971 a Ff(])p 881 1961 42 2 v 922 1961 462 2 v +496 2061 42 2 v 496 2060 a Fh(-)p 536 2027 146 2 v 536 +2093 2 67 v 680 2093 V 536 2095 146 2 v 561 2068 a Ff(term)p +680 2061 42 2 v 721 2061 664 2 v 496 2161 42 2 v 496 +2160 a Fh(-)p 536 2127 217 2 v 536 2193 2 67 v 750 2193 +V 536 2195 217 2 v 561 2167 a Ff(nonterm)p 750 2161 42 +2 v 792 2161 593 2 v 496 2260 42 2 v 496 2259 a Fh(-)p +536 2226 169 2 v 536 2293 2 67 v 703 2293 V 536 2295 +169 2 v 561 2265 a Ff(param)p 703 2260 42 2 v 745 2260 +640 2 v 496 2360 42 2 v 496 2359 a Fh(-)537 2327 y Fg(\017)537 +2393 y(\016)608 2327 y(\014)608 2393 y(\015)p 571 2393 +5 2 v 571 2327 V 561 2370 a Ff(\()p 609 2360 42 2 v 609 +2360 V 609 2359 a Fh(-)p 648 2326 122 2 v 648 2392 2 +67 v 768 2392 V 648 2394 122 2 v 673 2368 a Ff(ARA)p +768 2360 42 2 v 768 2360 V 768 2359 a Fh(-)809 2327 y +Fg(\017)809 2393 y(\016)880 2327 y(\014)880 2393 y(\015)p +843 2393 5 2 v 843 2327 V 833 2370 a Ff(\))p 881 2360 +42 2 v 922 2360 462 2 v 1383 2359 2 764 v 1384 2359 a +Fh(?)p 495 2359 V 1384 2360 42 2 v -42 w(-)464 2490 y +Fo(Diagram)g(4:)h(Enric)o(hed)h(Regular)g(Expressions)g(\()p +Ff(ARA)p Fo(\))929 2760 y(4)p eop +%%Page: 5 5 +5 4 bop 605 100 a Fn(2)45 b(Ho)o(w)14 b(to)h(mak)o(e)g(syn)o(tax)f +(diagrams)p 72 117 1737 2 v 72 248 a Fp(2.2.1)50 b(Choice)72 +333 y Fo(If)16 b(there)g(are)g(sev)o(eral)g(p)q(ossible)h +Fk(ARA)p Fo('s)e(from)g(whic)o(h)i(one)f(can)g(c)o(ho)q(ose)g(the)g +(righ)o(t,)f(then)h(the)g(cases)72 390 y(ha)o(v)o(e)f(to)f(b)q(e)i +(separated)f(b)o(y)g Ff(|)g Fo(c)o(haracters.)72 471 +y Fn(Example)211 516 y Ff(expr)163 573 y(|)24 b(expr)f('+')g(expr)163 +629 y(|)h(expr)f('-')g(expr)72 672 y Fe(\))p 163 723 +42 2 v 204 723 V 204 722 a Fh(-)p 244 689 146 2 v 244 +756 2 67 v 388 756 V 244 758 146 2 v 269 728 a Ff(expr)p +388 723 42 2 v 429 723 296 2 v 204 823 42 2 v 204 822 +a Fh(-)p 244 789 146 2 v 244 855 2 67 v 388 855 V 244 +857 146 2 v 269 828 a Ff(expr)p 388 823 42 2 v 388 823 +V 388 822 a Fh(-)428 790 y Fg(\017)428 856 y(\016)499 +790 y(\014)499 856 y(\015)p 463 856 5 2 v 463 790 V 453 +829 a Ff(+)p 500 823 42 2 v 500 823 V 500 822 a Fh(-)p +540 789 146 2 v 540 855 2 67 v 684 855 V 540 857 146 +2 v 565 828 a Ff(expr)p 684 823 42 2 v 204 922 V 204 +921 a Fh(-)p 244 888 146 2 v 244 955 2 67 v 388 955 V +244 957 146 2 v 269 927 a Ff(expr)p 388 922 42 2 v 388 +922 V 388 921 a Fh(-)428 889 y Fg(\017)428 956 y(\016)499 +889 y(\014)499 956 y(\015)p 463 956 5 2 v 463 889 V 453 +929 a Ff(-)p 500 922 42 2 v 500 922 V 500 921 a Fh(-)p +540 888 146 2 v 540 955 2 67 v 684 955 V 540 957 146 +2 v 565 927 a Ff(expr)p 684 922 42 2 v 724 922 2 200 +v 725 922 a Fh(?)p 204 922 V 725 922 42 2 v 725 921 a(-)72 +1075 y Fp(2.2.2)50 b(Concatenation)72 1161 y Fo(T)l(o)15 +b(get)g(a)g(sequence)h(of)f Fk(ARA)p Fo('s,)f(they)h(are)g(written)g +(directly)i(one)e(b)q(ehind)i(the)f(other.)72 1242 y +Fn(Example)163 1308 y Ff('if')23 b(expr)h('then')f(expr)g('else')g +(expr)72 1380 y Fe(\))p 163 1430 V 163 1429 a Fh(-)204 +1397 y Fg(\017)204 1464 y(\016)298 1397 y(\014)298 1464 +y(\015)p 238 1464 29 2 v 238 1397 V 228 1438 a Ff(if)p +299 1430 42 2 v 299 1430 V 299 1429 a Fh(-)p 339 1396 +146 2 v 339 1463 2 67 v 482 1463 V 339 1465 146 2 v 364 +1435 a Ff(expr)p 482 1430 42 2 v 482 1430 V 482 1429 +a Fh(-)523 1397 y Fg(\017)523 1464 y(\016)665 1397 y(\014)665 +1464 y(\015)p 557 1464 76 2 v 557 1397 V 547 1438 a Ff(then)p +666 1430 42 2 v 666 1430 V 666 1429 a Fh(-)p 706 1396 +146 2 v 706 1463 2 67 v 849 1463 V 706 1465 146 2 v 730 +1435 a Ff(expr)p 849 1430 42 2 v 849 1430 V 849 1429 +a Fh(-)890 1397 y Fg(\017)890 1464 y(\016)1032 1397 y(\014)1032 +1464 y(\015)p 924 1464 76 2 v 924 1397 V 914 1438 a Ff(else)p +1032 1430 42 2 v 1032 1430 V 1032 1429 a Fh(-)p 1072 +1396 146 2 v 1072 1463 2 67 v 1216 1463 V 1072 1465 146 +2 v 1097 1435 a Ff(expr)p 1216 1430 42 2 v 1216 1429 +a Fh(-)72 1583 y Fp(2.2.3)50 b(Optional)17 b(comp)q(onents)72 +1669 y Fo(If)e(an)f Fk(ARA)h Fo(is)g(optional,)g(the)g(appropriate)f +(expression)i(has)e(to)g(b)q(e)h(enclosed)h(in)g(square)e(brac)o(k)o +(ets.)72 1750 y Fn(Example)163 1818 y Ff('if')23 b(expr)h('then')f +(expr)g(['else')g(expr])72 1888 y Fe(\))p 163 1939 V +163 1938 a Fh(-)204 1905 y Fg(\017)204 1972 y(\016)298 +1905 y(\014)298 1972 y(\015)p 238 1972 29 2 v 238 1905 +V 228 1947 a Ff(if)p 299 1939 42 2 v 299 1939 V 299 1938 +a Fh(-)p 339 1904 146 2 v 339 1971 2 67 v 482 1971 V +339 1973 146 2 v 364 1943 a Ff(expr)p 482 1939 42 2 v +482 1939 V 482 1938 a Fh(-)523 1905 y Fg(\017)523 1972 +y(\016)665 1905 y(\014)665 1972 y(\015)p 557 1972 76 +2 v 557 1905 V 547 1947 a Ff(then)p 666 1939 42 2 v 666 +1939 V 666 1938 a Fh(-)p 706 1904 146 2 v 706 1971 2 +67 v 849 1971 V 706 1973 146 2 v 730 1943 a Ff(expr)p +849 1939 42 2 v 849 1939 V 891 1939 V 891 1938 a Fh(-)931 +1905 y Fg(\017)931 1972 y(\016)1073 1905 y(\014)1073 +1972 y(\015)p 965 1972 76 2 v 965 1905 V 955 1947 a Ff(else)p +1074 1939 42 2 v 1074 1939 V 1074 1938 a Fh(-)p 1114 +1904 146 2 v 1114 1971 2 67 v 1257 1971 V 1114 1973 146 +2 v 1139 1943 a Ff(expr)p 1257 1939 42 2 v 890 2004 2 +67 v 891 2005 409 2 v 1298 2004 2 67 v 1299 1979 a Fh(6)p +1299 1939 42 2 v 1299 1938 a(-)72 2124 y Fp(2.2.4)50 +b(Rep)q(etitions)72 2210 y Fo(There)15 b(are)g(three)h(w)o(a)o(ys)e(to) +g(rep)q(eat)i(an)f(expression)h(in)g Fk(ARA)p Fo(.)p +72 2291 18 18 v 143 2291 a(Zero)e(or)h(sev)o(eral)g(rep)q +(etitions|denoted)j(with)d(curly)h(brac)o(k)o(ets.)929 +2760 y(5)p eop +%%Page: 6 6 +6 5 bop 605 100 a Fn(2)45 b(Ho)o(w)14 b(to)h(mak)o(e)g(syn)o(tax)f +(diagrams)p 72 117 1737 2 v 143 248 a(Example)234 315 +y Ff({impl-phrase)22 b(';;'})143 385 y Fe(\))p 234 469 +42 2 v 275 469 V 275 468 a Fh(-)p 315 435 311 2 v 315 +502 2 67 v 624 502 V 315 504 311 2 v 339 477 a Ff(impl-phrase)p +624 469 42 2 v 624 469 V 624 468 a Fh(-)664 436 y Fg(\017)664 +502 y(\016)759 436 y(\014)759 502 y(\015)p 698 502 29 +2 v 698 436 V 689 474 a Ff(;;)p 760 469 42 2 v 274 468 +2 67 v 275 468 a Fh(?)p 275 403 527 2 v 801 468 2 67 +v 274 535 V 275 536 527 2 v 801 535 2 67 v 801 510 a(6)p +801 469 42 2 v 801 468 a(-)p 72 629 18 18 v 143 629 a +Fo(One)16 b(or)e(sev)o(eral)i(rep)q(etitions|denoted)h(in)f(curly)g +(brac)o(k)o(ets)f(with)g(a)g(leading)h(plus)h(sign.)143 +729 y Fn(Example)234 801 y Ff(+{)23 b('A...Z')g(|)h('0...9')f(})143 +866 y Fe(\))p 234 950 42 2 v 275 950 V 317 950 V 317 +949 a Fh(-)357 917 y Fg(\017)357 984 y(\016)523 917 y(\014)523 +984 y(\015)p 391 984 100 2 v 391 917 V 381 958 a Ff(A...Z)p +524 950 42 2 v 317 1050 V 317 1049 a Fh(-)357 1017 y +Fg(\017)357 1083 y(\016)523 1017 y(\014)523 1083 y(\015)p +391 1083 100 2 v 391 1017 V 381 1058 a Ff(0...9)p 524 +1050 42 2 v 564 1049 2 100 v 565 1049 a Fh(?)p 316 1049 +V 565 1050 42 2 v 274 950 2 67 v 275 950 a(?)p 275 884 +332 2 v 606 1049 2 167 v 607 1050 42 2 v 607 1049 a(-)p +72 1176 18 18 v 143 1176 a Fo(One)e(or)g(sev)o(eral)g(rep)q(etitions)h +(with)g(a)e(separating)h(terminal.)38 b(This)22 b(construct)e(is)i(lik) +o(e)g(the)143 1233 y(former)14 b(one,)i(except)f(that)g(the)h +(additional)g(terminal)h(has)e(to)g(b)q(e)h(inserted)g(b)q(et)o(w)o +(een)g(the)f(plus)143 1289 y(sign)g(and)h(the)f(op)q(ening)h(brac)o(k)o +(et.)143 1389 y Fn(Example)234 1457 y Ff('let')23 b(['rec'])g(+)g +('and')h({)f(let-binding)g(})g('in')h(expr)143 1527 y +Fe(\))p 234 1677 42 2 v 234 1676 a Fh(-)274 1644 y Fg(\017)274 +1710 y(\016)392 1644 y(\014)392 1710 y(\015)p 308 1710 +52 2 v 308 1644 V 298 1685 a Ff(let)p 393 1677 42 2 v +393 1677 V 435 1677 V 435 1676 a Fh(-)475 1644 y Fg(\017)475 +1710 y(\016)594 1644 y(\014)594 1710 y(\015)p 509 1710 +52 2 v 509 1644 V 500 1682 a Ff(rec)p 594 1677 42 2 v +434 1743 2 67 v 435 1744 202 2 v 635 1743 2 67 v 636 +1718 a Fh(6)p 636 1677 42 2 v 636 1677 V 677 1677 V 677 +1676 a(-)p 717 1643 311 2 v 717 1710 2 67 v 1026 1710 +V 717 1712 311 2 v 741 1685 a Ff(let-binding)p 1026 1677 +42 2 v 813 1544 a Fg(\017)813 1611 y(\016)931 1544 y(\014)931 +1611 y(\015)p 847 1611 52 2 v 847 1544 V 837 1586 a Ff(and)p +677 1676 2 100 v 677 1676 a Fh(?)p 932 1578 137 2 v 677 +1578 V 1067 1676 2 100 v 1068 1677 42 2 v 1068 1677 V +349 w(-)1108 1644 y Fg(\017)1108 1710 y(\016)1203 1644 +y(\014)1203 1710 y(\015)p 1142 1710 29 2 v 1142 1644 +V 1133 1685 a Ff(in)p 1204 1677 42 2 v 1204 1677 V 1204 +1676 a Fh(-)p 1244 1643 146 2 v 1244 1710 2 67 v 1387 +1710 V 1244 1712 146 2 v 1268 1682 a Ff(expr)p 1387 1677 +42 2 v 1387 1676 a Fh(-)72 1863 y Fp(2.2.5)50 b(Grouping)72 +1949 y Fo(Ev)o(ery)12 b(expression)i(in)g Fk(ARA)e Fo(can)h(b)q(e)h +(enclosed)g(in)g(paren)o(theses)f(to)f(form)g(groups.)18 +b(F)l(or)13 b(an)f(example)72 2005 y(lo)q(ok)k(at)e(the)h(concluding)j +(Diagram)c(5)h(in)h(this)g(section.)72 2127 y Fi(2.3)56 +b(Options)72 2213 y Fo(The)15 b(follo)o(wing)h(diagram)f(sho)o(ws)g +(the)g(syn)o(tax)g(of)f(a)h Fk(SYNGEN)h Fo(call.)929 +2760 y(6)p eop +%%Page: 7 7 +7 6 bop 605 100 a Fn(2)45 b(Ho)o(w)14 b(to)h(mak)o(e)g(syn)o(tax)f +(diagrams)p 72 117 1737 2 v 508 269 42 2 v 508 268 a +Fh(-)549 236 y Fg(\017)549 302 y(\016)738 236 y(\014)738 +302 y(\015)p 583 302 123 2 v 583 236 V 573 274 a Ff(syngen)p +739 269 42 2 v 739 269 V 780 269 V 822 269 V 863 269 +V 863 268 a Fh(-)904 236 y Fg(\017)904 302 y(\016)998 +236 y(\014)998 302 y(\015)p 938 302 29 2 v 938 236 V +928 275 a Ff(-c)p 999 269 42 2 v 863 369 V 863 368 a +Fh(-)904 336 y Fg(\017)904 402 y(\016)998 336 y(\014)998 +402 y(\015)p 938 402 29 2 v 938 336 V 928 375 a Ff(-o)p +999 369 42 2 v 863 468 V 863 467 a Fh(-)904 435 y Fg(\017)904 +502 y(\016)998 435 y(\014)998 502 y(\015)p 938 502 29 +2 v 938 435 V 928 475 a Ff(-a)p 999 468 42 2 v 863 568 +V 863 567 a Fh(-)904 535 y Fg(\017)904 601 y(\016)998 +535 y(\014)998 601 y(\015)p 938 601 29 2 v 938 535 V +928 576 a Ff(-h)p 999 568 42 2 v 863 668 V 863 667 a +Fh(-)904 634 y Fg(\017)904 701 y(\016)998 634 y(\014)998 +701 y(\015)p 938 701 29 2 v 938 634 V 928 676 a Ff(-f)p +999 668 42 2 v 1040 667 2 399 v 1041 667 a Fh(?)p 862 +667 V 1041 668 42 2 v 1041 668 V -42 w(-)p 1081 634 169 +2 v 1081 700 2 67 v 1248 700 V 1081 702 169 2 v 1105 +676 a Ff(value)p 1248 668 42 2 v 822 767 V 822 766 a +Fh(-)862 734 y Fg(\017)862 800 y(\016)1099 734 y(\014)1099 +800 y(\015)p 896 800 170 2 v 896 734 V 886 775 a Ff(-version)p +1100 767 42 2 v 1141 767 149 2 v 822 867 42 2 v 822 866 +a Fh(-)p 862 833 240 2 v 862 899 2 67 v 1100 899 V 862 +901 240 2 v 886 875 a Ff(filename)p 1100 867 42 2 v 1141 +867 149 2 v 1288 866 2 200 v 1289 866 a Fh(?)p 821 866 +2 598 v 1289 867 42 2 v 779 268 2 67 v 780 268 a(?)p +780 203 551 2 v 1330 866 2 665 v 779 932 V 780 933 551 +2 v 1330 932 2 67 v 1331 908 a(6)p 1331 867 42 2 v 1331 +866 a(-)143 1034 y Fo(The)g(lo)q(ok)h(of)f(the)g(output)g(can)h(b)q(e)g +(con)o(trolled)g(b)o(y)f(the)g(sev)o(eral)h(options.)20 +b(Because)15 b(the)f(syn)o(tax)72 1090 y(diagrams)f(are)g(build)j(up)e +(from)f(the)g(basic)i(elemen)o(ts,)f(the)f(options)h(are)f(mostly)h +(deal)g(with)g(the)f(size)72 1146 y(of)j(terminal,)i(non-terminal)g +(and)f(parameter)f(b)q(o)o(xes.)25 b(All)18 b(v)m(alues,)g(except)f +Fd(f)5 b Fo(,)17 b(ha)o(v)o(e)f(to)g(b)q(e)i(giv)o(en)72 +1203 y(in)e(terms)f(of)f Ff(\\unitlength)p Fo(,)g(whic)o(h)i(is)g(b)o +(y)f(default)g(equal)h(to)f(1)7 b(pt.)20 b(The)15 b(options)h(are:)p +360 1261 1161 2 v 359 1317 2 57 v 385 1300 a(option)p +535 1317 V 434 w(meaning)p 1520 1317 V 360 1319 1161 +2 v 359 1375 2 57 v 385 1358 a Ff(-c)f Fd(c)p 535 1375 +V 93 w Fo(Length)h(of)e(connect)i(lines)h(on)e(basic)h(b)q(o)o(xes.)p +1520 1375 V 359 1432 V 385 1415 a Ff(-o)f Fd(o)p 535 +1432 V 91 w Fo(Length)h(of)e(a)h(c)o(haracter.)p 1520 +1432 V 359 1488 V 385 1471 a Ff(-a)g Fd(a)p 535 1488 +V 89 w Fo(Additional)i(o\013set)d(to)h(the)g(b)q(o)o(x)g(length.)p +1520 1488 V 359 1545 V 385 1528 a Ff(-h)g Fd(h)p 535 +1545 V 87 w Fo(Heigh)o(t)g(of)g(basic)h(b)q(o)o(xes.)p +1520 1545 V 359 1601 V 385 1584 a Ff(-f)f Fd(f)p 535 +1601 V 91 w Fo(V)l(ertically)i(stac)o(k)o(ed)d(b)q(o)o(xes)i(are)f +(separated)g(b)o(y)g Fd(h)10 b Fe(\001)g Fd(f)5 b Fo(.)p +1520 1601 V 360 1603 1161 2 v 72 1681 a(The)17 b(next)g(v)m(alues)h +(are)e(a)h(go)q(o)q(d)f(c)o(hoice)i(for)e(the)h(normal)g(Computer)f(Mo) +q(dern)h(T)o(yp)q(ewriter)g(T)o(yp)q(e)72 1737 y(fon)o(t)f(family)l(.) +27 b(They)18 b(are)e(listed)j(in)f(dep)q(endency)h(of)e(the)g(fon)o(t)g +(size)h(and)f(under)h(the)f(assumption,)72 1793 y(that)e +Ff(\\unitlength)e Fo(is)j(equal)g(to)e(1)8 b(pt.)p 519 +1851 843 2 v 518 1908 2 57 v 544 1891 a(fon)o(t)14 b(size)p +733 1908 V 64 w Fd(c)p 828 1908 V 126 w(o)p 1027 1908 +V 142 w(a)p 1157 1908 V 88 w(h)p 1252 1908 V 75 w(f)p +1360 1908 V 519 1909 843 2 v 518 1966 2 57 v 544 1949 +a Fo(10)7 b(pt)p 733 1966 V 141 w(8)p 828 1966 V 50 w(5.24995)p +1027 1966 V 47 w(10.5)p 1157 1966 V 49 w(14)p 1252 1966 +V 49 w(0.5)p 1360 1966 V 518 2022 V 544 2005 a(11)g(pt)p +733 2022 V 118 w(10)p 828 2022 V 50 w(5.69145)p 1027 +2022 V 47 w(11.4)p 1157 2022 V 49 w(16)p 1252 2022 V +49 w(0.5)p 1360 2022 V 518 2079 V 544 2062 a(12)g(pt)p +733 2079 V 118 w(12)p 828 2079 V 50 w(6.175)p 1027 2079 +V 93 w(12.4)p 1157 2079 V 49 w(18)p 1252 2079 V 49 w(0.5)p +1360 2079 V 519 2080 843 2 v 72 2158 a(The)18 b(v)m(alues)g(for)f(a)g +(10)7 b(pt)17 b(fon)o(t)f(are)h(prede\014ned)i(and)f(used,)g(if)f(no)h +(options)f(are)g(giv)o(en.)27 b(The)17 b(next)72 2215 +y(picture)g(sho)o(ws)e(the)i(e\013ect)e(of)h(the)g(v)m(alues)h +Fd(c)p Fo(,)f Fd(o)p Fo(,)g Fd(a)g Fo(and)g Fd(h)g Fo(on)g(a)g +(non-terminal)h(b)q(o)o(x)f(with)g(a)g(sev)o(en)72 2271 +y(c)o(haracter)f(string.)p 556 2387 119 4 v 633 2385 +a Fc(-)p 1088 2387 V 489 w(-)p 671 2326 421 4 v 671 2444 +4 119 v 752 2407 a Fb(testbox)p 1088 2444 V 671 2447 +421 4 v 556 2504 60 2 v 557 2503 a Fh(\033)p 615 2504 +V 34 w(-)p 674 2504 296 2 v -1 w(\033)p 970 2504 119 +2 v 330 w(-)p 1088 2504 60 2 v(\033)p 1147 2504 V 34 +w(-)p 1264 2385 2 60 v 1265 2367 a(6)p 1264 2444 V 1265 +2444 a(?)p 555 2527 2 142 v 674 2527 2 83 v 1087 2527 +V 1205 2527 2 142 v 1088 2327 201 2 v 1088 2445 V 606 +2542 a Fd(c)803 2545 y Fo(7)9 b Fe(\001)h Fd(o)g Fo(+)h +Fd(a)1137 2542 y(c)1281 2401 y(h)929 2760 y Fo(7)p eop +%%Page: 8 8 +8 7 bop 613 100 a Fn(3)46 b(Ho)o(w)14 b(to)h(read)g(syn)o(tax)f +(diagrams)p 72 117 1737 2 v 72 248 a Fi(2.4)56 b(A)18 +b(complete)i(example)72 333 y Fo(The)h(problem)h(is)f(to)g(mak)o(e)f(a) +h(diagram)f(for)h(an)g(en)o(umeration)g(de\014nition)i(and)e +(declaration)h(of)72 390 y(the)e(language)f Fk(C)374 +383 y Fa(+)l(+)438 390 y Fo(\(tak)o(en)g(from)f([3]\))h(and)g(to)g +(include)j(it)e(in)g(a)f(11)7 b(pt)19 b(L)1370 381 y +Fj(A)1389 390 y Fo(T)1414 400 y(E)1441 390 y(X-do)q(cumen)o(t.)33 +b(The)72 446 y(description)17 b(in)f Fk(ARA)f Fo(is:)163 +538 y Ff('enum')23 b(\()71 b(<def>)24 b([name])f('{')g(+)h(',')f({name) +g(['=')h(expr]})f('}')378 594 y(|)g(<dekl>)g(name)330 +651 y(\))72 737 y Fo(This)16 b(input)g(is)g(compiled)h(b)o(y)e +Fk(SYNGEN)g Fo(with)h(the)f(call)163 838 y Ff(syngen)23 +b(-c)h(10)f(-h)h(16)f(-o)h(5.69145)f(-a)g(11.4)h(example.ara)72 +944 y Fo(and)15 b(can)h(b)q(e)g(included)h(in)f(the)g(do)q(cumen)o(t)f +(with)163 1027 y Ff(\\begin{figure}[ht])187 1083 y +(\\centerline{\\input{exampl)o(e.syn}})163 1140 y(\\caption{$<$dekl,)21 +b(def$>$)j(enumeration})163 1196 y(\\end{figure})72 1289 +y Fo(The)15 b(result)h(is)g(giv)o(en)g(in)g(Diagram)e(5.)p +138 1480 42 2 v 138 1479 a Fh(-)179 1447 y Fg(\017)179 +1513 y(\016)321 1447 y(\014)321 1513 y(\015)p 213 1513 +76 2 v 213 1447 V 203 1485 a Ff(enum)p 321 1480 42 2 +v 321 1480 V 363 1480 V 363 1479 a Fh(-)p 404 1513 5 +2 v 404 1447 V 519 1513 V 519 1447 V 417 1513 9 2 v 434 +1513 V 450 1513 V 467 1513 V 483 1513 V 500 1513 V 417 +1447 V 434 1447 V 450 1447 V 467 1447 V 483 1447 V 500 +1447 V 404 1512 2 5 v 522 1512 V 404 1450 V 522 1450 +V 404 1467 2 9 v 404 1483 V 404 1500 V 522 1467 V 522 +1483 V 522 1500 V 428 1488 a Ff(def)p 523 1480 42 2 v +523 1480 V 564 1480 V 564 1479 a Fh(-)p 604 1446 146 +2 v 604 1512 2 67 v 748 1512 V 604 1514 146 2 v 629 1485 +a Ff(name)p 748 1480 42 2 v 563 1546 2 67 v 564 1546 +225 2 v 788 1546 2 67 v 789 1521 a Fh(6)p 789 1480 42 +2 v 789 1480 V 789 1479 a(-)830 1447 y Fg(\017)830 1513 +y(\016)901 1447 y(\014)901 1513 y(\015)p 864 1513 5 2 +v 864 1447 V 854 1490 a Ff({)p 902 1480 42 2 v 902 1480 +V 943 1480 V 943 1479 a Fh(-)p 983 1446 146 2 v 983 1512 +2 67 v 1126 1512 V 983 1514 146 2 v 1008 1485 a Ff(name)p +1126 1480 42 2 v 1126 1480 V 1168 1480 V 1168 1479 a +Fh(-)1209 1447 y Fg(\017)1209 1513 y(\016)1280 1447 y(\014)1280 +1513 y(\015)p 1243 1513 5 2 v 1243 1447 V 1233 1485 a +Ff(=)p 1280 1480 42 2 v 1280 1480 V 1280 1479 a Fh(-)p +1320 1446 146 2 v 1320 1512 2 67 v 1464 1512 V 1320 1514 +146 2 v 1345 1485 a Ff(expr)p 1464 1480 42 2 v 1167 1546 +2 67 v 1168 1546 338 2 v 1504 1546 2 67 v 1505 1521 a +Fh(6)p 1505 1480 42 2 v 1209 1347 a Fg(\017)1209 1414 +y(\016)1280 1347 y(\014)1280 1414 y(\015)p 1243 1414 +5 2 v 1243 1347 V 1233 1385 a Ff(,)p 942 1479 2 100 v +943 1479 a Fh(?)p 1280 1380 267 2 v 943 1380 V 1546 1479 +2 100 v 1547 1480 42 2 v 1547 1480 V 562 w(-)1587 1447 +y Fg(\017)1587 1513 y(\016)1658 1447 y(\014)1658 1513 +y(\015)p 1621 1513 5 2 v 1621 1447 V 1612 1490 a Ff(})p +1659 1480 42 2 v 363 1613 V 363 1612 a Fh(-)p 404 1646 +9 2 v 421 1646 V 438 1646 V 454 1646 V 471 1646 V 488 +1646 V 504 1646 V 521 1646 V 537 1646 V 404 1580 V 421 +1580 V 438 1580 V 454 1580 V 471 1580 V 488 1580 V 504 +1580 V 521 1580 V 537 1580 V 404 1645 2 5 v 545 1645 +V 404 1583 V 545 1583 V 404 1600 2 9 v 404 1616 V 404 +1633 V 545 1600 V 545 1616 V 545 1633 V 428 1621 a Ff(dekl)p +546 1613 42 2 v 546 1613 V 546 1612 a Fh(-)p 586 1579 +146 2 v 586 1645 2 67 v 730 1645 V 586 1647 146 2 v 611 +1618 a Ff(name)p 730 1613 42 2 v 771 1613 930 2 v 1700 +1612 2 133 v 1701 1612 a Fh(?)p 362 1612 V 1701 1613 +42 2 v -42 w(-)571 1743 y Fo(Diagram)g(5:)h Fd(<)p Fo(dekl,)h(def)p +Fd(>)g Fo(en)o(umeration)72 1934 y Fq(3)66 b(Ho)n(w)22 +b(to)g(read)f(syntax)h(diagrams)72 2036 y Fo(The)15 b(rules)g(for)f +(reading)i(syn)o(tax)d(diagrams)i(are)f(sho)o(wn)g(language)h(indep)q +(enden)o(t)i(in)f(the)f(follo)o(wing)72 2092 y(p)q(oin)o(ts.)p +72 2172 18 18 v 143 2172 a(Ev)o(ery)j(diagram)g(represen)o(ts)g(one)h +(language)g(elemen)o(t)g(or)f(a)g(group)g(of)g(them.)30 +b(If)18 b(a)h(group)f(is)143 2229 y(giv)o(en,)d(the)g(diagram)g(is)h +(parameterized)g(with)f(the)g(individual)k(elemen)o(ts.)p +72 2321 V 143 2321 a(Non-terminals)i(are)f(represen)o(ted)h(b)o(y)g +(rectangular)f(b)q(o)o(xes,)i(terminals)f(b)o(y)g(o)o(v)m(al)f(b)q(o)o +(xes)h(and)143 2377 y(parameters)14 b(are)h(enclosed)h(in)g(dashed)g(b) +q(o)o(xes.)p 72 2470 V 143 2470 a(The)f(run)h(through)e(the)i(diagram)f +(starts)e(at)i(the)g(leftmost)g(p)q(oin)o(t.)p 72 2562 +V 143 2562 a(The)g(direction)i(of)d(reading)i(is)g(giv)o(en)f(b)o(y)h +(the)f(arro)o(ws)f(on)h(the)g(end)h(of)f(ev)o(ery)g(line.)929 +2760 y(8)p eop +%%Page: 9 9 +9 8 bop 835 109 a Fn(References)p 72 117 1737 2 v 72 +248 18 18 v 143 248 a Fo(The)15 b(run)h(stops,)e(if)h(the)h(righ)o +(tmost)e(p)q(oin)o(t)i(of)e(the)i(diagram)f(has)g(reac)o(hed.)p +72 341 V 143 341 a(If)e(a)h(parameter)e(elemen)o(t)i(app)q(ears)g(on)f +(the)h(w)o(a)o(y)f(through)g(the)g(diagram,)g(then)h(this)g(p)q(oin)o +(t)g(can)143 398 y(only)h(b)q(e)h(passed)g(while)g(pro)q(ducing)h(the)e +(corresp)q(onding)h(language)g(elemen)o(t.)72 541 y Fq(References)72 +643 y Fo([1])22 b(Martin)12 b(Reiser)i(and)f(Niklaus)h(Wirth.)i +Fm(Pr)n(o)n(gr)n(amming)e(in)f(Ob)n(er)n(on:)19 b(Steps)13 +b(b)n(eyond)h(Pasc)n(al)f(and)143 699 y(Mo)n(dula)p Fo(.)20 +b(Addison-W)l(esley)l(,)d(W)l(okingham,)e(1992.)72 793 +y([2])22 b(P)o(eter)11 b(Thiemann.)k Fm(Grund)r(lagen)e(der)g +(funktionalen)f(Pr)n(o)n(gr)n(ammierung)p Fo(.)i(T)l(eubner,)f +(Stuttgart,)143 849 y(1994.)72 943 y([3])22 b(J.)15 b(W)l(ol\013)h(v)o +(on)f(Guden)o(b)q(erg.)22 b Fm(Objektorientiert)16 b(pr)n(o)n(gr)n +(ammier)n(en)g(von)g(A)o(nfang)g(an)p Fo(.)21 b(BI-Wiss.-)143 +999 y(V)l(erl.,)15 b(Mannheim,)h(1993.)72 1093 y([4])22 +b(J.)k(W)l(ol\013)h(v)o(on)f(Guden)o(b)q(erg.)54 b Fm(A)o(lgorithmen,) +29 b(Datenstruktur)n(en,)g(F)m(unktionale)c(Pr)n(o)n(gr)n(am-)143 +1150 y(mierung.)d(Eine)g(pr)n(aktische)h(Einf)q(\177)-24 +b(uhrung)23 b(mit)f Fl(CAML)f(LIGHT)p Fo(.)40 b(Addison-W)l(esley)l(,) +26 b(Bonn,)143 1206 y(1996.)929 2760 y(9)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/support/syngen/src/Makefile b/support/syngen/src/Makefile new file mode 100644 index 0000000000..70b3bfb37b --- /dev/null +++ b/support/syngen/src/Makefile @@ -0,0 +1,73 @@ +# Compilation options +CSLC=cslc +CSLOPT=cslopt +CSLDEP=csldep +INCLUDES= +CSLFLAGS=$(INCLUDES) +CSLOPTFLAGS=$(INCLUDES) + +# The directory where the public executable will be installed +BINDIR=/usr/local/bin + +# The manual section where the manual pages will be installed +MANEXT=1 + +# The directory where the manual pages will be installed +MANDIR=/usr/local/man/man$(MANEXT) + +##### End of configuration section + + +# The commands for bytecode compilation + +# The list of object files in bytecode format +SYNGEN_BYTE_OBJS=lexer.cmo parser.cmo picture.cmo boxes.cmo latexcode.cmo\ + main.cmo + +byte: $(SYNGEN_BYTE_OBJS) + $(CSLC) -o syngen $(CSLFLAGS) $(SYNGEN_BYTE_OBJS) + + +# The commands for native-code compilation + +# The list of object files in native-code format +SYNGEN_NATIVE_OBJS=lexer.cmx parser.cmx picture.cmx boxes.cmx\ + latexcode.cmx main.cmx + +native: $(SYNGEN_NATIVE_OBJS) + $(CSLOPT) -o syngen $(CSLOPTFLAGS) $(SYNGEN_NATIVE_OBJS) + + +# Common rules + +.SUFFIXES: .ml .mli .cmo .cmi .cmx + +.ml.cmo: + $(CSLC) $(CSLFLAGS) -c $< + +.mli.cmi: + $(CSLC) $(CSLFLAGS) -c $< + +.ml.cmx: + $(CSLOPT) $(CSLOPTFLAGS) -c $< + + +# Clean up + +clean: + rm -f *.cm[iox] *.o *~ + + +# Installation + +install: + cp syngen $(BINDIR)/syngen + cp syngen.m $(MANDIR)/syngen.$(MANEXT) + + +# Dependencies + +depend: + $(CSLDEP) $(INCLUDES) *.mli *.ml > depend + +include depend diff --git a/support/syngen/src/boxes.ml b/support/syngen/src/boxes.ml new file mode 100644 index 0000000000..ba02d84adf --- /dev/null +++ b/support/syngen/src/boxes.ml @@ -0,0 +1,104 @@ +open Parser + +type box = TermBox of dim * char list + | NonTermBox of dim * char list + | ParamBox of dim * char list + | OptBox of dim * box + | RepBox of dim * box + | TermRepBox of dim * box * box + | OptRepBox of dim * box + | OrBoxList of dim * box list + | ConBox of dim * box * box + +and dim = {l : float; h : float; lc : float; rc : float} + +let dim = function + TermBox (d, _) -> d + | NonTermBox (d, _) -> d + | ParamBox (d, _) -> d + | OptBox (d, _) -> d + | RepBox (d, _) -> d + | TermRepBox (d, _, _) -> d + | OptRepBox (d, _) -> d + | OrBoxList (d, _) -> d + | ConBox (d, _, _) -> d + +let dim_l t = (dim t).l +and dim_h t = (dim t).h +and dim_lc t = (dim t).lc +and dim_rc t = (dim t).rc + +let of_syntree box_con box_off char_off box_height box_sep_frac = + let atom_dim lst = { l = 2. *. box_con +. float (List.length lst) *. + char_off +. box_off; + h = box_height; + lc = box_height /. 2.; + rc = box_height /. 2. + } in + let rec of_syntree_rec = function + NonTerm lst -> NonTermBox (atom_dim lst, lst) + | Term lst -> TermBox (atom_dim lst, lst) + | Param lst -> ParamBox (atom_dim lst, lst) + | Rep t -> let t = of_syntree_rec t in + RepBox ( + { l = dim_l t +. 2. *. box_con; + h = dim_h t +. box_height /. 2.; + lc = dim_lc t +. box_height /. 2.; + rc = dim_rc t + }, t) + | TermRep (t, Term lst) -> let t = of_syntree_rec t + and lng = float (List.length lst) in + TermRepBox ( + { l = dim_l t +. 2. *. box_con; + h = dim_h t +. box_height +. box_height /. 2.; + lc = dim_lc t +. 3. *. box_height /. 2.; + rc = dim_rc t + }, t, + TermBox ( + { l = lng *. char_off +. box_off; + h = box_height; + lc = box_height /. 2.; + rc = box_height /. 2. + }, lst)) + | OptRep t -> let t = of_syntree_rec t in + OptRepBox ( + { l = dim_l t +. 2. *. box_con; + h = dim_h t +. box_height; + lc = dim_lc t +. box_height /. 2.; + rc = dim_rc t +. box_height /. 2. + }, t) + | Opt t -> let t = of_syntree_rec t in + OptBox ( + { l = dim_l t +. 2. *. box_con; + h = dim_h t +. box_height /. 2.; + lc = dim_lc t; + rc = dim_rc t +. box_height /. 2. + }, t) + | Con (t1, t2) -> let t1 = of_syntree_rec t1 + and t2 = of_syntree_rec t2 in + ConBox ( + { l = dim_l t1 +. dim_l t2 -. box_con; + h = (max ((dim_h t1) -. (dim_rc t1)) + (dim_lc t2)) +. + (max (dim_rc t1) ((dim_h t2) -. (dim_lc t2))); + lc = (let a = (dim_lc t2) -. ((dim_h t1) -. (dim_rc t1)) + in if a > 0. then (dim_lc t1) +. a + else (dim_lc t1)); + rc = (let a = (dim_rc t1) -. ((dim_h t2) -. (dim_lc t2)) + in if a > 0. then (dim_rc t2) +. a + else (dim_rc t2)) + }, t1, t2) + | OrList lst -> + let lst = List.map of_syntree_rec lst + and box_sep = box_height *. box_sep_frac in + let new_l = List.fold_left (fun l1 t2 -> max l1 (dim_l t2)) 0. lst + and new_h = List.fold_left (fun h1 t2 -> h1 +. dim_h t2 +. box_sep) + (~-. box_sep) lst in + OrBoxList ( + { l = new_l +. 2. *. box_con; + h = new_h; + lc = dim_lc (List.hd lst); + rc = dim_rc (List.hd (List.rev lst)) + }, lst) + | _ -> raise (Failure "Parser Bug") +in of_syntree_rec diff --git a/support/syngen/src/boxes.mli b/support/syngen/src/boxes.mli new file mode 100644 index 0000000000..11a99dd83b --- /dev/null +++ b/support/syngen/src/boxes.mli @@ -0,0 +1,18 @@ +type box = TermBox of dim * char list + | NonTermBox of dim * char list + | ParamBox of dim * char list + | OptBox of dim * box + | RepBox of dim * box + | TermRepBox of dim * box * box + | OptRepBox of dim * box + | OrBoxList of dim * box list + | ConBox of dim * box * box + +and dim = {l : float; h : float; lc : float; rc : float} + +val dim_l : box -> float +val dim_h : box -> float +val dim_lc : box -> float +val dim_rc : box -> float + +val of_syntree : float -> float -> float -> float -> float -> Parser.syntree -> box diff --git a/support/syngen/src/depend b/support/syngen/src/depend new file mode 100644 index 0000000000..2b7425fe2a --- /dev/null +++ b/support/syngen/src/depend @@ -0,0 +1,14 @@ +boxes.cmi: parser.cmi +latexcode.cmi: boxes.cmi picture.cmi +boxes.cmo: parser.cmi boxes.cmi +boxes.cmx: parser.cmx boxes.cmi +latexcode.cmo: boxes.cmi picture.cmi latexcode.cmi +latexcode.cmx: boxes.cmx picture.cmx latexcode.cmi +lexer.cmo: lexer.cmi +lexer.cmx: lexer.cmi +main.cmo: boxes.cmi latexcode.cmi parser.cmi picture.cmi +main.cmx: boxes.cmx latexcode.cmx parser.cmx picture.cmx +parser.cmo: lexer.cmi parser.cmi +parser.cmx: lexer.cmx parser.cmi +picture.cmo: picture.cmi +picture.cmx: picture.cmi diff --git a/support/syngen/src/latexcode.ml b/support/syngen/src/latexcode.ml new file mode 100644 index 0000000000..3cc9f3c241 --- /dev/null +++ b/support/syngen/src/latexcode.ml @@ -0,0 +1,146 @@ +open Boxes +open Picture + +let rec tex_string = function + [] -> "" + | h::t -> let chr = match h + with '#' -> "\char'43{}" + | '$' -> "\char'44{}" + | '%' -> "\char'45{}" + | '&' -> "\char'46{}" + | '*' -> "\char'52{}" + | '^' -> "\char'136{}" + | '_' -> "\char'137{}" + | '{' -> "\char'173{}" + | '}' -> "\char'175{}" + | '~' -> "\char'176{}" + | '\\' -> "\char'134{}" + | _ -> String.make 1 h + in (tex_string t) ^ chr + +let last s = List.hd (List.rev s) + +let strbalance = "\\rule[-\\bdepth]{0pt}{\\bheight}" +and strfont = "\\ttfamily{}" +and epsilon = 1.0e-10 + +let generate box_con box_off char_off box_height box_sep_frac t = + let rec out_list xend yoff = function + [] -> [] + | h :: s -> + let difference = xend -. dim_l h -. box_con + and box_sep = box_height *. box_sep_frac + and ypos = if yoff -. dim_h h < epsilon then 0. + else yoff -. dim_h h in + if abs_float difference < epsilon then + SubPicture ((box_con, ypos), generate_aux false h, []) :: + out_list xend (ypos -. box_sep) s + else + SubPicture ((box_con, ypos), generate_aux false h, []) :: + Line ((box_con +. dim_l h, ypos +. dim_rc h), 1, 0, + difference, []) :: + out_list xend (ypos -. box_sep) s + and generate_aux islast = function + TermBox (d, s) -> + Picture (d.l, d.h, 0., 0., [ + Line ((0., d.h -. d.lc), 1, 0, box_con, [Arrowhead]); + Oval ((d.l /. 2., d.h /. 2.), d.l -. 2. *. box_con, box_height, []); + Text ((d.l /. 2., d.h /. 2.), strfont ^ tex_string s ^ strbalance, + []); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | ParamBox (d, s) -> + Picture (d.l, d.h, 0., 0., [ + Line ((0., d.h -. d.lc), 1, 0, box_con, [Arrowhead]); + Framebox ((box_con, 0.), d.l -. 2. *. box_con, box_height, + [Dashed 2.]); + Text ((d.l /. 2., d.h /. 2.), strfont ^ tex_string s ^ strbalance, + []); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | NonTermBox (d, s) -> + Picture (d.l, d.h, 0., 0., [ + Line ((0., d.h -. d.lc), 1, 0, box_con, [Arrowhead]); + Framebox ((box_con, 0.), d.l -. 2. *. box_con, box_height, []); + Text ((d.l /. 2., d.h /. 2.), strfont ^ tex_string s ^ strbalance, + []); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | OptBox (d, t) -> + Picture (d.l, d.h, 0., 0., [ + Line ((0., d.h -. d.lc), 1, 0, box_con, []); + SubPicture ((box_con, box_height /. 2.), generate_aux false t, []); + Line ((box_con, d.h -. d.lc), 0, -1, d.h -. d.lc, []); + Line ((box_con, 0.), 1, 0, d.l -. 2. *. box_con, []); + Line ((d.l -. box_con, 0.), 0, 1, d.rc, [Arrowhead]); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | RepBox (d, t) -> + Picture (d.l, d.h, 0., 0., [ + Line ((0., d.h -. d.lc), 1, 0, box_con, []); + SubPicture ((box_con, 0.), generate_aux false t, []); + Line ((box_con, d.h), 0, -1, d.lc, [Arrowhead]); + Line ((d.l -. box_con, d.h), -1, 0, d.l -. 2. *. box_con, []); + Line ((d.l -. box_con, d.h), 0, -1, d.h -. d.rc, []); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | TermRepBox (d, t1, TermBox (d1, s)) -> + Picture (d.l, d.h, 0., 0., [ + Line ((0., d.h -. d.lc), 1, 0, box_con, []); + SubPicture ((box_con, 0.), generate_aux false t1, []); + Oval ((d.l /. 2., d.h -. box_height /. 2.), d1.l, box_height, []); + Text ((d.l /. 2., d.h -. box_height /. 2.), + strfont ^ tex_string s ^ strbalance, []); + Line ((box_con, d.h -. box_height /. 2.), 0, -1, + d.lc -. box_height /. 2., [Arrowhead]); + Line ((d.l -. box_con, d.h -. box_height /. 2.), -1, 0, + d.l /. 2. -. box_con -. d1.l /. 2., []); + Line ((box_con, d.h -. box_height /. 2.), 1, 0, + d.l /. 2. -. box_con -. d1.l /. 2., []); + Line ((d.l -. box_con, d.h -. box_height /. 2.), 0, -1, + d.h -. d.rc -. box_height /. 2., []); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | OptRepBox (d, t) -> + Picture (d.l, d.h, 0., 0., [ + Line ((0., d.h -. d.lc), 1, 0, box_con, []); + SubPicture ((box_con, box_height /. 2.), generate_aux false t, []); + Line ((box_con, d.h), 0, -1, d.lc, [Arrowhead]); + Line ((d.l -. box_con, d.h), -1, 0, d.l -. 2. *. box_con, []); + Line ((d.l -. box_con, d.h), 0, -1, d.h -. d.rc, []); + Line ((box_con, d.h -. d.lc), 0, -1, d.h -. d.lc, []); + Line ((box_con, 0.), 1, 0, d.l -. 2. *. box_con, []); + Line ((d.l -. box_con, 0.), 0, 1, d.rc, [Arrowhead]); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | OrBoxList (d, l) -> + Picture (d.l, d.h, 0., 0., + Line ((0., d.h -. d.lc), 1, 0, box_con, []) :: + (out_list (d.l -. box_con) d.h l) @ [ + Line ((d.l -. box_con, d.h -. dim_h (List.hd l) +. + dim_rc (List.hd l)), 0, -1, + d.h -. dim_h (List.hd l) +. dim_rc (List.hd l) -. d.rc, + [Arrowhead]); + Line ((box_con, d.h -. d.lc), 0, -1, + d.h -. d.lc -. (let lst = last l + in dim_h lst -. dim_lc lst), []); + Line ((d.l -. box_con, d.rc), 1, 0, box_con, + if islast then [Arrowhead] else []) + ]) + | ConBox (d, t1, t2) -> + let a = dim_h t2 -. dim_lc t2 -. dim_rc t1 in + Picture (d.l, d.h, 0., 0., [ + SubPicture ((0., if a > 0. then a else 0.), generate_aux false t1, + []); + SubPicture ((dim_l t1 -. box_con, if a < 0. then ~-.a else 0.), + generate_aux islast t2, []) + ]) + | _ -> raise (Failure "Bug im Parser!") +in generate_aux true t diff --git a/support/syngen/src/latexcode.mli b/support/syngen/src/latexcode.mli new file mode 100644 index 0000000000..4b26a51e55 --- /dev/null +++ b/support/syngen/src/latexcode.mli @@ -0,0 +1,4 @@ +open Boxes +open Picture + +val generate : float -> float -> float -> float -> float -> box -> picture diff --git a/support/syngen/src/lexer.ml b/support/syngen/src/lexer.ml new file mode 100644 index 0000000000..1622c15bd5 --- /dev/null +++ b/support/syngen/src/lexer.ml @@ -0,0 +1,53 @@ +type token = LPAR | RPAR | LAPAR | RAPAR | LSPAR | RSPAR + | PLUS + | MID + | PARAM of char list + | NONTERM of char list + | TERM of char list + +let rec spaces = parser + [< ' (' ' | '\t' | '\n'); _ = spaces >] -> () + | [< >] -> () + +let nonterm c = + let rec nonterm_rec l = parser + [< ' ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_') as c; + s = nonterm_rec (c :: l) >] -> s + | [< >] -> NONTERM l +in nonterm_rec [c] + +let term = + let rec term_rec l = parser + [< ' ('\033'..'\038' | '\040'..'\091' | '\093'..'\126') as c; + s = term_rec (c :: l) >] -> s + | [< ' ('\\'); 'c; s = term_rec (c::l) >] -> s + | [< >] -> TERM l +in term_rec [] + +let param = + let rec param_rec l = parser + [< ' ('\033'..'\061' | '\063'..'\091' | '\093'..'\126') as c; + s = param_rec (c :: l) >] -> s + | [< ' ('\\'); 'c; + s = param_rec (c :: l) >] -> s + | [< >] -> PARAM l +in param_rec [] + +let rec lexer str = (spaces str; + match str + with parser + [< ' ('('); _ = spaces >] -> [< 'LPAR; lexer str >] + | [< ' (')'); _ = spaces >] -> [< 'RPAR; lexer str >] + | [< ' ('{'); _ = spaces >] -> [< 'LAPAR; lexer str >] + | [< ' ('}'); _ = spaces >] -> [< 'RAPAR; lexer str >] + | [< ' ('['); _ = spaces >] -> [< 'LSPAR; lexer str >] + | [< ' (']'); _ = spaces >] -> [< 'RSPAR; lexer str >] + | [< ' ('+'); _ = spaces >] -> [< 'PLUS; lexer str >] + | [< ' ('|'); _ = spaces >] -> [< 'MID; lexer str >] + | [< ' ('\''); tok = term; ' ('\''); _ = spaces >] + -> [< 'tok; lexer str >] + | [< ' ('<'); tok = param; ' ('>'); _ = spaces >] + -> [< 'tok; lexer str >] + | [< ' ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_') as c; + tok = nonterm c; _ = spaces >] -> [< 'tok; lexer str >] +) diff --git a/support/syngen/src/lexer.mli b/support/syngen/src/lexer.mli new file mode 100644 index 0000000000..5a600a4e94 --- /dev/null +++ b/support/syngen/src/lexer.mli @@ -0,0 +1,8 @@ +type token = LPAR | RPAR | LAPAR | RAPAR | LSPAR | RSPAR + | PLUS + | MID + | PARAM of char list + | NONTERM of char list + | TERM of char list + +val lexer : char Stream.t -> token Stream.t diff --git a/support/syngen/src/main.ml b/support/syngen/src/main.ml new file mode 100644 index 0000000000..6bb5894451 --- /dev/null +++ b/support/syngen/src/main.ml @@ -0,0 +1,53 @@ +let version () = + print_string "This is Syngen version 0.4 (c) Jens Kloecker 1996.\n"; + flush stdout + +let box_con = ref 8. +and box_off = ref 10.5 +and char_off = ref 5.24995 +and box_height = ref 14. +and box_sep_frac = ref 0.5 + +let update loc x = loc := x + +let speclist = [("-c", Arg.Float (update box_con)); + ("-a", Arg.Float (update box_off)); + ("-o", Arg.Float (update char_off)); + ("-h", Arg.Float (update box_height)); + ("-f", Arg.Float (update box_sep_frac)); + ("-version", Arg.Unit version)] + +let file_with_syn s = + if Filename.check_suffix s "ara" then + Filename.chop_suffix s "ara" ^ "syn" + else s ^ ".syn" + +let main s = + try + let in_file = open_in s + and out_file = open_out (file_with_syn s) + and init_tex = + "\\def\\ifundefined#1{\\expandafter\\ifx\\csname#1\\endcsname\\relax}%\n" ^ + "\\ifundefined{bdepth}\\newlength{\\bdepth}\\else\\relax\\fi%\n" ^ + "\\settodepth{\\bdepth}{\\ttfamily g}%\n" ^ + "\\ifundefined{bheight}\\newlength{\\bheight}\\else\\relax\\fi%\n" ^ + "\\settoheight{\\bheight}{\\ttfamily (}%\n" + in + output_string out_file init_tex; + Picture.output out_file ( + Latexcode.generate !box_con !box_off !char_off !box_height !box_sep_frac ( + Boxes.of_syntree !box_con !box_off !char_off !box_height !box_sep_frac ( + Parser.analyse (Stream.of_channel in_file) + ) + ) + ); + close_in in_file; + close_out out_file + with Sys_error t -> print_string t; print_newline () + | Stream.Parse_error t -> print_string "Syntax error in file: "; + print_string s; print_newline () + | Stream.Parse_failure -> print_string "Syntax error in file: "; + print_string s; print_newline () +;; + +Arg.parse speclist (Printexc.print main) diff --git a/support/syngen/src/parser.ml b/support/syngen/src/parser.ml new file mode 100644 index 0000000000..dbf9cc38f1 --- /dev/null +++ b/support/syngen/src/parser.ml @@ -0,0 +1,49 @@ +open Lexer + +type syntree = Term of char list + | NonTerm of char list + | Param of char list + | Opt of syntree + | Rep of syntree + | TermRep of syntree * syntree + | OptRep of syntree + | OrList of syntree list + | Con of syntree * syntree + +let analyse str = + + let rec rexp s = + let mid = parser [< 'MID >] -> () in + let rec restrexp e1 = parser + [< _ = mid; e2 = andrexp; e = restrexp + (match e1 + with OrList l -> OrList (l @ [e2]) + | _ -> OrList [e1; e2] + ) + >] -> e + | [< >] -> e1 + in match s with parser [< e1 = andrexp; e2 = restrexp e1 >] -> e2 + + and andrexp s = + let rec restand e1 = parser + [< e2 = reprexp; e = restand (Con (e1, e2)) >] -> e + | [< >] -> e1 + in match s with parser [< e1 = reprexp; e2 = restand e1 >] -> e2 + + and reprexp = parser + [< 'LSPAR; e = rexp; 'RSPAR >] -> Opt e + | [< 'PLUS; e = plusexp >] -> e + | [< 'LAPAR; e = rexp; 'RAPAR >] -> OptRep e + | [< e = atom >] -> e + + and plusexp = parser + [< 'TERM l; 'LAPAR; e = rexp; 'RAPAR >] -> TermRep (e, Term l) + | [< 'LAPAR; e = rexp; 'RAPAR >] -> Rep e + + and atom = parser + [< 'NONTERM l >] -> NonTerm l + | [< 'TERM l >] -> Term l + | [< 'PARAM l >] -> Param l + | [< 'LPAR; e = rexp; 'RPAR >] -> e + +in rexp (lexer str) diff --git a/support/syngen/src/parser.mli b/support/syngen/src/parser.mli new file mode 100644 index 0000000000..9812a61f05 --- /dev/null +++ b/support/syngen/src/parser.mli @@ -0,0 +1,11 @@ +type syntree = Term of char list + | NonTerm of char list + | Param of char list + | Opt of syntree + | Rep of syntree + | TermRep of syntree * syntree + | OptRep of syntree + | OrList of syntree list + | Con of syntree * syntree + +val analyse : char Stream.t -> syntree diff --git a/support/syngen/src/picture.ml b/support/syngen/src/picture.ml new file mode 100644 index 0000000000..87d7bbbd71 --- /dev/null +++ b/support/syngen/src/picture.ml @@ -0,0 +1,123 @@ +type picture = Picture of float * float * float * float * pic_object list + +and point = float * float + +and pic_object = Line of point * int * int * float * option list + | Circle of point * float * option list + | Oval of point * float * float * option list + | Text of point * string * option list + | Curve of point * point * point * option list + | SubPicture of point * picture * option list + | Framebox of point * float * float * option list + +and option = Arrowhead + | Anchor of anchor * anchor + | Filled + | Dashed of float + | Framed + | Points of int + +and anchor = N | L | R | T | B + +let string_of_anchor = function + N -> "n" | L -> "l" | R -> "r" | T -> "t" | B -> "b" + +let rec extract_anchor = function + [] -> "" + | Anchor (a1, a2) :: s -> "[" ^ (string_of_anchor a1) ^ + (string_of_anchor a2) ^ "]" + | _ :: s -> extract_anchor s + +let rec extract_points = function + [] -> "" + | Points i :: s -> "[" ^ (string_of_int i) ^ "]" + | _ :: s -> extract_points s + +let rec extract_dashed = function + [] -> "" + | Dashed i :: s -> (string_of_float i) + | _ :: s -> extract_dashed s + +let string_of_point (x, y) = + "(" ^ (string_of_float x) ^ "," ^ (string_of_float y) ^ ")" + +let rec output_pic_objects channel = function + [] -> () + | Line (p, xsl, ysl, length, ol) :: s -> ( + output_string channel ( + "\\put" ^ (string_of_point p) ^ + (if List.mem Arrowhead ol then "{\\vector(" else "{\\line(") ^ + (string_of_int xsl) ^ "," ^ (string_of_int ysl) ^ "){" ^ + (string_of_float length) ^ "}}%\n" + ); + output_pic_objects channel s + ) + | Circle (p, d, ol) :: s -> ( + let framed = List.mem Framed ol in + output_string channel ( + "\\put" ^ (string_of_point p) ^ + (if framed then "{\\frame{" else "{") ^ + (if List.mem Filled ol then "\\circle*{" else "\\circle{") ^ + (string_of_float d) ^ + (if framed then "}}}%\n" else "}}%\n") + ); + output_pic_objects channel s + ) + | Oval (p, l, h, ol) :: s -> ( + let framed = List.mem Framed ol in + output_string channel ( + "\\put" ^ (string_of_point p) ^ + (if framed then "{\\frame{" else "{") ^ + "\\oval" ^ (string_of_point (l, h)) ^ (extract_anchor ol) ^ + (if framed then "}}%\n" else "}%\n") + ); + output_pic_objects channel s + ) + | Text (p, t, ol) :: s -> ( + let framed = List.mem Framed ol in + output_string channel ( + "\\put" ^ (string_of_point p) ^ + (if framed then "{\\frame{" else "{") ^ + "\\makebox(0,0)" ^ (extract_anchor ol) ^ "{" ^ t ^ + (if framed then "}}}%\n" else "}}%\n") + ); + output_pic_objects channel s + ) + | Curve (p1, p2, p3, ol) :: s -> ( + output_string channel ( + "\\qbezier" ^ (extract_points ol) ^ (string_of_point p1) ^ + (string_of_point p2) ^ (string_of_point p3) ^ "%\n" + ); + output_pic_objects channel s + ) + | SubPicture (p, pic, ol) :: s -> ( + let framed = List.mem Framed ol in + output_string channel ( + "\\put" ^ (string_of_point p) ^ + (if framed then "{\\frame{" else "{") + ); + output channel pic; + output_string channel (if framed then "}}%\n" else "}%\n"); + output_pic_objects channel s + ) + | Framebox (p, l, h, ol) :: s -> ( + let framed = List.mem Framed ol in + output_string channel ( + "\\put" ^ (string_of_point p) ^ "{" ^ + ( let dc = extract_dashed ol + in if dc = "" then "\\framebox" + else "\\dashbox{" ^ dc ^ "}" ) ^ + (string_of_point (l, h)) ^ (extract_anchor ol) ^ "{%\n" + ); + output_string channel "}}%\n"; + output_pic_objects channel s + ) + +and output channel (Picture (xs, ys, xo, yo, l)) = ( + output_string channel ( + "\\begin{picture}" ^ (string_of_point (xs, ys)) ^ + (string_of_point (xo, yo)) ^ "%\n" + ); + output_pic_objects channel l; + output_string channel "\\end{picture}%\n" +) diff --git a/support/syngen/src/picture.mli b/support/syngen/src/picture.mli new file mode 100644 index 0000000000..a39857823b --- /dev/null +++ b/support/syngen/src/picture.mli @@ -0,0 +1,38 @@ +type picture = Picture of float * float * float * float * pic_object list + (* xsize, ysize, xorigin, yorigin, picture objects *) + +and point = float * float + (* x, y *) + +and pic_object = Line of point * int * int * float * option list + (* xpos, ypos, xslope, yslope, length, option list *) + + | Circle of point * float * option list + (* xpos, ypos, diameter, option list *) + + | Oval of point * float * float * option list + (* xpos, ypos, length, height, option list *) + + | Text of point * string * option list + (* xpos, ypos, text, option list *) + + | Curve of point * point * point * option list + (* first point, control point, last point, option list *) + + | SubPicture of point * picture * option list + (* xpos, ypos, subpicture, option list *) + + | Framebox of point * float * float * option list + (* xpos, ypos, length, height, option list *) + +and option = Arrowhead (* line *) + | Anchor of anchor * anchor (* oval, text, framebox *) + | Filled (* circle *) + | Dashed of float (* framebox *) + | Framed (* circle, oval, text, subpicture *) + | Points of int (* curve *) + +and anchor = N | L | R | T | B + + +val output : out_channel -> picture -> unit diff --git a/support/syngen/src/syngen.m b/support/syngen/src/syngen.m new file mode 100644 index 0000000000..b7b413530d --- /dev/null +++ b/support/syngen/src/syngen.m @@ -0,0 +1,85 @@ +.TH SYNGEN 1 + +.SH NAME +syngen \- a syntax diagram generator + + +.SH SYNOPSIS +.B syngen +[ +.BI \-c \ connect-length +] +[ +.BI \-o \ character-length +] +[ +.BI \-a \ length-offset +] +[ +.BI \-h \ box-height +] +[ +.BI \-f \ box-sep-frac +] +[ +.BI \-version +] +[ +.BI files... +] + +.SH DESCRIPTION + +.B syngen +is a generator for syntax diagrams. It takes files +.IR xxx \&.ara, +written in a special +language similar to BNF, and produces the corresponding output +files +.IR xxx \&.syn, +which can be included directly (without additional macros) +in LaTeX documents. + +.SH OPTIONS + +The following options are interpreted by +.BR syngen . +If an option is unused, then the predefined value for a 10pt +typewriter type font will be taken. + +.TP +.B \-c +The length of connect lines on basic boxes. + +.TP +.B \-o +The length of a character. + +.TP +.B \-a +Additional offset to the box length. + +.TP +.B \-h +The height of the basic boxes. + +.TP +.B \-f +Vertically stacked boxes are separated by +.eq +box-height * box-sep-frac. +.en + +.TP +.B \-version +Print a version info. + +.SH SEE ALSO + +.br +.I +The SYNGEN user's manual. + +.SH AUTHOR + +SYNGEN was written by Jens Kloecker, University of Wuerzburg, FRG.
\ No newline at end of file |