summaryrefslogtreecommitdiff
path: root/support/syngen
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/syngen
Initial commit
Diffstat (limited to 'support/syngen')
-rw-r--r--support/syngen/README47
-rwxr-xr-xsupport/syngen/bin/bytecode/syngenbin0 -> 60008 bytes
-rwxr-xr-xsupport/syngen/bin/linux-elf/syngenbin0 -> 296632 bytes
-rw-r--r--support/syngen/doc/manual.dvibin0 -> 39760 bytes
-rw-r--r--support/syngen/doc/manual.ps1344
-rw-r--r--support/syngen/src/Makefile73
-rw-r--r--support/syngen/src/boxes.ml104
-rw-r--r--support/syngen/src/boxes.mli18
-rw-r--r--support/syngen/src/depend14
-rw-r--r--support/syngen/src/latexcode.ml146
-rw-r--r--support/syngen/src/latexcode.mli4
-rw-r--r--support/syngen/src/lexer.ml53
-rw-r--r--support/syngen/src/lexer.mli8
-rw-r--r--support/syngen/src/main.ml53
-rw-r--r--support/syngen/src/parser.ml49
-rw-r--r--support/syngen/src/parser.mli11
-rw-r--r--support/syngen/src/picture.ml123
-rw-r--r--support/syngen/src/picture.mli38
-rw-r--r--support/syngen/src/syngen.m85
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
new file mode 100755
index 0000000000..c75fcf06ae
--- /dev/null
+++ b/support/syngen/bin/bytecode/syngen
Binary files differ
diff --git a/support/syngen/bin/linux-elf/syngen b/support/syngen/bin/linux-elf/syngen
new file mode 100755
index 0000000000..db71f6699f
--- /dev/null
+++ b/support/syngen/bin/linux-elf/syngen
Binary files differ
diff --git a/support/syngen/doc/manual.dvi b/support/syngen/doc/manual.dvi
new file mode 100644
index 0000000000..b00ea7c7a5
--- /dev/null
+++ b/support/syngen/doc/manual.dvi
Binary files differ
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