commit 063194f8befbf2f48e69847ecb0abd4b67ec4b89 Author: Jeena Paradies Date: Tue Apr 19 11:37:05 2011 +0200 first commit diff --git a/.j b/.j new file mode 100644 index 0000000..e69de29 diff --git a/AbsJavalette.hi b/AbsJavalette.hi new file mode 100644 index 0000000..695a23c Binary files /dev/null and b/AbsJavalette.hi differ diff --git a/AbsJavalette.hs b/AbsJavalette.hs new file mode 100644 index 0000000..927aa33 --- /dev/null +++ b/AbsJavalette.hs @@ -0,0 +1,87 @@ +module AbsJavalette where + +-- Haskell module generated by the BNF converter + +newtype Ident = Ident String deriving (Eq,Ord,Show) +data Program = + Program [TopDef] + deriving (Eq,Ord,Show) + +data TopDef = + FnDef Type Ident [Arg] Block + deriving (Eq,Ord,Show) + +data Arg = + Arg Type Ident + deriving (Eq,Ord,Show) + +data Block = + Block [Stmt] + deriving (Eq,Ord,Show) + +data Stmt = + Empty + | BStmt Block + | Decl Type [Item] + | Ass Ident Expr + | Incr Ident + | Decr Ident + | Ret Expr + | VRet + | Cond Expr Stmt + | CondElse Expr Stmt Stmt + | While Expr Stmt + | SExp Expr + deriving (Eq,Ord,Show) + +data Item = + NoInit Ident + | Init Ident Expr + deriving (Eq,Ord,Show) + +data Type = + Int + | Doub + | Bool + | Void + | Fun Type [Type] + deriving (Eq,Ord,Show) + +data Expr = + EVar Ident + | ELitInt Integer + | ELitDoub Double + | ELitTrue + | ELitFalse + | EApp Ident [Expr] + | EString String + | Neg Expr + | Not Expr + | EMul Expr MulOp Expr + | EAdd Expr AddOp Expr + | ERel Expr RelOp Expr + | EAnd Expr Expr + | EOr Expr Expr + | TAnot Type Expr + deriving (Eq,Ord,Show) + +data AddOp = + Plus + | Minus + deriving (Eq,Ord,Show) + +data MulOp = + Times + | Div + | Mod + deriving (Eq,Ord,Show) + +data RelOp = + LTH + | LE + | GTH + | GE + | EQU + | NE + deriving (Eq,Ord,Show) + diff --git a/AbsJavalette.hs.bak b/AbsJavalette.hs.bak new file mode 100644 index 0000000..f645838 --- /dev/null +++ b/AbsJavalette.hs.bak @@ -0,0 +1,86 @@ +module AbsJavalette where + +-- Haskell module generated by the BNF converter + +newtype Ident = Ident String deriving (Eq,Ord,Show) +data Program = + Program [TopDef] + deriving (Eq,Ord,Show) + +data TopDef = + FnDef Type Ident [Arg] Block + deriving (Eq,Ord,Show) + +data Arg = + Arg Type Ident + deriving (Eq,Ord,Show) + +data Block = + Block [Stmt] + deriving (Eq,Ord,Show) + +data Stmt = + Empty + | BStmt Block + | Decl Type [Item] + | Ass Ident Expr + | Incr Ident + | Decr Ident + | Ret Expr + | VRet + | Cond Expr Stmt + | CondElse Expr Stmt Stmt + | While Expr Stmt + | SExp Expr + deriving (Eq,Ord,Show) + +data Item = + NoInit Ident + | Init Ident Expr + deriving (Eq,Ord,Show) + +data Type = + Int + | Doub + | Bool + | Void + | Fun Type [Type] + deriving (Eq,Ord,Show) + +data Expr = + EVar Ident + | ELitInt Integer + | ELitDoub Double + | ELitTrue + | ELitFalse + | EApp Ident [Expr] + | EString String + | Neg Expr + | Not Expr + | EMul Expr MulOp Expr + | EAdd Expr AddOp Expr + | ERel Expr RelOp Expr + | EAnd Expr Expr + | EOr Expr Expr + deriving (Eq,Ord,Show) + +data AddOp = + Plus + | Minus + deriving (Eq,Ord,Show) + +data MulOp = + Times + | Div + | Mod + deriving (Eq,Ord,Show) + +data RelOp = + LTH + | LE + | GTH + | GE + | EQU + | NE + deriving (Eq,Ord,Show) + diff --git a/AbsJavalette.o b/AbsJavalette.o new file mode 100644 index 0000000..70c1dd6 Binary files /dev/null and b/AbsJavalette.o differ diff --git a/Compiler.hi b/Compiler.hi new file mode 100644 index 0000000..b0c2593 Binary files /dev/null and b/Compiler.hi differ diff --git a/Compiler.hs b/Compiler.hs new file mode 100644 index 0000000..45e99d9 --- /dev/null +++ b/Compiler.hs @@ -0,0 +1,195 @@ +module Compiler where + +import Debug.Trace +import AbsJavalette +import PrintJavalette +import ErrM +import Control.Monad.State +import Data.List + +type Variables = [[(Ident, Int)]] +-- vars, stackCount, localCount, labelCount, finalCode, tempCode, classname +type MyState = (Variables, Int, Int, Int, String, String, String) +type MyStateM = State MyState + + +compile :: Program -> String -> String +compile (Program fs) classname = + do let code = evalState (compileProgram fs >> getFinalCode) (emptyState classname) + boilerPlate classname code + +-- initializing functions +emptyState :: String -> MyState +emptyState classname = ([[]], 0, 0, "", "", classname) + +boilerPlate :: String -> String -> String +boilerPlate classname code = + ".class public " ++ classname ++ "\n" ++ + ".super java/lang/Object\n" ++ + ".method public ()V\n" ++ + " aload_0\n" ++ + " invokespecial java/lang/Object/()V\n" ++ + " return\n" ++ + ".end method\n\n" ++ + ".method public static main([Ljava/lang/String;)V\n" ++ + " .limit locals 1\n" ++ + " invokestatic " ++ classname ++ "/main()I\n" ++ + " pop\n" ++ + " return\n" ++ + ".end method\n\n" ++ + code + + +compileProgram :: [TopDef] -> MyStateM () +compileProgram [] = return () +compileProgram (f:fs) = + do compileFunc f + compileProgram fs + return () + +compileFunc :: TopDef -> MyStateM () +compileFunc f@(FnDef t (Ident i) a (Block s)) = + do compileStmts s + addFinalCode f + return () + + +compileStmts :: [Stmt] -> MyStateM () +compileStmts [] = return () +compileStmts (s:ss) = do compileStmt s + compileStmts ss + +compileStmt :: Stmt -> MyStateM () +compileStmt s = case s of + SExp e -> do compileExpr e + return () + Ret e -> do compileExpr e + return () + VRet -> do addTempCode (" return\n") + return () + Cond e stm -> do compileExpr e + addTempCode (" ") + return () + _ -> return () + +compileExpr :: Expr -> MyStateM () +compileExpr expr = case expr of + TAnot t (EApp (Ident i) exs) -> do ts <- compileList exs [] + let tss = intercalate "," (map (\a -> jType a) ts) + ci <- getClassIdent i + addTempCode (" invokestatic " ++ ci ++ "(" ++ tss ++ ")" ++ (jType t) ++ "\n") + addStackCount 1 + return () + EApp (Ident "printString") a -> do let EString s = head a + addTempCode (" ldc " ++ show s ++ "\n") + addTempCode (" invokestatic Runtime/printString(Ljava/lang/String;)V\n") + return () + TAnot t (ELitInt i) -> do case and [i >= 0, i <= 5] of + True -> addTempCode (" iconst_" ++ show i ++ "\n") + False -> case i == -1 of + True -> addTempCode (" iconst_m1") + False -> case and [i >= -128, i <= 127] of + True -> addTempCode (" bipush " ++ show i ++ "\n") + False -> addTempCode (" sipush " ++ show i ++ "\n") + addStackCount 1 + return () + TAnot t (EMul e1 op e2) -> do compileExpr e1 + compileExpr e2 + let ts = case t of + Int -> "i" + Doub -> "d" + case op of + Times -> addTempCode (" " ++ ts ++ "mul\n") + Div -> addTempCode (" " ++ ts ++ "div\n") + Mod -> addTempCode (" " ++ ts ++ "rem\n") + + TAnot t (EAdd e1 op e2) -> do compileExpr e1 + compileExpr e2 + let ts = case t of + Int -> "i" + Doub -> "d" + case op of + Plus -> addTempCode (" " ++ ts ++ "add\n") + Minus -> addTempCode (" " ++ ts ++ "sub\n") + return () + TAnot t (ELitDoub d) -> do case d of + 0.0 -> addTempCode (" dconst_0\n") + 1.0 -> addTempCode (" dconst_1\n") + _ -> addTempCode (" ldc2_w " ++ show d ++ "\n") + addStackCount 2 + return () + TAnot t (Neg e) -> do compileExpr e + case t of + Int -> addTempCode " ineg\n" + Doub -> addTempCode " dneg\n" + + e -> do addTempCode (" ; " ++ (show e) ++ "\n") + return () + +compileList :: [Expr] -> [Type] -> MyStateM ([Type]) +compileList [] ts = return (ts) +compileList (e2@(TAnot t e):es) ts = do compileExpr e2 + (compileList es (ts ++ [t])) + +-- +-- Helper functions +getFinalCode :: MyStateM (String) +getFinalCode = do (vars, stackCount, localCount, labelCount, final, temp, classname) <- get + return final + +addFinalCode :: TopDef -> MyStateM () +addFinalCode (FnDef t (Ident i) a (Block s)) = + do let p = intercalate "," (map (\(Arg t i) -> jType t) a) + let rt = case t of + Bool -> " ireturn\n" + Int -> " ireturn\n" + Doub -> " dreturn\n" + Void -> " return\n" + (vars, stackCount, localCount, labelCount, final, temp, classname) <- get + let newFinal = final ++ + ".method public static " ++ i ++ "(" ++ p ++ ")" ++ jType t ++ "\n" ++ + " .limit locals " ++ show localCount ++ "\n" ++ + " .limit stack " ++ show stackCount ++ "\n" ++ + temp ++ + rt ++ + ".end method\n\n" + put ([], 0, 0, labelCount, newFinal, "", classname) -- state + return () + +jType :: Type -> String +jType t = case t of + Int -> "I" + Doub -> "D" + Bool -> "B" + Void -> "V" + + +addTempCode :: String -> MyStateM () +addTempCode s = do (vars, stackCount, localCount, labelCount, final, temp, classname) <- get + let newTemp = temp ++ s + put (vars, stackCount, localCount, labelCount, final, newTemp, classname) -- state + return () + +addStackCount :: Int -> MyStateM () +addStackCount i = + do (vars, stackCount, localCount, labelCount, final, temp, classname) <- get + put (vars, stackCount + i, localCount, labelCount, final, temp, classname) -- state + return () + +getClassName :: MyStateM (String) +getClassName = do (vars, stackCount, localCount, labelCount, final, temp, classname) <- get + return classname + +incLabelCount :: MaStateM (Int) +incLabelCount = do (vars, stackCount, localCount, labelCount, final, temp, classname) <- get + put (vars, stackCount, localCount, labelCount + 1, final, temp, classname) + return labelCount + +getClassIdent :: String -> MyStateM (String) +getClassIdent i = + case find (== i) ["printString", "printDouble", "printInt", "readDouble", "readInt"] of + Just _ -> return ("Runtime/" ++ i) + Nothing -> do classname <- getClassName + return (classname ++ "/" ++ i) + + \ No newline at end of file diff --git a/Compiler.o b/Compiler.o new file mode 100644 index 0000000..de2312c Binary files /dev/null and b/Compiler.o differ diff --git a/DocJavalette.aux b/DocJavalette.aux new file mode 100644 index 0000000..f23e546 --- /dev/null +++ b/DocJavalette.aux @@ -0,0 +1 @@ +\relax diff --git a/DocJavalette.dvi b/DocJavalette.dvi new file mode 100644 index 0000000..22e0997 Binary files /dev/null and b/DocJavalette.dvi differ diff --git a/DocJavalette.log b/DocJavalette.log new file mode 100644 index 0000000..b174c2b --- /dev/null +++ b/DocJavalette.log @@ -0,0 +1,215 @@ +This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=latex 2010.8.12) 19 APR 2011 11:09 +entering extended mode +**DocJavalette.tex +(./DocJavalette.tex +LaTeX2e <2003/12/01> +Babel and hyphenation patterns for american, french, german, ngerman, b +ahasa, basque, bulgarian, catalan, croatian, czech, danish, dutch, esperanto, e +stonian, finnish, greek, icelandic, irish, italian, latin, magyar, norsk, polis +h, portuges, romanian, russian, serbian, slovak, slovene, spanish, swedish, tur +kish, ukrainian, nohyphenation, loaded. + +(/usr/share/texmf/tex/latex/base/article.cls +Document Class: article 2004/02/16 v1.4f Standard LaTeX document class +(/usr/share/texmf/tex/latex/base/size11.clo +File: size11.clo 2004/02/16 v1.4f Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) (./DocJavalette.aux) +\openout1 = `DocJavalette.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 9. +LaTeX Font Info: ... okay on input line 9. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 9. +LaTeX Font Info: ... okay on input line 9. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 9. +LaTeX Font Info: ... okay on input line 9. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 9. +LaTeX Font Info: ... okay on input line 9. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 9. +LaTeX Font Info: ... okay on input line 9. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 9. +LaTeX Font Info: ... okay on input line 9. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <12> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 26. + +Underfull \hbox (badness 10000) in paragraph at lines 51--52 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 53--59 + + [] + +[1 + +] +Underfull \hbox (badness 10000) in paragraph at lines 60--61 + + [] + +LaTeX Font Info: Try loading font information for OMS+cmtt on input line 64. + +LaTeX Font Info: No file OMScmtt.fd. on input line 64. + +LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined +(Font) using `OMS/cmsy/m/n' instead +(Font) for symbol `textbraceleft' on input line 64. + + +Underfull \hbox (badness 10000) in paragraph at lines 62--72 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 77--81 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 82--85 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 86--89 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 90--94 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 95--98 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 99--104 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 105--108 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 109--113 + + [] + +[2] +Underfull \hbox (badness 10000) in paragraph at lines 114--128 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 129--133 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 134--138 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 139--145 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 146--151 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 152--162 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 163--168 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 169--173 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 174--178 + + [] + +[3] +Underfull \hbox (badness 10000) in paragraph at lines 179--183 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 184--188 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 189--193 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 194--199 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 200--204 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 205--210 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 211--219 + + [] + +[4] (./DocJavalette.aux) + +LaTeX Font Warning: Some font shapes were not available, defaults substituted. + + ) +Here is how much of TeX's memory you used: + 252 strings out of 94501 + 2714 string characters out of 1176789 + 56348 words of memory out of 1000000 + 3492 multiletter control sequences out of 10000+50000 + 9370 words of font info for 33 fonts, out of 500000 for 2000 + 580 hyphenation exceptions out of 1000 + 21i,9n,19p,381b,185s stack positions out of 1500i,500n,5000p,200000b,5000s + +Output written on DocJavalette.dvi (4 pages, 8352 bytes). diff --git a/DocJavalette.ps b/DocJavalette.ps new file mode 100644 index 0000000..d08b5c8 --- /dev/null +++ b/DocJavalette.ps @@ -0,0 +1,2067 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.95a Copyright 2005 Radical Eye Software +%%Title: DocJavalette.dvi +%%Pages: 4 +%%PageOrder: Ascend +%%BoundingBox: 0 0 595 842 +%%DocumentFonts: CMR17 CMR12 CMR10 CMTI10 CMBX12 CMSY10 CMSL10 CMTT10 +%%+ CMMI10 +%%DocumentPaperSizes: a4 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips DocJavalette.dvi -o DocJavalette.ps +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2011.04.19:1109 +%%BeginProcSet: tex.pro 0 0 +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}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{A A 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/IEn 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 IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/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 A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S +/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy +setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 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 A 1 get A +mul exch 0 get A 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/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 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/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/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 +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.1: CMMI10 1.100 +%%CreationDate: 1996 Jul 23 07:53:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 15 /epsilon1 put +dup 60 /less put +dup 62 /greater put +dup 120 /x put +readonly def +/FontBBox{-32 -250 1048 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 +990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E +6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB +DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 +59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 +D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF +8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 +6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 +1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE +03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 +95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 +74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 +3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 +47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 +AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 +42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 +40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 +B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 +9560176671A33FC55340CD04C2DE46FD812FC2711A85F39CC27C9356D9B94484 +F4DD09C2306A64DF9B1F15CD359927567E58F06A57B7CA0B3CCB3A4447F431A3 +29C3B79D8CE702D8D8B1E49D8B502021CBDE13253EB066C3021294F19EEC5A8A +C6280628E069D9C605D472CBBB6B6C84745DDDDB875B10CA7D1DC633818BFD55 +6ACEF83DDBC493FC3269C142777A4305D9619731F7A35DF7B2EC7253CF47CA94 +5C26C11BC1BB05F75428548308015DD8F7EF30201EA9771220CE3CA9C10061CF +DAEF337865E4AAA1901938B55DC80BE672BCB862A1573B3E289B9E857B08C656 +05D073B0D3A9BE3FBFB836F4D8E1FD9E5EDF3321B15EB3EE3AD76279AD7E5DC3 +A70BFF0DB0FF3BC7C6206933A01FF7266D9717D42E978840DEFC005F64753624 +8BC9EF741E96DA08D450E3016119546CC540CDC7E8CBB8E44BDD6B5C9C6570EF +CA1FF3CD16DE9DF7FD80077962E9C0A7D73C8E64E11E7E4CA3D17C34F29608F5 +B75546D203ABB42D460FD9F6E03034B2A5D0E55637612776B52F974BFF49BAC9 +50CCCDF3058C1585E2FFCA4E27EF9EFD663005AB08152B63B73BC2F749E75756 +C6A9C4FB6D3E7D830B235715B7963D7D636F60A45076FB5875074B198C842AD1 +8711AF657982ECE8DF082DD15D9C257667955868C36946C1C4E6B2B51E7FFE12 +FAE8A884992C309538C0CFF46C14532CAB5A0DEF8F9C462AFCB2F8169236BC36 +C4FD2A0AA248C51CB9475A233CCF83C91C2F8268F1409ABF3A86525EDB656DF0 +94D0E29F855FD164FCF18E59E980F7967E7983B703D10831BCA8572796922EB6 +1B50EA39181F49E3533D4AE74E0E2C57820C23B7B7BB892E4D7FF1B683F1434C +0A2BDB687BDF2D895D9F3CA1129355E32F6BD885940478A650CE4BAF9CC62667 +D8874D8952BB9BA21ED2E41235D95509A09C844E1259025AF3C53CF74895974E +7E39F53618C710110C13D450D650D094C5DF6441DBC0BE7814DCBF72AC1D1EEE +F5C2525733815ECFF2E2164D75967D3A04530B4332C697BC5BD925657EA7034A +89800857C32512C60C86C7BD5463C1DD143D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTT10 +%!PS-AdobeFont-1.1: CMTT10 1.00B +%%CreationDate: 1992 Apr 26 10:42:42 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /CMTT10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 37 /percent put +dup 38 /ampersand put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 44 /comma put +dup 47 /slash put +dup 59 /semicolon put +dup 92 /backslash put +dup 97 /a put +dup 98 /b put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 110 /n put +dup 111 /o put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +readonly def +/FontBBox{-4 -235 731 800}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 +38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF +D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 +EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 +A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 +F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 +4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA +6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E +A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B +E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F +1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 +452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF +8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 +5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA +DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 +BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 +741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 +E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 +E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 +D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE +C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DC +FF798F2ABFC4F3539392985C4CB324B0007229586D1E0321559F67C057FD7902 +194490A4C133DA790FF3BF23A13C2B1B69EEB75950F9106F2BA1E3CA65C90FF5 +931DADF03DA48AFB8561FC2E710087251BFC42B80B297A3DB0DA138A7622A931 +DA293B0C740987ACE9F2A8EC2DB98F85783C01623FD3612C7E4A84FD93446770 +C3DD7431F955A5F3734F6931BD790F0A45B8D17CB74BDAA4BFF6DAB5380CBF61 +72F37CB67A909E2842E0AC5D9D07D01A4BABBDE2AC70FE5753460D7E1A708B7D +0EFB2B5FF55F9E4571C466AF1F91E545585845B09D855C3A01F713C1BF081EB2 +7E2A0E598708737D475BEDAF60BC100FD0A0628C6001A203348CF6A3AFEE6DEA +A2EB57E35599FAD0B8A52BE1B081FC4B5664114E7A71906DB43D150337D2F47A +6AE31CB21F0A689336D70C3119180B78C2066FED4D6719AC8D52F7CA1D32A22C +09EE6ED97334091442AE7417DF9AA9D14397AC32017884DF605AEB4271A8D232 +06617653EF1066578DBC01294709653F77EA622BCD4D19839334B2425736AA29 +1CFE694FA12EAA14F25DFD9925604E5B30C8EB8F4A04DEF3A43B137D875DBDD1 +5F05B2612654089FB0876EB67AF788FDFF37ACDEA67110CE092C31968B963BA2 +03D323057B3EAA23081670127085D745EAF4A52419DEFC59E595F5973AA1543F +24A008F388A239D55F0B521B7EA7D5A39787EED0C73F2E66357E103D36D963DA +AA5339BD24E9D4657DE64E8EF4CB6CA788EB5539C901B0396F46EA09BA1C1859 +64E756683FE2CD5FEDE68A73DA2412F1D78103258ECE2E18AC24D4178D209BC1 +39C7B4AECF379125EDF7B7AB388AF123CEE7F06744A2D3B40DF9EBCB26E1CBC2 +E264626AAE1C596C6A07E580024A80190F53E2C94C91A317E3F41308E6BED5DA +E3C007B5DE689D8856E7B83085EFBD29DC8E75DD226926619882E5BE36F7E01B +E2D8A47F8A396C254A09FF0295271C31B607FD9464980B842B69FC014A2B1911 +8FE2563054B5D3D327D0492E90EE5086040B2E32A7B4B68EE185F75070ADF01B +643EB4ECB8173C32125DDDD1F0EEACD779FE6DFDA74CB393AFC449938336BFCE +D707C4A3521626E3EC116F06C44925EC195D43A9B75DC9BF52862E1D401F2BCA +19EF593B59EC55BD66119A0B88EDBC4E1BBDC6CBFBCE178D1D323FF8BA1FBFFF +F234F60A9DFF18AA3A8AD93F5A138E8F074CD92631540E0151D78A609DD4868C +41C29887544014E05D13CA026903A2E9F6CA07DCDB53F04D423B34DA516B73BE +FED82617649D9706CE03C21523C22A119F7A4FCBE65C48866C48A1C90071BFEC +54B5E5ADDA5155E9805BF4270476E6D9CF026D8859B4209B27A9623907074DDB +84DC5FFB1974747BF5CEBA79A364B783307F854EA2CF71EF79732C471D4EEDB1 +9ECE691B83B346635FAEF4B5C3D6956E0F79493863AAD0C7D56875B8516B3D7D +01C98233B5756CF5FCB8EF94198E8BB963AFF05EA9B94795151BF638275CBA7A +3EE3D68DF81488B84D0F756E4ABC8C11335431042127C3A48DA29C692E50265D +BB159366755B6FA626EEA7AA110FF5DDCA758CA3B50F96F5A04FA0DA8285A68B +6881AC4A62E631CE2592CC9088C207048F73C18B5C5DBCE96D675CAE0DFD9F16 +D2574330989FBF05526081B76E131A25F65677AE01CE03556701276B016EF03C +BBF66921A915021284E1C3C262C128689D095E4BFBCBC49F93D14A5C823D85D4 +8648CD99090132FCA4842D555C48E6F8485E59A79D0FCC4E7F8F1B004C9B0B16 +D10C9D5402530AD37E9CA44EB317E0D01D2BD8FE22340A39ACA6D3B569EAAFC7 +419D69546D7234178C95209EFF0C1051238A208A7D9F94BBD240DD35F46E0B1B +738812BA87E9473A040428AC0FFDA37A27672DF68BD488D7C6852C0D0CF4B7B0 +BBEA56FE18A703160B91D6E556990EF88BEC569F7FD3AECAF6BF371E1C7DB210 +3C413FF23225FFC70E80DB507AC87BB85B21CC588048070B9655A9BB8C52EA09 +A809879674E94FB5C0D158314DE7F5CF723474DD53D7B39817A17AEE41D42670 +96F40A8F667117B0E81D6AC3ACDBCB116BEE0D6E008A9524309E9A9E6B777918 +0CBAF06D47D82E755026594BA31CA0610ED17A3B16435F1BA09885D2BDB6D241 +9DB7D852E2022A57DD08701ABE97409093AED3270F9E2DB6E562932232B167DC +745A66EE947C15B009D59B6604E95BDFA295D4270F9CA69067041D75A2C35088 +C164A090042E5E8B31429C4B5E4599119386527844E14EA08DF2D5C8ADF60A06 +2CFD3381561B5D367620A79C8F59FF9AE882697367A420C590CD8D246546BAC7 +2392321E12D40F462ECA2F5D6E77702C990AD2C2235A987CC04711F1211B61AB +6D791951D4A15351EDAD82380B514BA6905601A13B5EEB2C9C5349809D93B48E +211298A8DAD318A85921997DBBC8DF48ED37691665EE55ABC8B09B4B01A8B3C6 +70901E5ADB8E4B41F1516D403AD1154898E729502D34B5ACD799B909F15477A1 +915556F9239E180C3DE62E018CC4C1CA9384E766AADDC90F013A8A650D9F504C +55527BE6AE842D66795C1C9FB44EAC3AC2A88F8AFE8D81D8D44CF0E613FB3005 +885BD15AE91BC06C73AD49BC7433248F4816458A483F679A7AC49EFB19BEFC69 +3BE9DFD6715EC63FD24165D96A6CAA38DE8FB84A50B17D22FEC305803BDC310A +797988887872D3962237155E3CBD97EEF0F9F89BEA97DE7ACBF608998AF3C349 +B805D1EBDEE2D6D6BB660513AA7F5E82867F95C5F9BBE2FFA0DD362C3A895DCA +D56C93F78985D0B08C03D4221D8A956C03FC122EE2E741F860AD937013D7D6ED +4005CDF5B607D639DFE8C306A07F4B5E9678F01E5F311EB19DC5ED6415CBDBE5 +5969D8CA35791C46737F9E7C672584F438CE00F33E0BF9A2650D3A124D6D02D9 +6AE4529C2887FE9BFA94F2E67D07588954563DCD20A3430D8B02204E3A84A497 +33987864C23231028569627E498F7E536EE4AC37897D0C8D3296DBBE17C83E93 +5FA47AB5FDDE6BF3499F351F1AA31EBE7658D6E3D61665E0AEA282B3C667AED9 +C44125F8E5A6A31885AF783D191A856DB89F3BF9AFFF1DD879787D85003F55E0 +6739036B6F9E00BC55D0306D3ED87F5762C2303B563689405829F8D3E3D7FEEB +C37DAE6DDAEF1D15287566FE4A1D26F6454149E2D29B59B36D146BF7310E5F06 +122D87EF80482E6CEE1532B8E2A0F8A344C280BB589BD8612677C2E8E675B450 +FB1BDCC242E8AB3A6D3C54E7DED1CEC708D115F748D9DA30EEDB9692E8B5F624 +1ACD181FA1EA7A440A5395C27E117F1B507C108FB3EC1EC98F34FCB7F88EB5EB +AB5F463C582D12BC967BE2ADA2F6B44B2EC3F4E883A11D87507D2D8CC9B2CFC0 +0BCC712EA2817B3B5B5390649C4C1A77D767E9B84ABC974BD61AECF35F1DE0E6 +E03E12AA6B216261F6AAB4041121400D456E4F9CA5CB0F25A5BCDB21D5FD296B +CB939F930B075355CBCA45EB1864D4CD83BA8829024BBFC258A865BD1C73C8E7 +5AF9D7CE61329CB21E7CAF3A458D700FA48437989528E177119D61A9D03A070F +B078585A2B19CDEABF8BAC338099909DE9F37B5523F4B6586FE0D61F15262AE2 +B16189B1EFE42082EBEB1F4A88D53BAF5628550D58387A91E925E611FC1DE1AC +13F9AD7858052000706ACCC0B5FB56ABAB595E50B07B2BC4E103ABD2B83AE8AF +A1611219F29AA02EAC3F6C2676703D0569A856EE619D83F6063904E946BB51AA +7519AA55170CFCA8A29DA4FF92135DBB66D05DF5108E9F73D36088C7DC22B1C7 +26611C734E562952B9E0EF6358A8EB350382922FC32F20D37A24E194BABA694F +6D2D20DBE4D956F7D20C2363181A26CC6E53C8D58F086A2F253497101102E343 +8FFA8AF25DE3730712F8E212403C56AC2F8F7ED72AEB19FCFEC0F250E5CAF550 +873A44F52F010DB1640C429406B1EA62122FB18C67F88C7C41207BF838CE952B +2616A5E423D97924C4E42FAFB22CC1C0778BEF78E113BC61E05281D0EEBFF1B5 +134CD4873411AC9DA8C244773EF518293A1B066A19C578A23AC8CCCA32EC1DE1 +F13893C9C4A44757C340A7E010583BC20D2108F0F46FE3DE745AA7A0384FCEB8 +2351968700D0E586BD4A456C36ADAA6A62C73249C91CD871E7A79131C6EF31F1 +79B1F68A27261051C5F9651E07869AF3EC8B6FC3B67CE12D60FF7899EFDCD5E9 +5567337E1736BE06FC42FA82045EFA7DDA1414C74CEBA65558A3B6AC933FBB7E +F84A3E7F2A905AECAC5D3882297FF4BE0841E7E1066025B92134062D5D2B3E6D +D4EFDBEEB41D37BE67A8145991F3BB92BDD977564F3668BF1B4D5967FBD167C8 +59952F16F26F48672AE145A3BA5417C0303E1301DD2658FFEC9F2F29B5DF55A4 +2E3796A9ADEBFDE141B26D0B5315D8250397FBE5D293903B042897A5F4CC1C8E +59348BF5D948C540CB282326AF97B616F0A03CAD643ADF400A51001CE587AADE +DED79EF0CCCD920ABE00CB328FB119D14D7271D4023747EB011DA15D32E8B6F1 +14B7AAF9BD1D9543828B8567AAC243E94811CF9B1FB4356FAE252606DD60EC7C +741B6DBBCF6DD18D757F281D007F71F6DC06BF878AF028DDE9B30C8C4317BFBA +72D8C95B91CCFFB0A6C0DF90FCAB9738AC6F628DE893D7F2F21F2C2A0A8A3AF0 +A13B0C2262511B884C4CC4CC86C72DCBCAEF8997CE44C4ECAD1A24EFB96A6825 +2D56C8726F67021316F2F6B2007BC22519B2424D5A632FE8F334C65570ABF985 +6392E038684BA24393BDE6F81E7325B1A17D54C495F5F2F137A7BA5878188237 +A35285ADACE49BE62D7335CB14E2256A7F9C66EA820DAC94FEDC7206AB2C7678 +8C12D386CB74084CC03B1F6E5EFD0C7B0AE1C4AFFF0FC7EE75460016955BA001 +790029A5732C908181A1973ADF7507AF6DAB6F5661E1015E627CB2FEF1E55625 +1BEF868EB9EB6113294D14B1A8C98A3CF3C5A73D15BB29746D18CD25432E650C +FC2F589A7B734043D6447CB90CF4E8DC36EE0DF8A53AACD2EED9FA742E83D162 +80C2ADCE247BB2AE9130FD80A2E4F73E623FA14F07C73E0F2A4C70A224C1E507 +00FA3BFDB28C085525AF22E9F77DE284D019041A0A591D779B88BD3948F568AF +57DC1483EB0B9A612A1EA5F9FF333CEA3E76C7D6A26A16062FF6D9EED2487070 +8A5EAD791DD3C79DE9A20BF338F089D21EEF2165C33CF15BBF8CA14813633713 +E4C2F73E525B09AB76F03C252F1AA995941E53C6A34494C39ED7063FCE4DD1C1 +2809E9E705EA063A0B5FC594BB5B6FDB201670EBF39B18FC3F4ABC31298B836C +10FF99A8805E15617EF566DCFA45959D233DC284A1892E3CAA4B90F6ED4DC49B +CB4E1B3A35DF3EF2D8A239172EAA288C66D58692373FBCFE4DF17906815D7C2B +1687AAF8F136D93A2745C11FD14107E601DC2A2CAA82C0780768973D9DD53303 +BF03795C70E246B7292E5BDA8EB4C54F1B489E9D3ABAAE3421B3A1848A0C5855 +5909AA98EE9DCCF467DEB69894203769BA34CAE70886339A7E1260ED54142B6D +E2C6DE5615496369EF0B8BC772F8229EACE6AAD643D1CDFF1672ACD46383C603 +820E7C26C989CD5019A276DF6B8156944F517EB54676D9A6D4BD612067A5BABB +2E5439C1A5CEA27412CEE2D0453D520A7437363CB7B79A54F4F4D4447A8FF55D +A653121456BE162DFABC78935FBED26A8F2F628890910DCC7E83E1404805086F +6A67F7BFF1B67D25F823D3D1BD0832FC48E493A8CC54E83B3B3B9EFDF7239472 +794049B3CFBE90891463364DAF41ADF9492C9C7C7184506F67862227E0A4EB02 +928FBCA400934875E736C57FFE7E060DCAD782A9FC0E8927F6F77C1E13B6DF9D +D7E1006F65E2E9B45562CE7BB65BCEA62361D16788C20E4CE13BBE5C99A4ABE3 +264DF918ECE88E125A3EFE4E4D65A5684BC6A26FDD6FE79646FA154F48C15345 +C74B15EF11AE0D348A9A519EC172132E278EDB808B30BD786CCD55B72148FA41 +5D37AAED8E8839FF52A7431AD07EC5F070A192615C27386488106D66BC1BEE0B +4D3665CAD8D96770F05E53207D53BC6DAADF552074EE3805BD6CC83ABA1B2030 +4671DA54CA3E0F7CC525E1A17E5FE1A6FCBEB4E002C74DAA8CF7C0358942CADB +8E2346E04295523753FFF7D0D584CDD85274C6A3D8BBA1801BF21AFAE8F9E3E6 +0B4972657A70FF45FA07EC7B76B4BBA5F76324899C9DAAD57307DFAA6A9C7C95 +0922494BB09DBCC688F805D421AC775FCF5F723B8BE1B3D81A374016CD9D47F4 +67DA170C74C9E6F046B47E320B634DEEE9AD8AB0A199B673A64A427FE03D3845 +6586EF16F152C5AD885F1C2096F33B11F5B90B5A7FDF714E0727352DA3C85031 +1CECAA87D763AF82153D489F4E12F6A37F24F4BD34EDD035A5D1A660A945B76C +74B81A03F4F19D7E19FA91408A93E200ADCC999AE8804E211345FFB362B8A53D +8E174E3A6D9CBB51ED2E9B08B61029429B6BAA92E985D42F5C9C0DBE9DD7A2CF +0D9DF52786ECAA30F3612ED6D38368AD76A3021E88D2CACBA1C42F07214B3705 +F9C1910AFC668EAE9369E10C004A0E25185E7D7B13D6E86A0280330138B9FD1F +283E2DD2F0B9D348005459CD9B955A5324088AC59D17037DA9F5E754BAB5228E +52144C489DF3DCE539A29C825C2390E65ECAB9502D40C7E9869C6F6A6B13C23E +D52DE912D74763FC7912E0CD86F41A057CB0BB8F8188B66451DF0CB817E81920 +5F1C60BFC47287BF5681DFA8BD4670145D461151048EDA8153CC06A20B0820ED +A151C43EC7FD38DD38D4FDB20AD936D4057E3576C41213C4FEE650E2C046E3A3 +7590C769CEE47621ACBA65E411BD6DC71C9031C76C30C37C92030C482AA31AF5 +ECA5D5ACE3D3BD4B786E028809702691707A1F5692E4E27EC1B98B8A5105B445 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSL10 +%!PS-AdobeFont-1.1: CMSL10 1.0 +%%CreationDate: 1991 Aug 20 16:40:20 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSL10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch false def +end readonly def +/FontName /CMSL10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 65 /A put +dup 66 /B put +dup 68 /D put +dup 69 /E put +dup 73 /I put +dup 76 /L put +dup 77 /M put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-62 -250 1123 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9429B9D40924DC059325D9D4CC0344F3F997A99E6CC0676735EBCD685AAC9142 +08DAFEC78BB41AFC2F1C219910BDF41D6279284EF600B69776CA15BC8A34347C +30783C52AFA60FBE3E353E2AE354CF87B558776A22C776C7A0B5AB5CE1F941EF +C2D9CAC37294BF407A671F10E4743BF842143F4F7DFEE643BA3BBD8BB9E3F24A +BCCF7F0ADF8BA500620C81033EAE8C4EF2C1DEF13AC575F1B3BBB66F093D3B78 +5412B82B67FFA087AF57182B2230F9F2137180CA58A7D9B2C822FF04BE6CD01D +43B2CA7058C7B953F6D9B5D6E91ECBAA5CDE1159B0E59C83DBAD96D6C8C8BAB1 +374EF652D10C0F3EE7104472C98DD3572AAF2D45A70BF7061447E21EE3C3BF23 +DF39C2D1B35B42CD5297BEBE6BC94F7C9DC6E61EC67E4F677256FED9064BD3E4 +B51A71B1D27CA4E5AA9E1D8080E6DAB5310711EEF87C40859FA935B19524AE83 +63B163FA8397BDFF443227FEDF7DB27DC35D89FB1C5E435DA0619A5C88AFC73B +89A2DF5E767C5B536BC7167A840A0C32BD57A14DE69A7D0D819AC36FF32F908A +5070F32983BB007437E3500799DF5E0AD3710A4C0000F0098D5BE99F2EB9C1C2 +C444FD9552D0DCA098A94B3BF176F511CEE13DB7EFFAED7C47B5ADCF8D4700F5 +7A5FD1B49560969BF5C44F3749370663A04776F749DDD7B50674D93254426C4B +EFE264BEE7810EC93784B7C01A7F29EFD92547E13A2C7851A2E709FBD5B87850 +4A44F08F56A542DBE072D2FBC58D9E6468E1AB858DC35240E30D31C7AC13D6C5 +7D2BB634BEE96FA0E10F842B11A789F72A333DD6DDCB1BC23227EBC406E50B40 +30AF0C48E6359AB0C46898CDAF1118E46BFF8B00F54EACBC2AC262AB898C42B9 +2E080C10DE923C1F7BD11CA700DA95F7E94C4C77EB24EFB7D5DD3ED0602D3D65 +14BC25BAA1CED09CAFC735E4C0FA85C8CF554EB15D588234F82643141E259C7A +EA84EF6B3D2E9D383A26147FB26BC8F89FA85A7B1AC827872D13D91B04138D68 +4DAC1154B4B86132CBB0DF09821892318A3908DD663B1B1F2B81AD55EBB25018 +C5C9B8BA52022C403798792B16B0FF5F1DCF6532AAA161A8C48F2432F559AE3C +185C589DCC920A2D93175124CD798F376594C2E9A23958DA73436805F2F7BDD9 +C8EE927FA2BDC0206EE968A05798DC4363E1730870E8527B3A54348B943FFA66 +5AF717106A48253BF23C425CF7EA1A7C2CF70CC32515D7087C76507060235ACF +ADE77A0AF3AAB23B78B71D4AC37C9ABBB5B4A788793C16AD03A683566912DCAA +DFFA9D5AF206BD07A48D506A9F896684524BACAB2BDE3443C738C72F25391A91 +8750D4933C2937FCB2407AD1EE6E5D008AF7ADDE86B3EB663D02F415DB11EB3B +949D2397E2B41D64B0D990D5EAD631C3FAC1FE3287BBB90E4C4CF7CF602FD7BD +8F3F787968F7675C941F95938CA2E09433966D335FD2CE9D32EB6B4D1E18F353 +7DAB8055C9713EC69D16C20709356A7028F14BA584777113EBE50B4A7D0295D4 +0CE05CBE3B17274FB95791DB5A1EF1D04A81DD761FD044578D9AA77FAF70D5DD +364DB768295641D49A3F4F8ACA7F09B80C353E186B81256AA7E2DDC94EA4787E +7FD154DD0D3D749B6D96A9344B697E9E0DDDD98534F58E50A85D566CE80A375A +1C036324819433F19450D3120B0F46150212465B6066BC1FABEF5F8652B3E683 +34E9ED29D042B0D0DEBD52F84C9E77084E2AC27503DE0AB421573C51F58ED884 +4E1B22E1D79659BCD04376A9E8D36B04A4254C57169F7C1F6EF8F76BABA5E1B0 +5E503AFACB16C99D06DEAF6138B04E70E59B3A675A63477E94239D48FD3A8EB1 +5E5E16735601B09F0C4D1A82FEE250303F21D899F2D371D609B040B65C2A4B49 +216B6E25A576B3EB600A2CB6499D3AC981544114849F34A4B01EEB4BF5229C38 +AFE55309ECE6E6D5440CA9AEB984138F87BD4972BEE85077AAE4DEF05537F952 +656CD64AB0EE1A00012ED859838AD75DE90D99C573E1B26D975D27FE836F5D7C +7B49129A03C6D3A8374013863604712CAA032074DE18AA98007C43BD89A9F462 +C66B7549E9D184ECEAB2B5477D65191FDFE600715AEDF0C7766B907D49A77FC6 +BD47618E6FA0DFB15B26F9D22D145D719B4F5C27503FD314C44E8A9AE7D7ECAC +BA4141F92DD694B14FB5DAF6CC5996F23D0ABB88294A1865B8CDD55E8F52BC64 +C6871FBAF53E3650285095D61DCEB116E75ED2F92692988E93DA5549FB940EA7 +DFB27C6EC7869D1D7DC53D1E2EC0D6BC4309ADE335D9A3257EBD1706960BFACE +C713CC8B92C853CBDB0AFF0DE02658FDE0D8454ECD6369F87D7071938F7123AC +B02DA1A015BA1359330D435EFF45102920C8E056EC78449D77F64566D3432B59 +355671FF37478CF6BA69B5E31A6B6C36D2DB1B397412DBB014DCED07778D81F5 +887DB5CCD8395C1459FE900F3EA80DC74A381B719B8B46BCC82014DAC1020A7E +4E5F9E0062053FF071DBCEC77C592E314CC82380B689B6143AD5B3F9D4AE6845 +14EBE919B10927659ECB46962305A601D3CDA7FBFB7653BADA268A7A9CED596A +6D3FB8F18D2E76D4CAC10EE29F04035D5EDDAB08B9DF17D44881A019951A145C +84D930A1B97704B3FA6D62C0DF84FED4D47497D92E73BD0D9728AAB4C99ADD5C +111647ABF1F7E01FEA488665487F5A3EFCC33D67C2B672E6E8E49F35A1753594 +40A69F396460D7A85E7669963B77461F8F6C8F6BE9EEFDA1C1D108083C8C72BD +4795234074329495499453AD1152868C3F1441809196A23A462F9B883E8CC855 +7A3389E6755CCB9BFE8EE9D69FC55EF852A9E0838E642F129A2C2FE9247E1F56 +7674C1659D3E2A03F59F008E45E7A48FEE18A3ECC3D265A236774F982070F5A1 +BFB8444E8BAE77AD6682DC89D2C2A96840FA672B05F9A804632F7925D2FCD830 +89E0CDC565F0094771AC161D613CD5DEA01ADFE784F8C527394C2C2543F26AF7 +7B18BF1B9C8C3522506A0F69E06A88D7DA7BC8F36709D52C1AFB00A88FDC3E6D +03479B860914994EE0E436C9A6B124F2BA74842EBD2BA8C39861FEC01D337662 +7A88CC2E6AC125DFE7A670DA13ED8D4774A4F9A906E5D3B6660D248D7C08035E +454366E370798D6483F1AEFBECCD320FCC4C46902BD3D64D4A3883987930FAB0 +81D4F7F285D717C00849DF311B0876CD63733222DA646F5FF087A18AD4F42BDA +69BE3F5055D9E40AEE4029698E9F5373DF9284A88E40FEE59DA3E75E743CBA49 +CE82376003390E926D307D52B79D1B0644FFBA9CCACEAAFDD14EAF62A7801E9F +8D666C5FD235E40A0B9D8CE641C28F954A11AD65C96B4693D05DEA075A038E06 +AED19E664A144E1DE00EFD994237ADFA4F28D883684A3EE3036216DDB4026A04 +A36A540D7A45600394E538D22FEAFC1B45F476B17A99F001D66E5AC00A7C4E83 +C95E6CC857277A169E6F368F3F98100A48E3134F244346018B7DD01DA0A39A14 +575765C9990939AC46D9E827B1A38FF275A83271B42F07F13EF869F52CAD4A6C +861874F431CDDFB64007D078BFA0B9BD6C2203194299405C46EA941E9480C9D2 +3F18C3654086A2AECC3466647B88C79BF8A1307517C3BFBABF24903B60D47CD8 +A623C81F8B9434537C6725B9231D2EB6983AADEC835E719F974F7E394F0786FA +BD0473FE3EF199B4F83BE26F7CF76A0D641B3E4DB86349B57F3A252AAF20B3B0 +A7B822BE26E126E62459FFF84AA79EC7A69A8B09F501AA51468F1D0A8A2EC28B +6B8A465EAB3A7AC2C27B10D87513679B06409C1FA6C552672BFB24DE23B0058C +FB5C51A9465AAAAF205FE26E853103C40004B16B3FE0721CD2FE27BCF12D14B0 +429D7B2F3D136E45D6303E7111231B8185112142F75D626B3BBACF5FF166F016 +D31D7F177EEDC5546CF8AC5F9A6B7A14BCF4781646043B4F47AB0812697A5CEE +9D8EE51797A5707C18F5119B2EFCE640ECF1A0B8A41C0F9B23395BCF15156E0B +43E6BB9D596EFF20147428A6F56104238A1FF4BB4AF5C461F7436BCF20B5B614 +6DC12B326B4F34A481DDA4FCFE050465B61651F7538833CD62EA782BF24F4078 +5E47ADCED28139ADA923BDA48F1D2A59A9C5F3D033E641CE720A0FC64382C7D6 +B9B8C8FBCBCF0D033113AA287A5227DE17AA9475001CE00E3AE898CC5BF123CF +639305A6F39D71C71700F70ED14017E6DDB4CC09CBC9CF8852F2429191FA2A7C +33910BC91E5D39D83F5979803781A60F26CC2737FAAC5D25E391852BC8DFD188 +EA300D54E5778F47307A656AB2E6D2BBF677B0367C416FAA8C364106FFC1F928 +10D6BE88C972EF9E131231B783A23B8C84D1FA9AA71AB4E5A7A616DD6566D79F +A3D31EAA0FA80046BB5E95E8475656BC99D0848243A84476350BA202D75CD251 +569793B54DAEC7DED03AE3A9CA120A2C8929FE734950996C7E9566329BD6FF9C +A7E29DC2832CAFE88E7CEAB5022EEFE94802203FF7C879A742930C68754FB8D4 +F6A213BF5304A45C67725F60A8D519E1401A14ACD6B3249FCA6A46A033ED4DF2 +7A46B406886CE6E868A2433248B32DCAD6F472859E7D0271DD7E7F0F55CD55FD +BEF1505A86477A66D04866C73AB4CA9855F5624E407CB343427AE58711D1753A +AB25DA5DB1663FF6D7CF45E95706BE5A2C96E13C848D8F57D8B4C58BFA1266E4 +3B20F4C42BD8A89A156E335656E2B253ACA9A6CC7FB026E0D32A8077B1B36396 +FABDD1DC8B5A0692A5440567DC5D1E6BF68B9235F4A33F087266CF12E2395F18 +6DFF023ECA68A8811C3A8C19176190872DFFCB24642B13DE65581E1EDE92C741 +0B744ACD5124139D4C4ADEF9D017413ACB83C34B92A888EFCDA760AFFFD8DF2C +094A735C32FED79A83345DE9ACF772140E0569D64CE3C495D559A0A325CF53BC +9FC55E224F8861CE74C0FFE4C64A7F88C772D80DE8BD006022713BE5D56D014B +CD18EED0DD49B111DBCB05BE53919EC840A0786659C83CE5A1BBF60F5FB09CAD +33C23058EF69E650A42CCA14B7360269FD20D74401E2BF3788FFEBF5AD13A7F2 +E109D995D8B71642A6FF6EB8BAE3433E55473B39C07C0580D203D93DC3A9FC3D +A4D145DA6AF463FB12EC03BBA33963BB7C851540680914A43A4B68F2798759F6 +E99AC01215760D4459ADDA69ED2E9F313D2959F04A0B40BA1905ECF68E6F86D4 +B89FB440B45B90685D80B8012C31FE34675F947BB16E19FAB4CD6EDE10D23C77 +94CEDC9A10D03103512EE6E099DAF1E348FA939CF59D7091F0E1DAA611FAA7BF +86241A93BE5FE110EE81E0C4C6B23EB6608EBF6AAB7A93DCE6E57EA9AFEF22ED +CEFBE18BCCCF2946EF53032BA5685E4926968B863371D782461786DB4AB30DA9 +FBD98AED89F2A15DC275ED1BC1902AA4D43C920D3A38EED58899E99282E847FE +8A08171ECB45C8F58560AD0AEE9DE4A65282DC322B5CDE434C5F36713D9179FF +153608653E8F384218B9AB9B0B29D870E0E41EE65F70CD17A21DB41C16B8B4A3 +E9CEC7A59DE5BCB05A14BE0E0722601CBC51F6AC25B561B3EE18A602768F601B +45551EE4901915253479A0FAECA90DD7EA6A378B8646F94C5AB307ABE239649D +B05E00E48B967221F94F5A6D8BEC49108E503E2CFC6745FCF3776FBE7F22806F +EC8DF010CD77C9B71E6EF9E36262960937C2EDF9539618C21E11CB149DBDF912 +00251F1039D1FFE0D20B0D328F7454537A68F5B34BF8362235BBCF1B1A0C2F72 +E7F512E78A6DEF858B317F17726A3A68959C1F22D814FA6DDB123C108C1027FF +E5A843F32BF3B5E4BEFBE6BA09B18122574487DEBB3CE20648612FAD05F2E6F2 +D0BAA481067B9451F7802F6A6593B47BB02446D6501500B9A9218D83B5333520 +24A7D970A01D3B6BEFE24A4DDEC1F64DFA5480E1D34635901E454480B875D2D7 +7C455FE639D60D767679A6E58A51BF30CF843D3DB04165600A1349AC8BAA77E1 +CB7F10EBF5E053B67236935BC55992D574727E1D41A2097E76AF553C9F380DFD +92B684982B85AE7DA45769BC09A1AEB83BC6B8755DDD8C6DD74710FD7A735941 +2C7614CC38C0E134859321B3F00CD6B8773579A553C06638154D09A471EDFDFF +33C33578A2AA2410F5FC016B1C509C8141E769F039F1EDED33C7FFC9D0C0448D +434E5B072911ECEF9D5338DF5F8468BC86CAAC0A7CA99FA953F9F4DDB14C101E +C5A9DE7698E8DF237A5D03D6BFF32B9C47CAFB7426C9176619429776BC219A62 +183ED559F1D2CA027AE10753B587F2D6CB5E6E0CF154537163971141972856FF +EF298EEE3553341F553B65DE40D799B507165B973F3E0D4B7DEC8A8022F9A476 +2564B002199B43F7EE8F0407EE8A99DA97C613F9689FD2044D3E37F95BC7C0B0 +231616BD87538BA29840BE633255FD87C7E148316F9014B3691BE92A46BEB4E5 +41112F982A8ADEAC45427D58AD58E25CF8FFF158B263D23F0A22963019394AFD +4E0703C8C4BE1FC568C899821CBE4B08E791B0C4AEF4A9BBA82663E809C30FB9 +7CFE00D79BBA1BF86CCB82ABF02F80C7E8799723A7B3C75FE3A1F3DE049DB389 +89FD8AED3CD9A23EB5F3E18D3307444556A5160586AA27D875FE6F7E3846180B +9066FF81C85B663CDEF3748CD1D0BB1D80CECD2052F4D9DA90D4D72F9C109A30 +55BC2E68C1795550790008EAD17EDD9F8E3A0320AD51720FFB3368CC1CC56EC0 +74B20B27EFA94B09D8213129A206A29E189310780A1F12031BA158F7768D8779 +A7A8BF7613A4A47E60B17EE68531BFF85B8072B348E12B082AEB1FBC345E8BA7 +4E668691530FF39BED83A631A4C66AD291D5A618B7012284E602780FFBE8D45A +EADDF549596827AAC1F4752AFDC844D67A97EEB903397A1911866CFC78AD8F8B +36D248CE657B96B44B2548C29B57D7694D5D0A677B4998B106AE1738C77A2D28 +1B4EF7EFD4B732827738560937FCA08B013F2CED6C9C6B364E25BE8B81667704 +DF76541D950AFBC862B06445589E1E4C91A048C993E429CF083AD855287B3576 +EB1B58700AEC170D1FFA31850C6EB08130F6B009D9527AE7938058D7BE2B42EA +3323DEA2662AB1CF5A9E9BAD30F467459F761F2ADBF08A1F0C4EC937E0A5FDA9 +ED94D2B6DF7434E0DBE43E3F973D15D43FC1F6F2F9A801D00CB9F7D5E7530428 +26AC32DEC7E39F9BDF6B1EBF22125175AAF51DA6B115869DEC1495CADBA20D29 +817291A25832D578CCBF9B8A7CB48BC96063B66358E830C64C7E21F79BB21E4B +FA2B65506053234771F7165D715D9C35B6E7C0517249A650213734A9B247EFBB +A47C20BBC5B43E427DCA3DD15C31B7DD37FA37B9DFBC24ACA0CE7C5CCF98BDFC +D1CCD3931E6E9D54C00655B048430669A54C0F96C7A360420B7484A9038D32AE +A04E08462CAB42657F2F2EB2A1B2B3100FC54278884EA30F50B51BD4442D55F6 +E33E156BAB20BC6709A9523A8A310D77A6638F8186D0F82ED5007F7DAB4597C2 +4641B3096B0D1A8363F60F2E9408340A9E0BF3AF940AA2730347F144F849E7DF +537EE6A6AAF14D1323BD13F3FBA2B256D9339620A3360D2F4781EAD57147361B +5BD9DF23FC647F7861027789C5096E9D5750C93E4D4353524D85947AB4F406F5 +44EB34497DE13013B1D9E59587076FBEF49DC11EE38ED1CC7E7735AF2D5A700D +74FF83F2C961B1B33A9B154F7E9007D3E084C3A027D4F78E9AAE108F342A98E1 +74B755BD40914CE985871F61C41C54A4FD1F23979ED02C3DF8956C05FEBC1CEF +EA75FC3C7D49C28EF751C8E9EAA916FBEB352C97CCFEFB542D5EEADACC9E9343 +E50D374D80EB7C838CCD935AA6CCC8FC135FBAD5BD95DEEF0DF97DE68AFFCBD6 +827FCDF3D3FBDF202B24A959CC0A6646330066B2EA98D03EE38DA092B8DE6034 +8FD673A7F4F32F65E450634F35781748DBCAC3849535C79F95CC57CC1895C146 +946D28A22AB7C30BF0BC48268AC1A55F1DE9B2E27CC941A2F3720D7533476593 +1DD612E1B9F4A763275E575B58AEBBE184A283368CA5C6E3A90ED77C1DFD836A +841174D815F781E84CE1BFEA8DD2F237455A5486E08B4B6CB481752D79C7549B +8235E112D1A827753AE59046B2A9495C90A4B1416CCCA89E8B8593D5107EFC49 +712D42B2A80BBDA4520A2BAA7A4AC7BE2844CBF26EE3AF6187063A81524912BF +787B9A833F0E1ECEFB3C8EE0C46DFB79EBB06BBF01CC50EE56C17C9FEE28271E +E48FCAC88B5A3FD0B980423BB51DE40D3B2A3E1FE0B3B73D9B182B12F4E9A571 +DD480F249E63470033A7A7CE88484810473E0A7816AFF2ADFA716ECB569DEC39 +655FA05B58ADABC79DC28EBA0F7BCB393D3705809F7F32B57F0079E5DD6D4BD5 +198421EB5011ED244B836B12CA657E4EA8ECEFB681EAC8034A7A7170B647175A +A08F63ECDDEBAB7E6A3111300F5EF6D218E7DD93D42072ED443C7D9C675EFA4A +BC825BF14C940F5CEE6705B1500739FB4646A67D7C94DC08B5E366CAF6EBB528 +1F29CB572A6E372E0C3B337AF7BC37AD6B93D905BFC6841686A12BE2A11D6D4B +A61903141E8651008A65A10AE8F7F7AD34FC787D87EF2BC89A5FA8E3EB037AA0 +F8676F4C81BBE4F599F1846770FD819E51019C0BD1622D836AF585864A25944F +AF0EB699E19F1EF68FECBDC9E315EF155555D867F1E63BD62450C1748B945899 +2258D41E7BBC48695AAF176B7DCEDBCC211AA36C96B90B224926A3DD47FB4902 +6F08C828F06B9340AA0CBB371912E9F70371F62EF14D9C62CBA28C0CE8459E49 +8405957DEE0F88E86FF3F3D0DCEB4AC6A3D33EEA9EDE786B99CC343418CFFF10 +C3935DA25AD65E364A43B58F5C5B7D9FABD170728091A63BF6ADF027632AEB6F +9B6AF7E8DCDE2B072DA5564F91797891D52333E54BC730A4054038A9E9A7B457 +6BACAE6A776CDEA871FD1D7D5AB62778812EC1E7251491DBEB293D36552A543E +CAC713FEA1586F82DA8B9E9B935EF513F8E245CC543BC4C0F1904EC569093F35 +06279DEEB9698B8325669D947BEE78BF3FF30B45A06EA7AA5D603DC05E008497 +85E541D2FD829F18C3F7D9693CEA67DCED23EE9613EE8A11E1D33BD631B9DAEA +A230316A39224E071463D7197819FBD41AB23B550481CAEC03785FC675D706CE +FB0D9EB41C4BA9B8CD5BC6865FE425D87004969A32C4EEFC99187D4E2BB0D140 +B9BCACA0D8CD5B4DEE19077B01C82B6358FC4FC0A842C8E6950FA12054F13FFB +B2F8A1620BA3B21A0214C3305584236512C32C55C89F1C95C27AA50D6C8435AE +9E400598B69251773063BDBD07424CC68D545BEE404F0318CCF9DF2C9B8A564F +9D5F5266BEADDF1C7D10C45F1C6A79A2BBFCEC4C866077FC5061163A760E42FB +766EA6CF2A6357E19FD2F0572A1C2DC0FC02AE5D203925B70C1CB59408587DA7 +A368A05358BBD1EE6D7CB766C9D54248A05EB4D7E148057B173871F3EF342886 +F15577E27DD8FDE6D16955CC1C67EC0FD1A6A9A62D85890BE1221813CFF6BBF3 +46BED8930828C25999809B32FE3A352E6B49F808357D8B525E2B90D9D9EB2C3C +CCA8963DC983961771C8DE1A75BFAA2AEB16383221FE56066C4913B3322AE401 +6864AEDE2683AA3906ACC077F259058C671B734FB8B75DB9BBCF6C18227DFD4D +A8DB3A3CE0AF9382821A7BFC4A0D29AB806C4243C4546A5143AE09DA8E1CC991 +3AD67AFBB15209105BE7157866B4AF12BEBDCAF639CD0FFB501DD5D25235FDF5 +78AC0B5E564A4FFE53E69EFCD658E4A51FAF0E47BDB1A543AF21BC9109B74302 +8D51D7C197A0906E6EC25A40C9B67F12BE690855C6E8782AEF153C9421C0F46C +FE9E7C978196888DBD54E9096769F0EA261688418C80A933F0BC984F196D1247 +28E25AA92D7B33C6ADE645C02BF8061C157FD01AD04EF6F0F0357EFD3DC9941B +CC2CAFC9CF40C04C7141D4EAA00CF9C790742614CFD5A55B35EA7B374F97A34C +58F8E5C8AB3E50350DF9EA171E7A779CAAC5FA591769628B5239351C3C5EF12B +A0A0B5BFA852C0C3DE5960F680EE3DA26A8F21B03BA6F8E3638F9B3037C69E85 +C50509F4348FB8595827B20E4CAB9823C580F83DADCFD3CE073DFE89E682EBA2 +AFA67D6499837388014C68B71A2A5398E999ABCAE218B80B98FF736F803F85BB +FC35A58E847B06E64E8430EBC9124E8AAB98743D6DC95AC473C52650F12C09DF +64C5A1373FDCB881492BE0ABC3EEAE064BA609763F66871E7DDD03693170DD7D +4BB0E03C30F41C2B7AD3E6918C4A0276B691FB176799EB3D77ED02E08600BB22 +EBEC1EC60BA57294D5799311A96EF28841FF1E6E0C64C729089DE6BA2BAD6533 +541E1A334FD5599751109578D1845625436FA4AE2DE4DE91BB9BC65A9237EDB1 +F3E5DC1C3509A82E114AF84A77A246B286F05C7CB5062522A58234C674410050 +8471CC81C67D163F525922A899FCFB74C469BF01138C4CF29CA9090C21B859FA +72BBDCDC49DA515D2DDE96625C54A77CB3127C893D7096A799E3C8AD5FF618E0 +B1C5EFA243EB37E4C45D6B5AC733AB67B374FA99A7FED41C69B7833649DDEEFE +59A90AE5497DA7326BE9A7AEB1998E3A0613EAB68A6D4952926FD5C6541F8D01 +77E903A500BD0B77E25B1D5D5E1662E213F153B9C55F172F3306B08772B31F45 +92B1C35C284BF9E46FF98FBC11915EFDA1B193DD3360872C06EA392E853D8814 +C110A9B9116CAC841953E74FB07ED1C4FC4A1900E73319A89F45B71D808F753B +3C342117054D603057EB27986C35D11C797E21073E4B6BEE54CE160BA2D3C62B +5EE22A2271A91FDF556E2B95CFE5BD36B3A0EAEEDAD787CC28CD8E6986A56562 +1E2371168AD2327669771784CD864D19027A916FB8816635D66D54E7C11C94B1 +5E903919C3F5F1224E2F6ECAF3E1B755DD55BC4F0CB0EF2DB05ECA668017AC57 +FA3755E728DDA126A5EE2416EC70D9FC23F005A75DEB289599463EA7DDF85A6A +B4924BC7EE89A34DEC101B6A76D5D95D2427ABD8850AC682529144FADD2C85D2 +123CC622EC68CFA6C9AC7AA463E5CE1EC5BD30971042D0828C29EDFC444C209D +8AA1906D30AFCF63CD51F6E9C7F72061E0FEF703F11665D909D1F88C72CCC7E7 +AEAD130C668372953FB84932780779776A917818FD71857A9DE5AFE8FBBDA8E7 +C5277E65070ED981E0C73617294BA4DC72237DE5D366B468B52FB1F16A8B2D13 +1BAB4C12EE82A9E6C7DB7DB63F62BC4E4C60FA2105EA7382DE6048F031E8E9EF +4821F687B79DDD02A3CA1AAB01D0CED1DDBF6D2EE582AAF14D9067FFECBB89C7 +8B8DD5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /minus put +dup 102 /braceleft put +dup 103 /braceright put +dup 104 /angbracketleft put +dup 105 /angbracketright put +dup 106 /bar put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A +27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF +5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 +0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 +DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A +71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 +4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C +515DB70A8D4F6146FE068DC1E5DE8BC57032092296D5371C275E56FB4903A60E +73A22818DE22EB78EEE0E69EDE2E31BA367FE9AFFF8C7D74AB1E2400953F643B +7BC604F821A4CCC56FC4E40E0B40B8CB82A045EFB4B9F681EDBD012AC35166EF +62940137319D3082A03402A7DF7445D6DF72A08C50D42FA9522541426CE2EFFA +6B5FAEBFD9303E4C83BC87126457252C8F0FEDA1F4F7B15900778B124787518C +144A2871765EBB27D77495285E7B598849208778032914459C0FDDF918D0571A +5053CA94A1C275C3561BEFFBDE1A783B9CC3A8F96907FD937813C4144B49FACF +401C9FECE2CCB8F5F20F587B6A2B69AB4ACE33E484F79F02A1D157E8B2646AE2 +3B45B8C5678306C54CCBD918EC6A29028B58E22AF7FD5AEE30FBF9BE83D1E978 +F785B2C153CC3BDFA58BE805BDEC19F9939744B5FECF198AD7694D93F87E736D +CA393920209915426BE93C18ADAB32741E1B5DBA8ACF2A20B8D1E969E5864A89 +A09B38CD89FD63A5D8232798FAD5A18756D36289510E7426C9A8FC7EDCA96FEB +F40095A02E09B967A15763B4B19FCCAFF9F2F22D4D173DBCFF0FC94BB52494F2 +15AF39264B66D459FB5FD724659809C363F979002C6E0A16E92BD911E4BB7737 +5008B1ED8BD0DABF276D766707A84B56F4C37AB5B492CD6A9A5E51EEC058A92F +EA89CBF0BD957D37E0EEFC58A768E04DFCBBD2481931441646F45ECB90CAD8F4 +19D78718D20263B775569C4892D4F0E97C5B255D21DD8D4AF3C026E715BA4175 +5B0BA30CDB4B7BECC7A0633D3B04113B2902E40CFF408AECFED3251CF24654DB +1DD8D815413485C2CDEC786402DA1AF6C6928AFA370A4545263131BB9FA6085C +738AEBD097184D1CA4802D8F757EF292A9C899A42A9A40586F86C4642289A8EB +DF2590C4A7536355AE8F6DA0D1FAF0B4D0992C9354B24CA5F34735D6CCA5B0AC +D96D3D3865CFF14CE1B4753A5A03E8227BAE434AC47EAA24CFF0AA397C73806C +6272DD939BF6DA1D114D0B4AF28ACB39EC53A50FC0E8EE359B6660D18844408B +854D8FAC45357366372212DB734BFE90EBD9B38A8377DDEAB6A53F7CD43E2FF1 +5C7B427DB74C2DF808628240C337A1DE51C769D2D7C8DB906F2362B65F0C19F4 +D3A0B3A395EC999123CEF24C6B16E9E6EC76885E6AAF054B8CF869E974D01062 +78624184BEA285F0C3698560557161E77C6A24FB2171DEECEA6140094CBB6D0B +514821A3BCADE3EFF02E399A3362DECE05AAE09B65C0999B9548CDFC0A313272 +F4DF655F39FAE7EE82C5BF72EA9EC85E3A788DC4EB4E6AFF20783FB337B115CB +21AC4EFE148A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX12 +%!PS-AdobeFont-1.1: CMBX12 1.0 +%%CreationDate: 1991 Aug 20 16:34:54 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 67 /C put +dup 73 /I put +dup 74 /J put +dup 76 /L put +dup 82 /R put +dup 84 /T put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-53 -251 1139 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 +B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 +AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 +7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF +20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 +B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D +68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 +D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E +26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D +F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 +77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 +BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E +C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 +30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 +148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C +E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D +E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 +337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 +0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 +472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E +A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 +34C33065640AE2EB6C8AEB2D923557929EA9527421E1721B36B67C16197DCA2E +75177C9FF7B1D83F3264323BD855016DD25AE33ACE9FBBFCA28D9F17A90F9CAF +D2C1F22ECB6685CE21B67A5B564DDEC2194859A5A928D4D909428590175B6934 +2AD4C1BC3B62EDA1F932C5CC3CD5087234C9163A4AC3EC51FD2A85C080A0F5ED +0B6E7959D5A2925D07F7FD1CA216FFCD05752AB60AB363FD5898A2DB23C91656 +A6EE6A516596F644EF38433FF2601A129056790D2FF16C70929D92861F233A94 +37671A110D28DA58C0D3110CD3F0AD7BF27D94832E6DB7D92F330BC669337880 +03A0A649F6CD20095CDB8543E12642C2C46BB0F5F3BA587C57A837AF07C89164 +DB2A16A42D84987086172DEF0ED3A76FB223E36ED772FEFEC435CE91633F7EB5 +662F6950D9E593B5C09AA35E061C5306416AE23C00309E955305CB502B054128 +6D922D3D9A8C0ABC8C6C9456FF0554B461B473C0EDCCF18AA5276447C66BC9B1 +88F02A4952163F43DC8649570C39424F6FB2229F32D02F10647355E49C326B51 +5F2FA1F6B70D9DB8DBBEFDAA8ED95F0C853428C199ECA7C40CC8DE720A24439A +2073018B28B430C861205C07C913B33EE62E86B3D076093479ADF7731A937248 +25DF0B23EAD91752D4403BC64497C44D4985C6DE837EF58266BAEDDCCEFD9AEE +C44C3E80D2030B4846690382A2D9E775D5F50119389DCA5AADF86F2BCB1470CA +6E81C7743FA1F21C03AAE6FD189D7556BF44F29DC7A9363E0C0C87BC555E2472 +7EBE40FD9F446389FFC771F1C164989977702783EBA5CB421ECBA56F2E9102B4 +FD19CEA66B49E4EE5679B8FE0EF1D5F611AA8E02A30C52C13354EC78D0A8D3E6 +940EDB0816A9C7D089661195E38AF4CCD3E18A66E66FDE8C033560B93581019A +2619ABABD92EF3A8A0E20837D7F51878CC8A29200C73F6985445DC557B219637 +4AEC25DC2A7E1DFCC8058D3D0F2EBBEC84AC1519042C222B5A1C446A4C5901D7 +F7D86AE18BC6B5A0BD6E41A3482DD7CA8E4D0ACFC4F24777B81540F66098A695 +E67F4E3F2A5758DF7EDD37D7959A0625D8B3ACE8BA90C5637D2CBBDA8644B7EC +659E0CCD20EA1FF7F16210C0188CB8A561D486C05C1A854FC9C533B5AF1E83B4 +1AC9573D133924C924455A27211DB53898E8A8397A14583AF985EAB432042F73 +E315FDFAB4335DF0DC66770598EE4D9C4AD1E24209B8F7211C0F4907D8FBB163 +7BC494C7B11C5C19E8E74D7D55445E7382821CD616A026079564476BE55B7186 +A5559586352A79821DA6A8A8B49095C8F1EE28767F112F15452D679AF70B3E13 +07BE42B0496D6CBF24DB1BC6FBF26E7AB7EED25D29961CCA2AB415DC2C0459FE +E6B501661120C87413096D85136CEAFEB7020CBDAC187CD38B694BB351D4D792 +9D58B46DE5E41562FEDD312337BE16086AC545B01DE2F5C4ECB05822FC766427 +9CC27F43DA0CA18DF123B1F635932CA8C8DDE505F98051AA8F6EA42F6C9E5ABA +E812D4D6AADC2ADB0278A2FA28BDE6832F758BC71F38DB5B634B2523B7612967 +1C4D2809450FF0A4B7F4CE749EA812EDEC4ABB5799C79F71F2F8ACA1C0A8AE1D +778A7A85054E63C018278FEA847E0E36001FF2AB343751D89DF4307744BE02E9 +53216FBBDFCC682D66F5C5CB7503E44F3BA3B854AF62EF1CBA883C03016E59B6 +C49332BE00199A64772DB85DAE0848D0843F1EF14F99FB230C45BF27E8B02852 +0862FFB47122C815169830843F31477D07575E828A6DAB2DAD8C77849ECBA3C2 +2C4EF6E42C80B96B37D805C666FDB68AB5B9C6F97E7AF516A5A399A99AFA8E62 +66CD652215A813284F04B43206BF41FD1F00E68E04630A82B140BFC3F91522EC +B51784D9D4593257A681CDE6E2C4BA439972D9D6F5AEB9FD9A28E07C9C1E3926 +13C804A66649A4CC29D9637F585E0E3C503A31DCB5BFE2EC908E275B4D0FBFA4 +41957B4E2A14FB4424507D6FB44A7EB0A86EAD94D7C1EC5B77C8B05464463D44 +3D9A2691D8D6A8E0C65F0D6C71D9979E47E5CB6C8B8A1CA74D82568D0E6E5B93 +857054A519D03799C11DFD9E02176589AE0A79A08BFDB403E8C02A450425E1B0 +90C761A1A37E54C3B738FA9AE8E0A7E468C73D978D09ED2A2F9E6C4D578EE6BD +D2D9BF001F5BC1369F0B2D64C2ECA855D5FCFA4E3414D1F3C0A810FDAB94C5E2 +D04F8799C7E95AC53D2D0BB89FCA4F07E7B8664C5DC38ECA9B96FB1EA4B634A2 +F795A4C63126CFD1F62E2FA649CD83A60534288E97E115BC5C70317E67DBAC6F +7E6CEAE8B276582810C9DE838679F53D1B6F5357B65C242303AAA375365EB54F +71D298E7BCB301EB03A52274357B3AE1641F063D0F500DC1822F2D0F01EEA326 +6901E0D1F678ED312FDE1271E91F2322A0B5C0CE21025AC7FA56872E582DE628 +BCA33D46C848D95EC8798461909CA9430887CCCB0A7AFD328D253412B7E1272F +8BCE52415994BFAE2AA9BC5B15F88AF271F6BBD905A1BD56263ABB0CE18A590B +F60D9D744E60E3B2268D487D41D75036B57F06090989FBDBF21DF07E0389E5ED +BA749E34924FE624DDC926D64CA0074584907563B2729C6733CC9447655C9145 +5E8588FEB902A8F2C04EB992A82C0EB2D9F661FD316347FC2D292F86E7150395 +30032BFEFE0D06A4EB2EDF52116A28E179AAFF9370533074920349781CD7BA8A +6E9566FB7BB8B8A447DDA86FAB54438A20A0423C063649B998D907E0225DD496 +58EEFFA64F6C4169757BD3F7346B3A5EFB69BD6E6CAE09889601AAB6A7CCB3AF +74F19E564296364E2ECDE33CC45C66A34D60CED476F86117F48F1D6D37119238 +49E8AAAF99C803B30447EB3FD3CE0F46E5190C00078FDEE18A7F3F8BAAA68A77 +E5037AB225048FFC18D63DC425983DB5136D6C9EF7E41C17A28C989C5213A541 +A8D2668CCAABB766B5AE2D2C4398C9B603465A70ABEBBDC5FB143605FEEA369A +E15C6D2A9269F499AE2212D3D4BBE155BAF9FDD7084F75AD5B9C9D86829473CD +4BFA38B2226BA5FD39B7A11C7FA150B852163B8BC005179DE8FA9905D87F4560 +B3904C13B9C1F8C61183F6D884F5936EFE1A6F801E3008C380DC7C82FB772D20 +716962463255027A9A0855F0E0778067B5B88E1A12EA0AAF6F3DE89A49C7D207 +FD2F7C0B287AAC5CBC716DCCDE349B4ACEB38893EDCDC4E1D4B36A304609810B +707BA0C4997B64AEE7E5CDAA7B5121490628D8BA707F66F584E0A8F74498A34E +BEE01FE82AD441D38476B51E1C1EE9BE99D89B22DD0E9297152A4E09CCBD1CAF +76CEB2923AEE8D4DCE0BA0D21EABC4DF0C7280C9CFCF4FBB195778F07605672D +B776BFFC6E15BBD054C710EB0019F7C49DA1D2D1FBB756BE0F9442CEF0525905 +3C57BED93A6D436B14EB735199D360871581AB7AB85820FE99D0869F461DCDF6 +4B113A1C9E00573D73BD07B6679B40637DE21554CE46ED99A9A4C5D6E293FF6B +2F772C9FBD41845BA5349AC975F15BC524E1AD86BB37982CBE76FC16F46A4F92 +3ECFAE2132C835E3A6CEF250CB7121BFA3C7400D4351806D4D5297FEE462B49A +043CF43DD1187ADE46AB0454B542A4AC59813DEAAF9E54922E09F456B30BEFB8 +F157393D84A89FC8B8CA51FB718AAD8934886A72B5DFE0C34F63C6781C6B63C9 +7751A5332543E6D2778078845319BA0339E38B1D4E2A2D9D4150A714861E2ADC +00B24208BEC268140402888ADBB63080EF73411A08DFE8522BDE3F6676BCBBD2 +12331FCF4E159FDED8C781065847378742FDFECCCC61E96D4BD79ADCEB20397A +0642A3443C67EAE52A7901C6161935A6B5B610A872A6DDA3B95ABA1C9AE9E251 +1117AE1424789989578E3B14F9C39231F5A34775024C3C9B8D3B17D666176A13 +5860E38866A3ADE789B1C1C227D307293DBCB4FB39AA3471327E28A246DCEB00 +E27EA18172170CB0F08D00E2332741942158AE46A2C4C604DE489EAAC25B15EC +053B76795EA4EB4BF10205E880ABC24966513C3D32B63A07668F71583EDB4DC1 +D7D878812B206D43658A26EC1744261C89106D7B5D164F9B5F2525A3EB38515B +56A40EDE5693882EB3C084B7507390024BF0A8E57D770819B042E1F8F8970D57 +04220F03F50A14D8B7BFB774758412D84264520A9A3B0212C1AE990305FE1DAB +87B81DA2D141B0AF6D54152998D5C1032E7BBABAF42542370B95F8CA9B3A47ED +9EE0A6F9ABF5F6D960F2D003DBFD03C06E602F0EA1F9E41D832FA739113138AD +6EE516FD76C69688EA905834F31E58AF5FD745744B617B668A43F0517F6E4261 +3B06B444E78B9ACAEB50BFDC25B551F393DD3F3784453776F4B634BFCB2DFB6C +AF94576924972BFE1D344A5849EAE93807431A78BDFAA2060A1126D71881CDDB +B5F520B1E6B4DA5AD0C9004B04F78B83A4972FA52D285807E14FF176B7FDA9AD +838DC78D0988B8B6B0B994569B4DD30C0E2E5260676DBE1B9C04D1AA9586B85A +03A30AB5B6F1EEAD506DD7D3BFC5316392C6B765B12513E870750019FB555515 +32CA850CD77B133F5C90B67534F1F983C7BD884EBE6D39E16E405280D5C800D3 +8F467960AAFA4E58779B4E62ADB885A977790C15A1F1416A5D5FAF60F540D40B +3337855DF6F179530E6E581F888868A4DEA32A71A43C56B825AFCBF2F576E9F9 +1E14CBC5D909C84FE59237FD4E569039386F357275977AD7CB0948C0DF62A115 +1F6913576AEA2A769D61878E950AE3FCF93154831A86EF99ED630C074CCC16E9 +53953FF06C87E6ACED361FB42FFDC22729AF29DBBD1B1666DC34532E0B3E2387 +6AC5DF0AADC3E8E9E69E942073DC6CC6912D8FCC07C2E76B1A3C49D3E845C5C5 +4C2E8E26D7A96BB6FE33FDB5DBC43B6938B1538CC4DA7C9D0AB0DC2813BD21E3 +2CDB8EA5F0E8C5DA25E78E8160B850E6375D7091B6F597DCB0BA673237A1B3DC +A1CA70E5E5F3B0A63D18512FA3DD664FFE9F521CA8FC13CAEA3AD04A0AD6F89E +86A0BAC5311EE34233EDB6A1DF3980CA25329DAFF31C0E37526E4C00B55201C2 +DA63331299E36ECC8E6ED17825A9ABDA8C3FF60ABC502730FC79A1449E9DD257 +9644EC5A98A4B367F7785481C0443D35000A900573EBA9A13B64B5D2317F6E90 +1B7200E37D2F2AC6A09C7970B25F71CD3D1E3BCBE5927FCDDC53BBDEF4610E74 +1C1DB066D4A09B67F67F8871BDB3CE0AD7680F61E46F946B55E78056F54C4295 +1750E7FB0619B86EFDBC6B0B9B17FD7FFDF657CF28F59D1F0A259C3984A373CC +72A20F46F9E998D19A7F3EE3AC371226536C69ADFD050097F341FAB96D73C3D8 +46F595567EF178C82C30A953648890E6D986BAAB2EA9BDB8D201364C84B22B05 +AB58F715370E3DFC29A3270EE8BCD80FAA23AB1E003B9B62F4A80729E3518D94 +53D171DEE19E26C6FC9C12199A6F3E997A690F4D26418FBBC5CC4770080FB0B2 +F32B1AE606114633D0AD431D05B0871C5C8A23ADF67C101889BDD1207BC2C01A +F94F4F9AF2942FD0A978F60E607903CCC35F08E3763B5334760DA0C750C21D60 +3C09BA423FC85B01088DD57DD0AC85EE1AE5B801D1115E29704AA8ADE9AB323A +E9C2BEC420B2244C652555DB8EB5B50F4CD286714E9084BF1F41FCFF4C040450 +4D01EAE466B2504430782B4B92B7259216531C0CBAD0C766B5155DDBB3A214DA +129D940A82A692CD56EEFEDE2FE5FFA4BFBC1436BCB9D572C76E7D7EAE15B85E +6DBE97E10EF5257945DD96B83565DC1332 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTI10 +%!PS-AdobeFont-1.1: CMTI10 1.00B +%%CreationDate: 1992 Feb 19 19:56:16 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMTI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 39 /quoteright put +dup 45 /hyphen put +dup 46 /period put +dup 66 /B put +dup 67 /C put +dup 70 /F put +dup 78 /N put +dup 96 /quoteleft put +dup 101 /e put +dup 110 /n put +dup 111 /o put +dup 114 /r put +dup 116 /t put +dup 118 /v put +readonly def +/FontBBox{-163 -250 1146 969}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F +21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 +06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF +55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 +B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 +0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 +1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 +7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A +7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 +356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B +19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 +C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F +244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B +AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 +5C405DBE86B7439E0ED3852DB08275EEA457F1244C29150228D167679D78E7B4 +9D7B67A1D3CBEC072A1A22806BB201318A8A03A41164024160CA501F200D272C +713BA3B6124BCDAAF015B9D88D22D442A41D3F2BFC5D2A62DA183B416A9C1E96 +8A1E1A3762703996D9FED79367104EC44D61479A298C63AC064562B04E431B41 +2D4301E80344397713B6E0A5C2C75174A96B29A309C8C682A5D13D60C88DAC92 +657E7A26980893FEB5496F9D7C6BDE291A2BB41899BC9881BB6CE76FAFC31BD5 +EC1A698AFBEE2418DA80E93F82F7477A180FF3D6F876D5E3064BB81E68477D95 +26E492876E68EDFFADD2E4AA3D5831D8B65598F8F36DB986C6C618AA75E527C0 +4ED4016B8B54AF92AD30C02EE0CC7F10BB2127F7C006E1403DABB1EA22D44FA6 +51507C6739FA847B5C691FED64CF3791615E7783782D4F27F8F33BBC5A76CD95 +0530530F72971A48C4DDCC1F166FC377C2F39BE321A315C83604387EFCA580D6 +E4F60540738A238E22E1517F733FA8B908C7344E9B36F479D108CD6698F1CA23 +C254E2094856FC605BA12EC2286159485427B15AE6808DA9A7954F0C06170E9B +56EA967C4057D972079E573860A09A4EC8247AA04A7302797CA90338A55D6AA6 +79F121AD1BBD62D02743145FB3B13F7FE4A19B9E2D6A42A3F8EC42F8D0AA2841 +C42884998B4184D30D4B23D93A698F9A833DB5D3FB49418977E5427B573554FC +1F9DD4376159137BBF5089BB04C1E1BC3C347D686EFDC73BC41145E5B22C6816 +58595DD7FF87867C05608CC9338ED08DF09C2090A8A6D20104A5038F44C11BDE +B755CB6F4CDCF72A51095A2283A78D7AF1406286CFC8DC4D01C46614D7777103 +47086C4A964CCA6567E5ACEF7CA5CF1A9962F922B325F1C66F2268C4C4C193C8 +8A6B27EA1D54B0507DFA53AC2CC496615C53441B7F870932C28106C84BF7FE05 +126E342682A59354DC3B88FD4BB58C1134FB55ACB6090AAD8A9CEEEF12222E47 +029CA2AD8518FFABFA1C5077329862E0219166E8CA7BC07CB837D81AA7FA5F57 +99345FF77C6F8D1DA423003EBDAFF5CD0448356C0198A099CDA62409AE6CAAEC +271DB85AD5E47BC66DA59C1112DFE19BF97553A4F05A30B92A6521C1DF99B767 +A9600B7305B99AA2C48B0034A30F5B7CFE5CB05C4520B38ED1A80F95650CD0C8 +393EA2D79AF7154DE41E461E9F9D42B5E2F67016D68623B4D1F7746967ACB45D +31EADF5D5A752C81E54ED171778245DE58AF396AE745B4E9E119553E90B51FF2 +631A0BE030E8ADF2DEC7AC6ABE7C6F7FA8F0D5607A3A1A89782FB3E2213173DA +EFD3AEE2ABBC75710B7205B2A9C205FD4AACCACF3A18C94C0E080C3FEEC5B8B9 +2C3AE52B2C653252AE38E13ACCC94A179DFAC48D345FD8E5E596FBFA89D19941 +0209C14F68D67CD9C686AED5FE4C5ADE97F21B1B40101AE3303AD93CE9704914 +FD875E2F6F09BF40FA1603E147EE063FC4C743960396642013AA96363D07A240 +12A31426F0B7FA8F3086296F6044D377411CEF844E6D85DD4A440A1DC19E5163 +7B3E91729993F9C9B5AC21143A9F3813A4FD498EB19DC83C651C26805B4A0300 +D16739E72ED5CFB19134C3262E0650FC05703C9E3532482F3C6A96437FC949E1 +2172F9999B2CD1720348EAAD3097D46C3FE292635048AE33E17B01C281164E70 +CE4C181F1A728A89CDE1452F1C6A56A7087397345A480C50F7E9FDB0003A85AF +435515697B8D906C33207DB831AAA29F3A14A005BE1A19DB7D1D499C5600989E +C1BB9121156DAD956A6726141A72C1EFB85956C45D8A4F5878B58F6F52293B72 +4C128388633A48F8B3B9E3AAE3F8515F4C7E0B1BB45A981F72C2A922474081D1 +FE0533D320761321D0E868DB9A1993FB7D128CA9AE852A1D98164069C35EA9FF +A99EE188AF378EA4C723893C8408A369B9FE2B438FCC6232604AEE65E75A4927 +0E9C92CB699B9B2AE28C8F7ADBC235DCB2190697BCDD1D682949ED23F9C9A3AE +A7D1F0EB948A44E88495C3F47922A9C619F9AE7CB63F833C769F8BDFCF20826A +D2D644FA55613CA3A4D653E57DA4D161202A5946A2ADCA1976AE7F0949970D83 +6B6C892BC1D63C6B50DD6852F4C84441BF14649E1B2ECB33D1A7061A29AF163A +DE2BE0D88A003FFB55202F95F490E6D351382DD44167691118B7271595B95AE6 +57137349169A36A85EEEE6901BE0595787BD3B02ED825B8A31BEFE2DD1ECDC09 +3A68D9D7A39952DE982EDD694DECCDBED653FDE81314A2C901709B3829258C4F +E8AF29BE571E8505B105439DEE433D756E39FAF7E89B111CF4B65A56F51CCAA7 +22231BF8FCD16DD5E226AB4969E123264EEB4E2CDD9A4DF03BBBC01B63683FCE +CBB3D9F6113950EFB9504CF429E0C6805DAD619C7381062BA56D4F53ECDC78E7 +99BE44F37384E7439D0ECA6F4A36CEF107EE46D5DE4B474143EEF66886D86AED +930E98E00B5E509219CB86A4809E2CF597FE376DBF0BA074D681640036AD5D02 +CB7FA2B1039C23F264211F51BE7F3C001654BC61D5952038874ED97EC3FFBEA0 +26C89F68013B494E15A5155B1B80F5EACD3C6638448BB68AF42EB17BC23CD0C3 +9E5FE2A71349F7ED831577A5576A6CD6D77063576B7A3240552DDE82D5EF6335 +0A7DA4DF70362B3ED0817CB0BEC29BA06DB492C6BEE867F6411DDA387EB09052 +C809A3B6B1A996748DA30FDFAF5F57CC28003FB0F2D5F9AD4484BA50AA672FAA +3AD449C9C7DBCD8F956A0E2B313E3AFE5F65E55D980FBF7F716F8B1F31ADC961 +CA19F9EFAD2FA31B3782D393208349A46A4334D733C6E102A0247F4F305CBE17 +0C1C798CCA6E63001C542C7206FD1E0CCAA0A8ADF7D7121DB1C4DCA1992E706C +E9AA929F0B870293E7DFE199750E3EC08C1314ACEE9773A7916F73BA1233A7B0 +C1C08C0E190454590B16192340BB9108CA0C6F85BB9B10C3D8EE63F711C4563E +4621983AEAC378DAD2721E6A7710A1DA6693057C1FA4B697E5D5AEDF36738764 +3C957640B6C6A78782DC14A79F2A33297CBDBF02E8AFC5EBBEE3781D301ACD0B +4C149982EEC7080386BE2B4EB0440D2F357044E3ED4B77BCF4375581F1E8A727 +E10C406728CAE6A00D64A5DAA43C80E929E56703C137D255EAB14FAD72C21D29 +8A0C4D62887EEE2E83DFE67108474D721E72370FC288D4753C16FB9EC9A3E244 +60CBC04064FB29001CC7A996C4F185D46C88AFB8D11FC8849E62B8E80BB70006 +97DE661A5DA90AAA6F9FD7698949514CD3169B8BDDC42AC5D8A423E4E1FDF475 +C8D4A653DA6BB084E3F285636DE8182FC2931450D1851669130861E9F9EB371D +5457D0C2826BFE26D0F02C24F0FBC4D1EE611ABD65B0B352A37F21DFC7E385FE +C059B12AF38A159925141482E7F5B68D8F62F162A2C458F7DF7DBC2E547E4F43 +5F09E4BCD5431614B2C81F9334A330D603FE8B4B72BB8273E366FC68EE6A0C63 +E18B7F4647C5FC2FDC609E71633B064A89028940FF455BFDBE291B7E965900C9 +F360A3233D5341755F5E1B40333B470C5FB2B18BBD3336A9F300B5BAE45AA2B2 +232DD19F86AB7D01D90487B241A9F321EB41D9E836F5DFC678DC69551701BF3C +B02DA50B80EA569FB1D8741108C86297C38C55898EC4A31CD10565B211004F29 +BBAD22C404FA38B9D6517969F7017F390F617666ABE81A7804B513E2FBBC5DF1 +450CF4655F361CE2B610D4793E8703132E4CB48983FE7BD0E402ACA484E492CC +C132239EB646D7D33B1FC677FB223E76B2F5A850A109273AA1061F86BF0F5E9A +F4F6C152B643BF77CD305A4E696EEB17E74C4C99867D930A302E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.1: CMR10 1.00B +%%CreationDate: 1992 Feb 19 19:54:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 13 /fl put +dup 40 /parenleft put +dup 41 /parenright put +dup 43 /plus put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 58 /colon put +dup 61 /equal put +dup 63 /question put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 70 /F put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 77 /M put +dup 78 /N put +dup 83 /S put +dup 84 /T put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-251 -250 1009 969}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 +92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C +295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 +409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C +4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF +2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E +0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E +B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 +24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B +43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF +D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 +5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC +96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 +7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 +0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 +B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D +AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 +97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 +FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 +20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 +0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F90A32C4175B6BFB279 +024EAE1B04D721A6C54FD62484F8949B2CE9B87D9CEE04DFF82BF14931B3CA03 +AA5F701B6F80BBCDF2C427C40A51597F0B1BFA25EDD7CE0EAF2EC676BF0059B7 +15DD5462BA30DE78A08DD533DC0E8D85F9DAFC5FD842F417265427E0F1B71834 +D2BF6EFAC3CCC40D3EF3B2E2080F148441BA45E5D0C0F7D8416730AF4BE4FC93 +1E965594E0364F0D4F1EC48004CEBDDAFB1F0EE0A8222358EAC0F62E6BFA3C9F +46875EB4C999219B91E6147A49A668505667030CDF3495682B79C0F614AAEE68 +D976EFCDCB04127C0D7325A2211E49CD316935A0B472D1F9FFC68F7FBEBC7269 +79DE858914A95826CB2A8F0F17773C8DCBF6481A19CA03EBE2F1EEE59A3D6E3F +C23B65AED2429ACE7D1CA1F45B06D9C952F6E026953949028A6B7A4138666C7B +0A7B10F10DA7017B72F57DC4971A485ECAA7CBB1F832A94E176F8B529878D4C5 +E8A0F09E2150921985A94BDE6B1666471A95740E5F6371C4D75613C7B412A1C1 +38FFDD146B0B64AD4F04A51631C5EB5ED7C8166670286774E6F6DE84349A11F4 +E76B19B1A7164993C18C97C3DAD8B5F5A1DA74E8DBE68A92CAFAA72A6B274560 +0785C7B52C4EEB47FA5FD640739E1F09D5C68333DC61135BA3E5397F55DF844F +9EFE1E760903FDA43C262935B16E6F19D676D79978415CCDF6AF7447548E5DE5 +D5D19E6310CBBC224F848F23B91849F5AD80F9C913136B46CE583D38BE039EA0 +81AE29A2FE3EBD7443C35BF9B78A2B7F54A48609AEC90E71132EA82236C9BCD0 +740A8A2C8303D177A2632301DEB9F7E09CAD2173C071C4A37B14CC70736B448E +2B97608046795079819327C4ECBF72D946A1BBC62AE3CE6AC861327C6DB47384 +A7605A7B64FB9DB341259B91A98EC5637451A1A7159DDA13E066B21CB0E8B059 +74EEE9B9F95B5ADB9844C27ED4C80572B49954D81E4245F11C5A2B317440E323 +4D7D273AB1838330B58F96FE0386D048728E6C5FAB68358E1CD4481F6DEA7CCE +2D711A218FC3953EA7B36F464567F20F78C5C18B4FC2D4E9A761CB53A2B9C0B7 +3863B4D8DC22CDA11119E4BA04E8112F4BDB701BB94B4E2A73F6C0BDB2D359E7 +8E2524AFD0906EF13FD61C0CD303F0DB6286A4C96B19722BD65B59507DBCF6EF +84E03C0F850630AC64B3FB2B49B5A02CCBDC12B2C878FDE9B2318A214D6F84B5 +DA7785B657753159F4F6C81663FF30F73572C2861BDCD86BB33C5B99C749BD60 +737EA0ACF374733D744702FE26C4FA602661A6266C1517E4B22E4FA4CBF3DBEF +35723043DF35532AE3CF6B4CC492912D9F2115A75D70CC34A975775C6475B155 +8AB65F0A28C42F26DF0960E2DCCAB7F5B7AD1D32634DA0015252177274BE953E +B1442DDC534883AF9881C5FC191EF0B9EDAC431DEA67D5E4F4E0F9028D21A9D7 +47867EB25755EC5A3AB82BC4934C5020FCCF385748A6FC1B31FF4F3F3FB192E4 +2CE99CB5CC37916FA46985DBC1D93E255E70C065BC9C98D0ABD8936BE0A50844 +708D9DC95702912FCBE4A647ACA2C2F3CBD447FBF1CD01C8CC9CC39BA25245F7 +13FA5FDDF053954F20EA9A154C9C727F415F11A23EA01AF39E74986AD0D2F755 +B12C12F4F713A2B3CFB3C824BA4E35D3B3637CA82B8712699F04DB55B4C71B44 +FE937C1B332B826CD5D525C20AFDBBD7262F5E0059150E703F1848500E018E6B +BD98DCE7ABE51F50E117D36042EFAF4B316F4D3B1E1AD9DEDB16EA64FCD27D1C +B19265EC4883E1B6B167476CF6C2D0B53C1532CF5D4BF38D1CB5715299092725 +DCA0E4DD9320ED043B37B11D6B45D26742F2212987D55E5C675F0DA4B2719C6D +70A9A4208FB0C6EB31A3B8C8E52B3866FB70FCB3020687D96B94355D20ACC40E +309A3E96054DFA9C43DFE6C1773AF1A438B71E1C39997CAC9EC8CBAA1F881445 +E11D824FB43419C4C340EF3BA5D6C151D2E05179F6805DE9C16266A6F6B949DD +2176886CF7C2B1B5146AE258B1ECE8E2BF4C53F14FC097B8A855EE9A4F2041A0 +19505533107532A2E04C32CFC15EC125094CC9EFE5B987A0BC67540A38EBE7EF +29C9E5E4FBE1838AC31D2D59FABF7110720A0AECAC488604EAF3F99128B2E056 +AF840F34620EFA343159072ABA6C61F56A91F3E6D381174F0F67569B956C84D7 +74D3D9F9FECFE40B5C6638ED075E2B4B2ABB5270DDD015D8B3DD287A1F794C30 +171D2DB716A651547E16E17F20645878C6C2D2422052BB859568E6BFDA2F62CE +5E64C53DEC0BCB9CC1C1AC7E0F0A34B185BAC9EDA57B71DE541EBEB7648D0E86 +4A3447A8FA9205130BF44DD0D1DB6A43F271ED64F843C57A8DF67E5726DB54F3 +CF2F8394F9F455AFFD94CC6E3B18A6C1DF83307A895A9D3851890A3EB85A5C73 +E39E649E6D0738B002015E948BC9D3E81E0F2A7EC77A9522BCA907DC49BA0476 +D4B28D703B01FC3DF868A43573E40A14CF5444F40D791864040BF93E8A833DCA +5B11755ACD60461A7C35912BD1EF642351EFB0CCF7A01E5D098CADF9DCF1FA1F +2CBCC58A195623FFE609F960E2FF4C2FCC4CFDCF4FD44CB8DB4EDFAE1F434782 +8FDE64AFB108778C26510298B8BDB827A48369DDB1FE6D068E4186630DD3476F +33A4F0A0CC03BFE20C0D44DAFB33812F72CACFE57F7D7397CA7B828CFAEE178E +534BAC86E6BF32230B2EB52579B1AB2EC4DB9AA29457C7346781685C94A1BB31 +041F3F35BDE6D5D747BD80725022599401EB5952800224CD845F48DB6A9BC9C8 +DC3AB86A6AA03CDB7BDC009E0136939EF423E52C52C5B62783DD53F4937AECEE +9805003FD70BA4734E9DC3281E348715F5F39EC0360791B527973567B16CBA96 +DEDA5A6F89033CEE83E8C2E41D094866A6FB94D644DB5C97A32E25012E72606E +8E8006DC92D360114ABA1288CBCC170AD24056FB70E033AB4EC308C5D8E41690 +37F8F672809F9C0C017184EE268BB9A9BB443B99A639A5A06662CCFA6BD03494 +FFF1503041FAD3B8DE74AEB70F61D988D161B929632E63B6C436476B066F2B71 +3C062AD25523654C8895428562C2FD70E46CDE9F30578BBC618E0F9F2754B13E +46657A87D386E73842035B9F70A6AED1DB92F34E981009E22FE7973EBA89F81E +B9F3FF9A6C819780B5A89F3F98E1107C55DE2361E33B05CCE5AA739E916AB4ED +00F273E0B228750A03C58784A1D97610EF3857394729C6180EEDE72DA31EA5C0 +29F0C8C5673FC722F3BDEB806F9063C581BF88551F0A816723E98478AE80380D +097DCBFA53D9E53569614427911851A269030F7B4E63D040998533075492215D +32198168D739350BB3C453D1E618E83943D66AE963A5202F62A5ECD6CF74A60E +D905A03EF234D7B56EB7E1D857841071203BC11A85E9B222EAF62719437A1A9D +09146C9A2EA1EAE5BE5F8E9643EA120ED16F85415933EEE83DFC75FB8129A4E8 +EAC55CAA4F630C7728F95C1391964D97960A8298DF67C183493B38D2FFC06AD5 +3E7CF59ED497058F9E01D06AB9EF84BB4A2C368EF982F2883E4E324A969AB97D +0F2A32F6E86D96D155494E9F9482FD128E16C94902A49BA9B047865DC85FB3B5 +05875071DD0298FE887A74F2F622FC87E4D10074F85C17E2D19F538634CE6974 +DAFC8A08CA9DCA525F3677392265A18D82FB9E2A1C8C78DA68DA13F8A187DDCD +DC77B2B314CF8B8AF537D9AC3EBE008A13D00FBA34E96DE969946780D62F66C1 +AB172B6013950EC568F37AADBAB88F29016870C861B63D4266D9735066269ECB +7F088B5A5CBB1D12427CD76FB24D88DC87CBC04D36E2DFD107428071BADBAF38 +DFF598ED58562072E11791CB1D36AB73656FB3237CC75CFF445A232E6A7186AE +DF4A0A16C00C52DFF356D19EF7CF1E0E8800FF15CB79EA941191A2501057E3C6 +8745727F01A95F81638A5375905921266C6C3A164027BF210908EC09D87487B1 +7113791CF44938981C5E7304FDDFE18ECD600F55353F42C4EE76E556C7495EB9 +80DB8647822D02C27E650EFAD3B8AE6E1495761190BAB6105A7F13F1A510CA3F +1CEEBCA69D3330FDFF77E565C58DFFC962E3B1566FED6CF48110607AFDECEB1E +4A4CD54E901A2BE4047D31EC7040D4268CE88FFE9EB28B573213776816243FDC +23D3712CF0293B8138953616217A113A61F52DA6DE6D607F23413B2CDF1FE0A4 +1E424EECF2E07479885795FE33DBE12DA392EF27E536BD694AFC0B9B7C1E713B +2F4819858DA07E020A8BDDD26ACD7BBCC996A1A4B101ED1CA09F699D267506F7 +381C2D8FBE97BC15B09B742AE53C1F5D496AC831D17883C4C09843F6D9877369 +D57A5713897E8067FC12E3026E4082B01E509131BE4FF201C8AC2129DB74D394 +85433E8483D1BD14587655A98B5AE8EAF98183F9F28A3587E61F3C03D52BBB54 +7E3A50A4FEBC39E9C6AA3294187945E18DB4EDB2349C66CD6874D92CDC973EEC +D551F863BED3ABB1A048C32311966A65EDDCB80C98778111BE299FE47F6D44E8 +541A908D01E2A413947291D13C3ECA7E512898D59536A1C57DF2709EC86670B1 +5F48A7E8F83C523F361C773F166BC4278B0720263668ED2E19332954BE3E3CD7 +6E114370E19EDB1CD2E9CB7A78059E681D6C04633D392CEF0BB2FE888254CAEC +A08883ED913E026A8C95D63C6BF61E294ADA8EEF47443D63FE6C476B10888115 +9A6594AAA3BB7181207C4F932C2D14517ABBBF7E18C45582B98CF244BB34927C +247F563D02F8F143E61A3C7EC1FF72A63A64624DBD82DBBCDD55858CA5E73341 +E476F6D8A6E1C329B0B741BB3E6F3DA7F8FF984D9F0BDA57BE282DEBE5A2804B +E8305BC3932C90FE37341AC605C2C87F700FCCD03629E287B72A8DC3B179FB9E +9AC3896C8D4A49D118D30B0391D7540CC380583094D6872240056CE0F1DBE044 +2AF63E9819447BE51FEA8AC137B16576780AF133516459DA66A9C09E8C0EFB1C +7C7363895940EC8993CE212585F9E2051520D3E8ADD603B4A64FDFE34AD1A9FA +B63881D6CAF62BA43B3C1F9FA4AC121DDA29BC9A63BD861E0AFBBCDB1C2D0C86 +DAEAC246A1C140C9CCAE2E71E4BA218E8A7B84D4A10E9DB725B9A2FA9A51C0ED +1EE07088AC898C626D7541BCC0961DBD51881830AD90EB4DD27AC661FBF63382 +1E3DC9E2B90684610183F973281A36B2A415AE387CB7DE657FA971103C9DFA92 +E60DA6BAD348882F99995AF6451ADF1A515419D525E4A165C370182885C15B33 +A6A9CF8E575E0DDD0A768C1067D40775AF2EB7EF5FF9B8FF4601E137091D247E +67C3FB90D003E70FA0C4BD0F9DDAF2842FFA83ED06C4266CFEA773B4555041CA +8D5199216B991C964F1D5DA940A1F0F100C159E2549500747FEA85CFC878C533 +A67592AE43F639818F427A520A065447CBD8382E9B5A63A0000F820D506EDF57 +9E066C1F29419A37AB576EAFD0E6FF8DD68C157CC66BA3AEDA626B55CB310EEF +43DDC55BE9ADD35E61EB424297C1B76EBC1567F3D4F06414101E9D9906EA538E +170D4F8166C8429D4BA3B5A16CAEEA69E0BB9AD7D669CFAE3989E0EF7798FD76 +5F92FA4ABD0EFCB549632DAC66393B624B81103E0153DE8ABB2552BD7E2584B6 +19839372C5F6C6B39367D2CD802488F51B9CBBCE9F0BAAA8EA7BEFF22436D81E +CCDF912D9FCA13419F46F3D95F291EF2074F22EBD429BD701C1B6A79751FAEB5 +57CB0378770DA726E6244A79DA800DB760EDBFC42EFED09E31586FC9A320C361 +0E055C19A9CC2B345EEF37DC133B2A695FAA487215DA7AA66CD4A490F38B3BBB +87E468F0306CC5A5ABDC9CECB06A9BD23C3E935AA385D7F3FF2029F4B55DFF53 +71BE63422B0DCB0281EE3E2B5B8A3D8D70BCDD3CB1F6FDBF3BFEC9F77F4CE26B +E722F0620C6176F889BBB70CAFECABFEA66B11D04611CA4070B5B84E738DCB7A +4CEDB96470DA40A77B2455160E9B6FD1C9CE78F055E21EAE828086839609548F +FBF0ED14222080AFF5A8B0B032247B70D4115C9DCC8C6B2BC93B7507F769EB9E +AB025EBC493646CF5C85DFCA353870D495D7890861BE50376E5EE3367FDDFD79 +6A6BB1374EA89D97082799AC7D5D294A8B7A5CFA8694CD478305A7AC6536ED76 +3CCEEF1623A4F5A4ADA29ACABFAF8DF413966EC462132409F498CD0FDA999129 +807016B61B9A78FF002757728C37E2BEC98AE3A4168E812F94F05A2546EA6CEC +6EAC17993BB7D5F5983ECB4C0EE5DF6FF638B29A7ABE6249AD346840EE520BFC +53C11A5E50DC77CD071DF530804BD58E84390D4A638559E4E08E09AB34A46D17 +9337EA42A531655C0EB29EC07F1D7B4E55D31CEBA6A3DE5E1DFBF21F45B63068 +E18717158E799D7E2ABF88002FE9FA956AB2999BDCDACF2C5BC9E9114F3F5506 +0C45C775980E89C69D9F57E4C97BE28342E0860F99D043C443B02AEC59AEB684 +E865AA7DEDD0429AEA9D217D6A7957D0FE251495C60BA34DB63A84FF476255AD +094E10752E2E7DA61A4FAE2E893F6130FFFE6B00CD97299E9E8508390A45E208 +55CE876F3D12B99DEF5C0B2863CEB16FEFC4426E577D7BE8E0C1C5C16D0E6E79 +5A5301DE570C7AF0CB3032BF24F609E9580C11DD664D35C6720E12A85EEA2A5A +D2D1F792FB0E192CB64C0375666E652A0DF37CDDC1667C15D8D19DBFAA108A55 +CE347F664B8FAD71D9804651D004497197AB7259CE7625A0F5357D5A30661DC0 +3827A40128E413E726ACBD338037470F1AD612BAF9E0A065CE003AA128A75268 +66E1E5C19600C0B0DD753333E654E69CC8F59327A2D98D12642F29164C62CBDE +4B2C78CA1356F00A18885F5C33962D27B70B44CD4F284AD287C8B783F6D6C133 +2AFE908F427F43B29E589118A4FF67799C1ACF93136B1A474541047713987767 +939E42CA51B282E148D08247442BCCC3959959ADCC344E2A3C6F0D1C565B4228 +E0ED4FEF48669F677F3BEE92A0969395901BA3A3431ABDA4B569AD5A0FC47F79 +9F37C2551DFA2491908F2F0D08012870C979408262A3E04F11E55E5F8FEE4664 +E6AB9F0BE650546A40D8C706D7B0C1A50B663BE893406184C53B4DB82D7F75DF +7133C73AE2146E274E5519D305979A1B9964DD329B2B9C3E6844F830BAFA5C92 +AE307E3B7A6BE3F5CB0A2FE046F2358465DB614BE8C9E552DF34AD19A1433727 +6200441757D02371431092B185206357E42E494C47646668C60AB5B1E748547E +1493ED3B9B406DC87049F86B4C3E9650B806462ECD9390FC61153915B752E3B7 +F802503C3AEC3665D66BDB463AD5A7F2C536DE50163EA2C247B137FA1259F299 +B93DF2590030FBFD746C91A71D941F1B97A60E995B90B7FCBCD9FE33BA6C23F7 +DB26A3B513887AF984BE07421F2B83F9990086CA79F03649CD847CD1721DEF36 +1BE45E90CA6DFA4781B2D1CDC8C9953486245E72F4F8EE96BC7026B43D4B1608 +B5C214E58EBD8FCCB36A09BDFDE3D9BD1888884198F85BC094630B3A9C88D01F +C51E1ABBCEB5ED053C7AE01ABAD72E10F8D3314C0F875CDC4A4759D350ACE7BA +5B2D0BF3083EAEB8AC1B686A34F3F69656FC2F5A843F38CA0CEF43DBC17C70BB +D950B7BF601A464FDF76331B5B81A6D66B43888E8FC1F99020387349E981FC79 +3672B73289BBC02EB700F2E10DBC9E8AAB2840E0F603B9B6D267D455881F3E7E +420D3AB18E32ECFFFCB317DB9219A482E66D5423FCC0F49E87DE82A5F1BB4230 +1F4260C1548C478A6EEB852356C90136A24A5E810806447AF315279961661D54 +FC5FDE675B61E36EE1D434337DEF088948E9DBD443BE1AD75CA415D092E2EB42 +BEDBA83E6EEC08CF2D171A8429082B2A49AFEF38CCD6957713FB365A2E99848A +7E300742AF41D40CE6C7BD4F8CA89E8898A423660E8B379CC2DBB95621253695 +1EB3E9D93B457D654DAEF414D7B40FB28B320E88FD4938DAEFC0194761F60321 +AFAA5E85800383C05504D698C054AE66B3F571A15A5841656E75891601DF743D +C27EEA8BC2B172602359541598C16083D19EDA2E1C7038E1E92C4AA0878B6A73 +7586CFC0416DFDA05FBCC45D7A2229480A374B82342FAA32CF348068B75F3E95 +77BC891DB6D770B5FA468E8291DAA85E5DD5E0A133ABA10609ACCCE9B91C93D2 +97C114B33B3A2332FE8ADC747C0A38DC58B61BE89B7BD41EDFA42994AC6B2BE3 +2567A524ED9BC2A0E92866A4BD1952B1A4611DFF8C9743F04D3E3EDCBC8DC10E +47C0380AAA4EE0F969096DF2A5DFB6030F319DA8B0FC83712FDAD000999B4373 +198F8A07BB714F2840EA0D18F568698842829E6F38744115C65B877420B30842 +A5AF4AA800367FCBDDB8B36B955A9D012FE1D200C6FDD0CF776FF67FDFAC3B0B +FD0E77FF4D4D07695C4D110A6220D199C614DE78C29C29346B245DD9AA9CFDF0 +1D438176663F481C16265A0C4FD04AE72B4D7C6E727CB3A3F9BC6414E3AE38C0 +CF8C668F94F7D75707AAE13A451E48DBEEFB00546AADE666D782EA01CFEB046C +DB2144EBF821AB996447F3F461CF8B28B47119412C61B7D0540D8381544DFFE4 +EFAD4C7B51EE4CA0E11EC9E6AB03286E7734D890EBA2BEDDD20D60B3B4AB0E09 +E0F408A6DBDF764AB41596D234B523E8F3517CAD24A3174D679961D7A3BAC907 +30A09A44F75D23F013F37578141BC42D3F06368807900222FD73B72CF2CE12E0 +F5798A0067775AFDC6040FB2D730E1F8C925F88CD6A1337295BD5E58CC7405F9 +DEEBCEB5027954F8A58D4A97F4417AEA9A83637D36A12D111AF57A4F415D8429 +256F397B84C8D67FB2FD8922252A8B9C7292FDA3F011C1A8A901597E781444FD +E4BD85FA5A0FD769FE7C2A3D96391385E4D67AC5E08C7D11ED0AE73A848AB130 +8F860BF92396C652C3758EB67B5A413438D7532C148AF5B986BCB13B0D2BB330 +5015EFA9F5914612A6814BFC48D258478D61B3F22D76E5816B657A246245BB87 +FE56A88D3D5E00B10C4CE26726F63A5E8279903278EFD93EDAA5A036784BD5C2 +F3C3A4A908D537FC50993057B80F536F767E864E29ED3C6FB9EB287ACCD36E98 +41AE061600D39B59A980A03FBCAAF4AF1A1235E264A31F6DF8C6DCA7DCDFB8CD +44582779D5C2372C8A56EDF485CD9CA922F0E0E08DA6FF22FD5E252CA3E0AD59 +E298BF57554A83F647EB50A8E490D4460FC8F89A2858639F6AD82EE0670138E7 +B60558DE029E959AB616DEAE0C508112D8F78E48E77B5AFB13D3D3C599F598F9 +BF2DBB3E6FD8271D0F2D8F345B4515D49A1F7C25E299DE5E7D098A4DF2AA3EFE +21BEC59E0A6AEC189E1E2455E3279FDCE1F0E1995CFB48CECDA42DE3F998E6DC +5BDA7DBE78A280A72CA6DAE2B2CE48B1E5AD372AA627F786587543654EAA6C41 +AD324E6F1477838EFD9F2DE67EEF905C280BDFA85C15E18D9EE60E8C7F9168D7 +48AB8C946CEDC8F1EE932C38E546AD6A1734DD7332BF0BCDD3535566B5EEBC39 +1D5479B0D1EDBE1C97FF54A5AAAC8435E9C02239D7FBC6A2DBAF5AE75C101889 +8B3FE7CA596FE990EFC3EDEB32F3A444632424C34B9B233844DE2B5773839E7F +E27DF63C664470AF8ACB24FFFE72148ED6EAA65327A53088711F058458A445E9 +B4DF39BEADC72B9ECD73C4934772CE62737FB7A50361A0F7B179BB303A0ED6ED +A515FB2EE389D41DBBF0EF2C8857D80AEC3EE8A8AECD32E9B83BD9E609FF2AD6 +C2883318236BAE78FA6B06A3186C22C557A020F1C7EAC41374E4A24F6DBF2656 +366B49251B1EF2E8EFA837B7A97C4FF1F3B7BF05BD89C0F69CD9CFF0CC2DA394 +380003F71603D59B1D574F2D3CEDFB6E8FDE397320F1F0E5DADA15DB4A89627A +1725EB1E12F44962DE7014FAE0FFC10EDE96C083D4D97A817C300D604C95E147 +F2B238462E38EA6D7A3D9E6E2B29493ADC7C16DC069D7A6E29CA2FD193410D12 +18199FC35B4A03C5079BF155A216EA17B01FBCD67D30F07F416C390A107D47B6 +1292D3E9640A7BA34D15CAACBA2CF0439CB0235FA8984523693ACE97ADA700F6 +FD64D6EB667168B4118B62225C761A282A60B5DFF28E23FE6F183D1A7D38C42E +6E6E7FC4DFC9961EA47A06C7584D78B4E61DF8CCB4319C2CB91A09AC67BA7C8D +F501034B9395F1502C07058E796A11D27369E1C61B40F86C2EB36D13C1FA8D95 +BAFB934FFB995E982388B2B45C082C29F8BC588BFB82B932E33B837D879C1CEE +49095A80CDC4DF051FAA4A1ECB2E9473D4F1BCB6F7A7ED8769A3F5924FB9AA53 +3DFC9CA131C3D904F42CDDC96C767972565BE17C4415A4C77A182CFC2F7FBDB3 +91E3B051F6CB7BC200F603FCD1FC6A7BFC469A3E13F837D457C2062CFAF35CC6 +B1F2F57CF2BD623F2647967E7CAE1DC09DF0C35BE0BA229C027F8D22EC50BBDD +B27F83E4650070610C6DAF87ECFF2473282B127C5AAA485E16B2476E466BDECE +9EF8FDA294AC5B4F3510A4288B1AE7695B602BD8C482558A31F89CC270467EB0 +16FA7D764374DCE65583BF0892D1BCB040E5ED9DA8A300CDDB0FCE0C82BB7237 +5567DBA975514662C90E882B58C0C3E1CFBB3FC5780928A1B977E9EAFD15B3AB +EBCB095870D50F80DFEE0E43DE94AF4D229B8B458345A945AA133A0EDC5F1ABF +3C3F782EC26264E8887A3B438AE768214573D72C11A5CB432C67718F1E468FBB +F3BAB85A0FC12BA633ECD4A25ECF221394DD4416BC2C0F90B756D7FB6D5ACF03 +D6B5E0336DDFE2C4C9286F9ACB953E506B6A2B1F015C35B7E750EA5794576C0A +BA9DFD2074C5C093071BD8332B55A49AE1B938EF4ADC03765F51B41A0892783C +63EC9D221C4CF30F62FD0E09B6E6F654F21816DB6AE4A82616B348FD64E8A392 +71F56CAD1CB207FE9BD16A8D26C629A9EDFECE6683ABFF9AD43EA9A64421C6FE +7BD4F0BF49DEA0B327A3CC61375989F57157AC3FBA94A49DF972827B517FFF71 +050FE2B4DE00390B19152477359F08A79AE9BAB51D73719F0F44F2E50F60C21A +C89DDAB195AA1AEB900829189A00573D6905B62B7DE59BC32E61600D25E8A77D +9389206175AA070D0EE7B0308AC74CB5279570315EDD68767333E4321DC893D8 +1E768D37ED63B08D518EF1269E4F0C194E4B0BDB7F5EA0D5A9E421DFEFCBCDBC +5F20CC58C69FD623752CD94EBC1A94E6D9D76DD7567B83526C426AF62165F2A5 +FF77A4A62E74B331F500CB4C133310EB822A8168BFB56BB9D14B1B68B397DD23 +EC5E17D46680EC92BEE91F0AA0571BD8A446591E50DF99A1A50EF6EC9E267DCE +ADB0F389ECCD8AE143D0413470141F54EFF7E0BF7D49E84116D4E8B63E8A65B5 +78796DB1711181C24153FC46138DC6E1A31F9A390CFE7624F82F206C82DDB246 +F1C61116F12EE53845D7D930A14EFA505CA78CA4318B72B8973C991DCB1D79DD +C4D274930D7E167D534CA562CEF0EB4BDA8481B318E43E70C465AA31EEFBC688 +55B54514713434DEEC4B75C123CC828B03B0879CAF9DC60BB6235F6D1144DFA6 +81BC13107AAC6FF032647460EDC29C17542F91F5C480179EE574B9212BC9D9E0 +122C764BAFA6D2C487BE84228F7D4683655930A9D0834A01EC494E2FAA7E5E27 +36541E54DD25A240BE24161C31281DBA5F2DBBD2E46F0F64EAA0A98E5B6F0CA7 +6F8E468A2AB20165BA1DFB29DBE6D2E1B8A7C4B266F75EB10AC991157FB81283 +B3D49421F32B049CA098AD48EDCD0E98A1B649E981C6F1AFE8E8FE0F98EBA82E +F7072CE5475F7C9AF48D81A3E45C4DC08CF5BDA01D66B6A4A4B7366C8CE0FDAA +4D4A582EFEDA587DA5B7B988C7BBFC1D2EA88E01C7DAE7CA803CD20CAD574113 +4F776AAA5903EF250AF4AE38476CA768F04ABE2BA6566DF34E8AA023D3D48FAB +DABB918F79263FCDF3A1F5E40246B1549C5C4862BD0CD8C268CE85AC85BF3CD7 +65F9ADDB8039332AFA4058AA7A6771AAE4ED982D5CC6122C7AB3FC8E85F9BB18 +25A097E5AF7E67F603D118B437023F972BFFF2D7522132A995BDE3255201C634 +BAED26DA6E0127ED1AEDA9438B896E62388260F2BF11E06A06A9D591C97BB52D +904144EC22A9362BA3D8FB7B7B93F8A1093F1A5799FD48953AE33A2970F64A39 +5B3C61EE064CAB785D0C5B3C2DD58015FFED2DC34A514652741E637D09CEA9D6 +E25783050263C7B807E21E8ABAC08A76F001B30A68084B9A5805BBB63F2B9BED +4BF5D1044470FFB942EE6B00894BD9093CB8A7045618B312B4DAF77649B97D2D +C6DA35D7239C8B3E46AB3761EBC472ADB8738E73900A980C425291FA4078BE9C +0B606191477FA5604D1C923CD5F267D0CF0F49973D4E9324907E99A3BADB6053 +D75C51A3C397256184BA56E4764F191FBADB608E443FCAAABC89C0189709C958 +09F61E163AD9DD26850E35CBDC8F325CB920C281F42525B55E6B1E89A1051EF5 +B86F07D665D05B1B239D682170F06DE1DE1616602699AF63EFEC311BD26AEF46 +F3FA0AC2F6A76C364B4F36E5E0E9D534C1F33ADD2B68A3FB4D183A91685E6D91 +7CD8C70C0BFAFCE4ADCA7393773C9F1AD62558E9795EAF41493D47339C298FC0 +AEAD6D3D95F1E96239C7E972526E14FA04E3D677D43A6F272094A5EC431810D3 +BCFD698C37A2EE541E85C1A738F0BE7DF77A7BC58DA1B4E090418B260C559582 +71B0407E525D537E32D446C13CEED2C7167DACAEC308B0D5C724339EC4306C24 +3ED2CE312D02F74C7FA693A563E6A14749DA49ADC82F9A00B32490C54EBF3826 +4A636B7138E6FAC49FDA5D45A921174E0D57B8B5A8AD9C83C39947A4B6CB8356 +3435AA9B10221304174EA2E7AC0B2440945AD3B21542CAC6C21D75F80D83A718 +10D87B880D2028F089C8F66CFE3F8CDF1E38C6F9F0ED728F5DFDC34BE2A67F3F +038493C2FEEB850A2C149C886FAF3DE7E3688DE55C970FC7B113D26AD2284552 +7708B57AA4B6EE88BDB90B4D7A55CA83C368C869B4D4FDED35A5750B7BAD5182 +281EDE484B172386E95496FEC79D65EFC458E6DD5E3D40DF87F929DF982776A8 +A128DFC28E904B72488B59A2B997F2E526E62B43A75AB0E3AA4003CBF1874498 +5696DA2B12D7350F3512EA4228DB5D75AF678C4ACFD30E243E6E2CBD801FF50B +BBDCEF38D8E155A171ADFC52365C853DA3D06507F19F8F9DAEAA2A923DE37860 +BC6ED4106EC1B2E60CA6DCAE9AF3C600F4E1C7EDF86F467671838136260B213C +8DB0047B755D35D7BFEE78DCC9F2DB56B1E020ABAA9D38D5A86C85B1364B7781 +964E7D066E0D5570736FC4016DCEF883FFA1DCDDE5BF338CFF7C197D9B3C7CDC +D053A142A4013BFCADA5E2576A437FF145F149E9E056A95EA95AD80B93544E8F +E5CD9C2153D99DCDA0BB7005ADFC7C5EE4692DD41725262836A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR12 +%!PS-AdobeFont-1.1: CMR12 1.0 +%%CreationDate: 1991 Aug 20 16:38:05 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 44 /comma put +dup 45 /hyphen put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 57 /nine put +dup 65 /A put +dup 66 /B put +dup 70 /F put +dup 78 /N put +dup 99 /c put +dup 101 /e put +dup 105 /i put +dup 108 /l put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 116 /t put +dup 118 /v put +readonly def +/FontBBox{-34 -251 988 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C +68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 +3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E +59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28 +51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23 +DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A +AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F +45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31 +821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE +96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D +9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379 +26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4 +140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213 +1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498 +1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB +377D3061A20B1EB98796B8607EECBC699445EAA866C38E02DF59F5EDD378303A +0733B90E7835C0AAF32BA04F1566D8161EA89CD4D14DDB953F8B910BFC8A7F03 +5020F55EF8FC2640ADADA156F6CF8F2EB6610F7EE8874A26CBE7CD154469B9F4 +ED76886B3FB679FFDEB59BB6C55AF7087BA48B75EE2FB374B19BCC421A963E15 +FE05ECAAF9EECDF4B2715010A320102E6F8CCAA342FA11532671CD8AB8FF325A +62FC5DD3D91489C6571ABED041CC780CB6241753491E8ED99CE05D849D27734D +705B556C1BA9394AD8E73330971B2B071E890359BCCEF830044969471431BD61 +A150893A6E4DF6B78DC4B6E73FA7A3E4327434A0D66281F5976E6F58BC2F7013 +ED318D38A606EFE49E9D1DA564BB271E8B02A62962FD782636A65D1361339F44 +A9FCC00796F580E5DDED76C0F22A334AC01F9AF7111D8B8E528D7D4C0A04065E +A093C7835D8527F43BB8FF494031643BC51C53FB23D3CEDD27853928843A44E6 +109EA97EB5DBAF714AF06F71DB647E1E149B49B9CE6370CB5D4F9D26FE44B9DA +575CD6FB7FEF3B3A6AB64D1AFA19116236A04AB1B3565028E0C2C18ACC75746E +2B31C68B69E8D25C8C8F1E3B3545BB75F0C2099973B39D5C33FD6B913340C86B +2CF669A801BB042A32A7FC301D93BB5F9F7792F64B7478634D65F87A6EE830F5 +C0012FFFA0D9E4CDE77D123883960B404B2C76401CCCB0AF8D84E10AFAE7C062 +F90598958119AEF48E6BD05CB23B2A00DB63711CB5B582F4538E75FA6AE72853 +4607BDF3629D0D40B10F8973DF7439BC334D8CB034A42B826205E83F059DB6F2 +CFC1B67E61C5D75A5AD220DBD353B366C790139D5633571F3C33DD97A4F58D35 +36DCE94FAB6FFAD2324DBA28E3E98734D27B9229017E5D48D601BA45212284EA +90602CC59FD134EEC8E20E4CAC6B4DEC344FC4FC2D2DDD5A0A88029F26757B05 +1731D35B4E85D88F28709A90EFCB8673638883B9DD573D0C3BAE083AA9B732EB +A3FA84B661B74D439CCD8F9AFE9BC98B8E142074C287F5FFF5656EE3ECE570BE +8371A407B24FEF12C8A340D6AFFA05929E34D9EE813235F3CCA305CE585B1977 +6B45F4317D4503564423F19BFF878732FFDC0D0B23ACD0173D3941CBFAFE8410 +76B67E32E2E3EAA87C8D207941197F59F5F0F7E34731809506FA1AFBE20E98FB +4FE068E2E2D36DF6B0961557EA07D5834FE6971CCE80E969EEF048FF5CDC754E +2067F7CF225E00B866D4BE95862AD4ED147AE432D59F2BA57027F538AE32E56C +0EDEA2E62E5F942F9108027D1F214FE3E987820B1EA3D35941C3D9AC3465DFB7 +537688DA96500145E7A7B0C3F9F74C3AD20FD3AC5B18DA9C48D935951A8D17FA +50EF2495C7B294C5BA0BF1E2678C1362E8AEDE53B6E251BF2D30771125B2CB75 +AAE5D292142CF146D4873AAC5D8996D4B63680D2C6358B25D22E894C64CCAAD6 +C149D61389F1FD7B0F0EF7B113D380DAC4E97F59090F813890254DF063D7C57F +04FB9B1924AC2E5D6CF812C2A6AC981340DC5CE2E89A18DC07D3F5FE23CBB7C5 +1F8EFB2F5306512BEA1F964D0EFD2F13D59D499F0AF95BC12D06BB81A4D416F8 +4D0869D361C37D1AD7F6B61198A575D7D998AC5C9E39FEF7F5C88FBD1187B59F +1CCD417EB37751E900FB5547452D9A97AD17112C3C074C869F3A1B13F064F4C9 +B234F9094D75F49586F2E97319A9B7B16D7D4405BD80D740545B745ECF08C3BB +3C423CAA3A528B40E76E64EF6F99995EAC427FA3E54F488F27E46F85EDC02193 +5FA23AFF80B091C5FA9AD585303622258DCE3D3B1826B66C4F1BABEAA47F91EA +476EFAB9A828B295BB2FE111B9B4BFC9DBD102D2542B46EF2B24A285DAB53E54 +A18EB6BBBBA76D7AC3BE3CDF74498F2FE8BDF092BF5142FDAA6E9014A2C86FF9 +5E451D133029002B89C385A84741529EA886B054602474F6EE6976A9BFAAA841 +70BF90802400FF563B1DDE1890239E271F41A953C817E27FB2B6F8EEF2073A95 +F6213A492E8D2750601F39F4CB632D2F61BE1FAB15EB36194A772685609E8FDA +B517BB13E7FD5AE95F50986A0596D5D609CCE6AA6255C5C86510128AB85AF55A +1740434CB21DF3F3EA9A347EDC766DA4D7872F241F9D5C3792CE65583B4FCF1E +91D41D3F8A1DCA257A8186334A518FCA11A797A76EDB21520D08B7894ACFE745 +BF48C26986E3ED1A351D79FB7CA2C759E7C11A991B4872E5E2A4342A8F70AE8F +178A8896F50D7B92C0E64532CD68FB5236307D20B89361BD72CF00BE54BE27BD +45F7A0DA1F240AF8266ABA4DC04F315B4107700240C009C9A0E81040F43BD1DD +C4F3DBA4E8C68B1AD6DDC4D79663BA403EA12B6455FE400534D8C58F4748B865 +F4D2E92D068EAF1089053ED1F38C92DFCD9210638BCCAE58F5E5E824E03146B5 +9B41901164522696923C1B61DDF0BD5CB5D8CFDF3ECE4B9369190670BA96B6F1 +9090518827C890D785C9AB74B85B9A14F2153E922EA439E5F29A63FF1F6E9A47 +995E3235307D95A433245CFAB577B6AE35AFAAB38DBB93D9DF8C55D543ABE869 +0EB49E7E48779DE30B351D4E0F6D7BF38023B77D5600D60ED462385BFEFE83FD +1549687588BDF1973AFC96C5C1DE61F1218A01989DBA8053A3CDD3B9DA778F7B +576707B3D829F084AC4BD0414953703D0B4A1E5A7BC6A476497FA0A9137CD31F +EE96C16CAF25FB3C20738A21984EBE7CA917730E63AEAFEFFEDCF0E2C6D089AE +0690A0E0321B5C891C0DEFB26864470059761F0421B30C28406FB1A728231027 +B6618C93E1C2BEF2A8C972BE9749455A6FCF0C1B0F2B3ADB0F51E57D4178883C +3C8006F97B62D6EADF82C9D14F2EDC92E855D25B9A32FF71A60692ACA0B39816 +E3FAD7405273408897C6314B477AB13E63113055CA87DB5FD7C09593BE7F1632 +F48F39BDBB6D250F2E20AE2D1C5DA611A3EF983C9C02BF63A0434DBF51D23686 +9963A7E50C0298326A00DE971D8DC6AB847FC4AF6B37F7FCBDB123637FF302D3 +5A94AA2916F0EAFC8E0376E2E99428791D66BE2FD1D26CDB80A8ABE9E1E3A2CB +A1421712BBEA766564E907CC7B848232B5D08EDB66DC6C46D1C37417658CB754 +7D87A722957D6EF26FE08E1B7D94EEF6381B17F3952145F527FA863B4CC101FB +0B42E4F5E0DCCEB42E0082047C2A5F242E4E6EE62FE29662ACC6A26DC15C55A0 +9191734B84E135C34C5D96E902E3E52F0F992B0AC615033062B4AF58BF46FA63 +DFB1054A78AAF62DAC6036412E2DA44040936DFED4453040E0D11F43E4FA7139 +7965AE2A92473242A9390BCBE3F788D03BC9E0952BE288B5026E5990E2A8A389 +562393B14624CA2E569CE0440B42E5B9632A392FA3158F579BCCF31602DDB9B2 +098A609F3B335D12A41D3F07A73A28E0C40A30AC2578A6199A4DDDFDDB5ED2A7 +D3DCE38E22C8A90A2A59A73A291C9C676075B600C31E019067F5BDA7A645BA32 +4E68868FBBCF62EE47E87DAB37C8EB6E8A86B012096E95FB4F37D78C4BDD1624 +3782DE79863137F7B979F372A3A842FDFC054373724EF69A5E78E6FAFFD107DD +6427B846969F0B2DFF5BE4304AC64BF4D7317170F9F41B938FA9177F6FD90319 +D440BD5B3361C76D13AE5BA48CE1329173BCBD824E7BB361A688D4487E4A6578 +618734621CF8CD4FB20CF160B120F5009E3C74163FF412B0B44AD44326312CE4 +502806C519C7DB142AC8E9CD1C35932B95E0898485A8737173CCD10BB8DB4352 +7D9A909018C2EDDCDF0CE7CD42CB2EE40A28911756B0987B0228FC0C0160B9E0 +FA55B14A9C3F149CD64F922543B7E272D377CA6D59B888695A2FDDC157838F64 +E0B66036DE41244B0F5DF99BFF70AA7094A6BCE02AE211761E63ABB52C98912C +99829FFEA7F1CFEBC1DABBB581FEC6AED85B4495F754EBC800C66441E668C587 +FA5DF393F961497E9A08305C5D10A13F114379B2DF361B136C299D3AF21C2DC5 +389DEB80C0766FE0435E887670DBC572F03864B7C234D47FF0C2259E100D4299 +B8B9FD9734AA92CB165183B1F8A3BD4FEBA4DB2E47C5C2B662E58CAEE624969F +BC2F97E343C37A79FB4AB9329B3008F8D57AE1D02619BBD2624EBE8AB8F47FD4 +B797D93D522E8D8CC07A603299EFC1652927704007128003E7D6A1D98F888353 +D4EB7DD0F7CB17DAA4F2A4554C1DB3167D669E60D43D54DC5EB82450ED46C514 +C9051F8BBD17F0A203972DFF928130C95EDCD04B05A5EFEBA56A9FB0449111E0 +F568B9AA7FE134288972E5F490C31A67837002B635322548D4BA59DB8265E819 +90EF94D39341A98138ED1A4F74211933E2DA64A256E5C6447898A2B62E7BE7BC +093A4A305A4A21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR17 +%!PS-AdobeFont-1.1: CMR17 1.0 +%%CreationDate: 1991 Aug 20 16:38:24 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR17) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR17 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 74 /J put +dup 76 /L put +dup 84 /T put +dup 97 /a put +dup 101 /e put +dup 103 /g put +dup 104 /h put +dup 108 /l put +dup 110 /n put +dup 116 /t put +dup 117 /u put +dup 118 /v put +readonly def +/FontBBox{-33 -250 945 749}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F075EA0A10A15B0ED05D5039DA41B32B16E95 +A3CE9725A429B35BAD796912FC328E3A28F96FCADA20A598E247755E7E7FF801 +BDB00E9B9B086BDBE6EDCF841A3EAFC6F5284FED3C634085BA4EE0FC6A026E96 +96D55575481B007BF93CA452EE3F71D83FAAB3D9DEDD2A8F96C5840EAE5BE5DC +9322E81DFF5E250DEB386E12A49FC9FBF9B4C25C3283F3CEA74B8278A1B09DA7 +E9AE4FBAAF23EDF5A3E07D39385D521547C3AAAB8EB70549756EBA8EF445AF4A +497CA924ACCC3DD5456F8E2C7E36946A5BF14E2E959895F7C94F49137256BE46 +4A238684D52792234869EAE1A6D8ADF4E138B79472D2A90A6CA99E2394CC20CD +3841733046175B20CEBE372327BF13428EED6A3E2FDF84C2DBA4B0AD584EE9DF +B51828D3B8F385846158C29C9AC3496CB9692DD10219697B2ED4D425C3957FD8 +C4600D76E045C561216EF05D38177243C314877A69A1C22E3BEC611A2EE5A216 +9B7C264CF6D1839DBBD78A40610F2C0D7C2FE09FFA9822FF55035AD52546970F +83EED2D30EABB1F303091EBC11A5379B12BB3F405E371519A53EA9D66174ED25 +A2E55463EC71A97BE4C04B39E68112956117C8252DB6FB14AB64534B4BCD568B +246DB833982B38CDE7268BBF74B6B0C18091E1B1F87D32D66F4DD023D1F10D2A +7736A960F72AC01F733A11023832CD68FB6288A5977743F781214D8FA9C0C3F7 +80001321D4397771F728FD9EE57CFE7D9192B887EC883EB1505068261DC40089 +7B7D2820F06515CD74513521F6397FEAB3AD3572D9A8269430E407E357422461 +1785FC2782047F4C0339D79B16862D939F3A37F78E4E2174E4FBF132539CB760 +207999FF86F6A3EBE48EB0A1CA635450FDEEF79EB16D853F3BF4B41EB1D90E43 +A8FD2EBD81EB1980071C0B0A0CAC92CECBDE786EFEB0404681B6B1722AF5029C +D444FDDC58CE124D4185D506943E567493A3A0A084B4F2019BA0265DC8D58D98 +F6BD86EBC5E8A8778E794ABADD95CEB2C86C6295F394231344DD4B6B1CD685B7 +982BAFB830C4A9BCF5AA87457E03B147D37ADC5CCD40D023EC8393AB7857B781 +008C88F60EE14849E8ED5A13FAB600B77E35D20E9660AB002DFBD4681148F094 +B5339B78CCAD5FA28FB9F87318CF0E70CE350C433C09EE0D0AC9B2089BEBF0D2 +A73BE0AC58A23EA72DB9ABF975CA85595D3561EB058AAD18CD6BE66E503BAA9B +BC24671D3C7F0A73C7DBB2ABF9008E0F18D92E6985C1ECADA59583285B55DD62 +70E9652B675122483EEAF348F57738023F047213AEFCB50B2871F99736BCD3D7 +789F532BA67BF8A8D8F226F2E6C2B38966CDE17DF1494890881CF9E37A997F79 +A92BE1D799C342DC8D9AF2E4A07FDF853B3DB6F17140DBCEE31D3C0AFC9466FA +2AE4C920F9E4BA6831E87998FC54017619C9E16CB059ED70E4D6873EC1241CD7 +0DB8F5E915310E54B34D4720096EE6EC85800E7112E8AEA2D7B6D3D162882965 +D7D4BD396E200477FB6DC9C4FFE8B7B0E6CF5FDE279D674CF6A536D85A4E5D6D +0FD03582DEBE0C523E315D6D86A2987082ADB0E6E0B7086958D2F56C95556124 +B1DDB34B93232084217E7AD16D70861FE2A9AD0FE364C300B6B9F50320EF290D +8C8206D9A05689292E5C6C64CEC28057EE25DEA7E81343FDF4F023ABFA7F7743 +C32F0E53635ABD33C8159CE0171FA387B3B9C50AE8A28E76CA5CDCA80C6E9598 +1CD9B38E3C2F4F6111382EE57B9A6554EF6B21BEE8855BB7D9135D753CBF4B0B +8A21E64F4A189878D23CE590D55D07929157DA7B8F5D8F9BC99DFBC21890249E +ED21270F211C6143D424B4938B9FB0689A300DF2AD01AFDF33A572840A59F4F0 +69816841EE22AB82A1CA68CB0ED53D31C4CE5B34A43C9E8232CF00D598433D93 +DD89C07D905B55B876E3975C5FAF855F57AB5A6EBE2E15E45C0BC1ADB67978FD +2ED7826F3EE28BA747EBBC71DE1BE13CC00E0F2A2800D85427DCE1708E44EC05 +261614FE3CBA06AD36C9789EB8A837C383600AE9311ACBC20A43161D60C3B220 +05663FF1C41B7C45BEDD5C16D0FB26D22EE550B974BFE0A2DDD45517BC655A26 +E14292931F6425F1A2ADDBCDD09C9E7DAC7D1F6DFC26368040F38535A132D5D0 +AAAD6B6ADCE08427B9B29E9D5DD01A75DBED44184AA5F8FE86FD079472E737C3 +90F809168B60BBF213EA910B9F33D7440C3B85EA22F5D13FC7932D85345AB8C8 +C21932169D2F28FA643FBDE7646717424C33901BFC9670F7D883E1BEDCB70FFC +D53106622721088485553197B26A46F25126361D9FB44B4209E0ACF81EF449DF +04415091745ACB67D636A9469DAF476335B6B461DBDB956151A79C6951E88803 +E5B0C41512CBAF8279F07B03AB2F13537BD67CF84C5D35565F445F1864F595E3 +262F2831203EFCE1E0BBCCF47DF3B0BA52731154C3F9A86BBDA66E33558BBBBC +AB3550E4EC4FA0101D540AD666BF02801C89967DC2D1A4151CCE4E788A917073 +30A3544C46840C5CDA08B11CD6AFABD1D585A51FFDB732DAEC994210C8977E92 +5C3D030B2A8D2B604A5A1E86C423992291B926A8052E6B45D0D6D6C3E4A61760 +1305C73527F4C0B7688AC7ABFF9D39BF45E3B8AE914198E3C5B2852637D0FE8B +2006C03BA269E4C2333DDA544A55B6D053B6F36D6E670218911EC545D98B0F04 +4855100995097717C534C492761F19C29244A9CB4B9C0FCD626BD51822267A9F +DC276A7035FB0A79901C3343E31E68D806997A458F7097DA4B2DB3368E0E0BF1 +38BB71BB63326D31321A5A788C0C13523613FC367F06E8756BFC3C98FADC4BA7 +D70AD79ED0492158447D39F5A8C9AEBA9E32224B52865AACEFD8A2D0E4ED8B10 +3AEA25CB96FCC21C0C26495B4FE74CE9742B0C3C3852E06FA372516BDC78311D +62BDDAD0C5CEA4AAA66518CB651B474B62EB9141D118973803C58010C0755BC8 +4EAB5F6493F3229F05E74B971B225CC89B245589A11C20A7C1A4729B98B061F4 +0EA91890E0C79D17BA0AC8081063D016B30C13D147E10BCDEC29156150EA9B1D +76D198DF23D6FDABBDF5FC4CEF2D26551168A43331E19F2E9FA6C94908C966A0 +1F729D025DFF34E866D50F9CA16E2A2202A74EB7C743D54E4D3344A93FDE2D12 +2AFF6D9A813282A06B982E35B98B4AFD27127BEB8F29CBC7F353491CA19346EE +54952F34B1F97B63BECBF82BE57EB83ED978D2D063B61D1902836EFFB9F3F259 +217574C753403D7A329ABC5902F04E4C7549E0F8AF50B1FDCB48C5801B279C36 +07135A3219151BD1FA92F7F05610D2A29CB5373B3C544EE47717934E88C8D04D +09309A858048EE7184FB0480B5A237DFB9C65FEA4840957E4123F2578328819C +51B3270783025D333AA734B6556D3B2B223F188E31FEE1B1DC17F6FBEBB740AF +BB18D28394E4FC8F3BF9C820C26C62B646743025284E523A1A9971218EA9D72F +0BDC7628FAA9AC8E0F042169E60B23DEE3BFBB22E37B12884D3FC75A174645E6 +131ED84129CB8D677448F18B7294EB542D79071703DC4AA175A640AC566D9486 +3FA715219CC60F45ED20F9B182547635870150FB1FB1C03EE53FAFFAD8D3F1A6 +15DCA958A7DB6B6EA8B42D4F7D428E288DA95423497B48C44AD335A862F5583F +1880B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +TeXDict begin 39139632 55387786 1000 600 600 (DocJavalette.dvi) +@start /Fa 135[52 57[71 1[71 44[37 15[{}4 90.9091 /CMMI10 +rf /Fb 136[48 48 48 48 48 48 2[48 48 1[48 2[48 48 1[48 +48 48 1[48 48 4[48 32[48 11[48 2[48 1[48 48 48 48 48 +48 1[48 48 48 33[{}29 90.9091 /CMTT10 rf /Fc 134[48 48 +2[51 35 36 36 1[51 45 51 76 25 48 1[25 1[45 28 40 51 +40 51 45 12[66 51 67 1[62 71 1[83 57 2[33 3[62 69 1[64 +68 10[45 45 45 45 45 45 49[{}38 90.9091 /CMSL10 rf /Fd +149[25 35 35 45 45 101[71{}6 90.9091 /CMSY10 rf /Fe 134[59 +1[81 59 1[44 44 46 2[56 62 93 31 2[31 3[51 62 1[62 54 +14[84 5[67 2[42 5[81 54[62 12[{}20 99.6264 /CMBX12 rf +/Ff 134[71 71 1[71 75 52 53 55 2[67 75 1[37 2[37 75 1[41 +61 1[60 1[65 12[94 9[69 74[{}18 119.552 /CMBX12 rf /Fg +137[42 1[30 1[38 2[46 51 8[42 4[28 17[68 7[59 2[65 64 +19[28 33 5[28 39[{}14 90.9091 /CMTI10 rf /Fh 134[48 48 +66 48 51 35 36 36 48 51 45 51 76 25 48 1[25 51 45 28 +40 51 40 51 45 12[66 51 4[68 83 2[47 33 68 1[59 1[69 +66 64 68 1[43 1[71 2[25 5[45 45 45 45 2[25 30 25 71 1[35 +35 26[51 51 53 11[{}52 90.9091 /CMR10 rf /Fi 137[51 1[38 +1[38 1[54 49 54 1[27 2[27 3[43 1[43 20[73 7[64 3[69 73 +7[49 6[49 49 49 2[33 27 44[{}20 99.6264 /CMR12 rf /Fj +137[70 73 51 5[73 1[36 3[73 66 1[58 3[66 12[96 7[83 1[68 +74[{}12 143.462 /CMR17 rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%PaperSize: A4 + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 1188 912 a Fj(The)44 b(Language)f(Ja)l(v)-7 +b(alette)1561 1189 y Fi(BNF-con)m(v)m(erter)1574 1416 +y(April)33 b(19,)f(2011)382 1764 y Fh(This)c(do)s(cumen)m(t)h(w)m(as)h +(automatically)i(generated)e(b)m(y)f(the)g Fg(BNF-Converter)p +Fh(.)41 b(It)29 b(w)m(as)382 1877 y(generated)f(together)h(with)e(the)h +(lexer,)h(the)e(parser,)h(and)e(the)i(abstract)g(syn)m(tax)g(mo)s(d-) +382 1990 y(ule,)i(whic)m(h)g(guaran)m(tees)i(that)e(the)h(do)s(cumen)m +(t)f(matc)m(hes)h(with)f(the)g(implemen)m(tation)382 +2103 y(of)g(the)h(language)h(\(pro)m(vided)e(no)g(hand-hac)m(king)h +(has)f(tak)m(en)i(place\).)382 2409 y Ff(The)44 b(lexical)j(structure)e +(of)g(Ja)l(v)-7 b(alette)382 2639 y Fe(Iden)m(ti\014ers)382 +2834 y Fh(Iden)m(ti\014ers)28 b Fd(h)p Fc(Iden)m(t)15 +b Fd(i)29 b Fh(are)f(unquoted)g(strings)g(b)s(eginning)f(with)h(a)h +(letter,)h(follo)m(w)m(ed)g(b)m(y)382 2947 y(an)m(y)38 +b(com)m(bination)i(of)e(letters,)j(digits,)g(and)c(the)i(c)m(haracters) +p 2589 2947 29 4 v 121 w Fb(')p Fh(,)h(reserv)m(ed)e(w)m(ords)382 +3060 y(excluded.)382 3324 y Fe(Literals)382 3519 y Fh(In)m(teger)31 +b(literals)h Fd(h)p Fc(In)m(t)16 b Fd(i)30 b Fh(are)h(nonempt)m(y)f +(sequences)h(of)f(digits.)382 3655 y(Double-precision)g(\015oat)g +(literals)h Fd(h)p Fc(Double)16 b Fd(i)30 b Fh(ha)m(v)m(e)h(the)e +(structure)g(indicated)h(b)m(y)f(the)382 3768 y(regular)h(expression)f +Fd(h)p Fc(digit)16 b Fd(i)j Fh(+)f Fg(`.')p Fd(h)p Fc(digit)e +Fd(i)j Fh(+)g(\()p Fg(`e')o(`-')p Fh(?)p Fd(h)p Fc(digit)d +Fd(i)p Fh(+\)?)30 b(i.e.)g(t)m(w)m(o)h(sequences)382 +3881 y(of)k(digits)g(separated)h(b)m(y)e(a)i(decimal)f(p)s(oin)m(t,)i +(optionally)f(follo)m(w)m(ed)g(b)m(y)f(an)g(unsigned)382 +3994 y(or)30 b(negativ)m(e)j(exp)s(onen)m(t.)382 4131 +y(String)g(literals)i Fd(h)p Fc(String)15 b Fd(i)34 b +Fh(ha)m(v)m(e)h(the)f(form)g Fb(")o Fa(x)p Fb(")p Fh(,)h(where)e +Fa(x)g Fh(is)h(an)m(y)g(sequence)g(of)g(an)m(y)382 4243 +y(c)m(haracters)e(except)f Fb(")f Fh(unless)g(preceded)g(b)m(y)g +Fb(\\)p Fh(.)382 4507 y Fe(Reserv)m(ed)38 b(w)m(ords)f(and)h(sym)m(b)s +(ols)382 4702 y Fh(The)28 b(set)h(of)g(reserv)m(ed)g(w)m(ords)g(is)f +(the)h(set)h(of)e(terminals)i(app)s(earing)e(in)g(the)h(grammar.)382 +4815 y(Those)36 b(reserv)m(ed)f(w)m(ords)h(that)g(consist)h(of)e +(non-letter)i(c)m(haracters)h(are)e(called)h(sym-)382 +4928 y(b)s(ols,)32 b(and)f(they)h(are)g(treated)h(in)f(a)g(di\013eren)m +(t)g(w)m(a)m(y)h(from)f(those)g(that)g(are)h(similar)f(to)382 +5041 y(iden)m(ti\014ers.)52 b(The)34 b(lexer)h(follo)m(ws)h(rules)d +(familiar)i(from)f(languages)i(lik)m(e)f(Hask)m(ell,)j(C,)382 +5154 y(and)30 b(Ja)m(v)-5 b(a,)31 b(including)f(longest)i(matc)m(h)f +(and)f(spacing)h(con)m(v)m(en)m(tions.)382 5290 y(The)f(reserv)m(ed)g +(w)m(ords)g(used)g(in)g(Ja)m(v)-5 b(alette)33 b(are)e(the)f(follo)m +(wing:)1854 5652 y(1)p eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 432 536 a Fb(boolean)97 b(double)h(else)432 +649 y(false)193 b(if)290 b(int)432 761 y(return)145 b(true)194 +b(void)432 874 y(while)382 1053 y Fh(The)30 b(sym)m(b)s(ols)g(used)f +(in)h(Ja)m(v)-5 b(alette)33 b(are)e(the)g(follo)m(wing:)432 +1277 y Fb(\()193 b(\))g(,)432 1390 y Fd(f)j(g)g Fb(;)432 +1503 y Fh(=)170 b(++)99 b Fd(\000\000)432 1616 y(\000)170 +b Fb(!)193 b(&&)432 1729 y Fd(jj)e Fa(<)170 b(>)432 1842 +y Fh(+)g Fb(*)193 b(/)432 1954 y(\045)g Fa(<)p Fh(=)99 +b Fa(>)p Fh(=)432 2067 y(==)g Fb(!)p Fh(=)382 2377 y +Fe(Commen)m(ts)382 2572 y Fh(Single-line)31 b(commen)m(ts)h(b)s(egin)e +(with)g Fb(#)o Fh(,)h Fb(//)o Fh(.)382 2685 y(Multiple-line)h(commen)m +(ts)f(are)g(enclosed)g(with)f Fb(/*)g Fh(and)g Fb(*/)o +Fh(.)382 2995 y Ff(The)44 b(syn)l(tactic)i(structure)f(of)g(Ja)l(v)-7 +b(alette)382 3221 y Fh(Non-terminals)29 b(are)f(enclosed)g(b)s(et)m(w)m +(een)h Fd(h)f Fh(and)f Fd(i)p Fh(.)40 b(The)27 b(sym)m(b)s(ols)h(::=)g +(\(pro)s(duction\),)382 3334 y Fd(j)f Fh(\(union\))f(and)g +Fa(\017)g Fh(\(empt)m(y)i(rule\))e(b)s(elong)h(to)g(the)g(BNF)g +(notation.)41 b(All)27 b(other)g(sym)m(b)s(ols)382 3447 +y(are)k(terminals.)432 3697 y Fd(h)p Fc(Program)15 b +Fd(i)100 b Fh(::=)g Fd(h)p Fc(ListT)-8 b(opDef)17 b Fd(i)432 +3946 y(h)p Fc(T)-8 b(opDef)16 b Fd(i)100 b Fh(::=)g Fd(h)p +Fc(T)m(yp)s(e)15 b Fd(i)30 b(h)p Fc(Iden)m(t)16 b Fd(i)31 +b Fb(\()f Fd(h)p Fc(ListArg)16 b Fd(i)30 b Fb(\))g Fd(h)p +Fc(Blo)s(c)m(k)17 b Fd(i)432 4170 y(h)p Fc(ListT)-8 b(opDef)16 +b Fd(i)100 b Fh(::=)g Fd(h)p Fc(T)-8 b(opDef)16 b Fd(i)1062 +4283 y(j)196 b(h)p Fc(T)-8 b(opDef)16 b Fd(i)31 b(h)p +Fc(ListT)-8 b(opDef)16 b Fd(i)432 4476 y(h)p Fc(Arg)f +Fd(i)100 b Fh(::=)g Fd(h)p Fc(T)m(yp)s(e)15 b Fd(i)31 +b(h)p Fc(Iden)m(t)16 b Fd(i)432 4700 y(h)p Fc(ListArg)g +Fd(i)100 b Fh(::=)g Fa(\017)920 4813 y Fd(j)196 b(h)p +Fc(Arg)15 b Fd(i)920 4926 y(j)196 b(h)p Fc(Arg)15 b Fd(i)31 +b Fb(,)f Fd(h)p Fc(ListArg)16 b Fd(i)432 5104 y(h)p Fc(Blo)s(c)m(k)h +Fd(i)100 b Fh(::=)g Fd(f)30 b(h)p Fc(ListStm)m(t)17 b +Fd(i)30 b(g)1854 5652 y Fh(2)p eop end +%%Page: 3 3 +TeXDict begin 3 2 bop 432 536 a Fd(h)p Fc(ListStm)m(t)16 +b Fd(i)100 b Fh(::=)g Fa(\017)965 649 y Fd(j)196 b(h)p +Fc(Stm)m(t)16 b Fd(i)30 b(h)p Fc(ListStm)m(t)17 b Fd(i)432 +816 y(h)p Fc(Stm)m(t)f Fd(i)100 b Fh(::=)f Fb(;)812 929 +y Fd(j)195 b(h)p Fc(Blo)s(c)m(k)17 b Fd(i)812 1042 y(j)195 +b(h)p Fc(T)m(yp)s(e)16 b Fd(i)30 b(h)p Fc(ListItem)16 +b Fd(i)31 b Fb(;)812 1155 y Fd(j)195 b(h)p Fc(Iden)m(t)16 +b Fd(i)31 b Fh(=)f Fd(h)p Fc(Expr)14 b Fd(i)31 b Fb(;)812 +1268 y Fd(j)195 b(h)p Fc(Iden)m(t)16 b Fd(i)31 b Fh(++)e +Fb(;)812 1381 y Fd(j)195 b(h)p Fc(Iden)m(t)16 b Fd(i)31 +b(\000\000)e Fb(;)812 1494 y Fd(j)195 b Fb(return)29 +b Fd(h)p Fc(Expr)15 b Fd(i)30 b Fb(;)812 1606 y Fd(j)195 +b Fb(return)29 b(;)812 1719 y Fd(j)195 b Fb(if)30 b(\()g +Fd(h)p Fc(Expr)15 b Fd(i)30 b Fb(\))g Fd(h)p Fc(Stm)m(t)16 +b Fd(i)812 1832 y(j)195 b Fb(if)30 b(\()g Fd(h)p Fc(Expr)15 +b Fd(i)30 b Fb(\))g Fd(h)p Fc(Stm)m(t)16 b Fd(i)31 b +Fb(else)e Fd(h)p Fc(Stm)m(t)16 b Fd(i)812 1945 y(j)195 +b Fb(while)29 b(\()h Fd(h)p Fc(Expr)15 b Fd(i)31 b Fb(\))f +Fd(h)p Fc(Stm)m(t)16 b Fd(i)812 2058 y(j)195 b(h)p Fc(Expr)15 +b Fd(i)31 b Fb(;)432 2211 y Fd(h)p Fc(Item)16 b Fd(i)100 +b Fh(::=)f Fd(h)p Fc(Iden)m(t)16 b Fd(i)802 2324 y(j)195 +b(h)p Fc(Iden)m(t)16 b Fd(i)31 b Fh(=)f Fd(h)p Fc(Expr)14 +b Fd(i)432 2492 y(h)p Fc(ListItem)i Fd(i)100 b Fh(::=)g +Fd(h)p Fc(Item)16 b Fd(i)955 2605 y(j)196 b(h)p Fc(Item)16 +b Fd(i)30 b Fb(,)g Fd(h)p Fc(ListItem)16 b Fd(i)432 2772 +y(h)p Fc(T)m(yp)s(e)f Fd(i)100 b Fh(::=)g Fb(int)822 +2885 y Fd(j)196 b Fb(double)822 2998 y Fd(j)g Fb(boolean)822 +3111 y Fd(j)g Fb(void)432 3264 y Fd(h)p Fc(ListT)m(yp)s(e)15 +b Fd(i)100 b Fh(::=)g Fa(\017)975 3377 y Fd(j)196 b(h)p +Fc(T)m(yp)s(e)15 b Fd(i)975 3490 y(j)196 b(h)p Fc(T)m(yp)s(e)15 +b Fd(i)31 b Fb(,)f Fd(h)p Fc(ListT)m(yp)s(e)15 b Fd(i)432 +3643 y(h)p Fc(Expr6)g Fd(i)100 b Fh(::=)f Fd(h)p Fc(Iden)m(t)16 +b Fd(i)859 3756 y(j)195 b(h)p Fc(In)m(teger)17 b Fd(i)859 +3869 y(j)195 b(h)p Fc(Double)17 b Fd(i)859 3982 y(j)195 +b Fb(true)859 4095 y Fd(j)g Fb(false)859 4208 y Fd(j)g(h)p +Fc(Iden)m(t)16 b Fd(i)31 b Fb(\()f Fd(h)p Fc(ListExpr)14 +b Fd(i)31 b Fb(\))859 4320 y Fd(j)195 b(h)p Fc(String)16 +b Fd(i)859 4433 y(j)195 b Fb(\()30 b Fd(h)p Fc(Expr)15 +b Fd(i)31 b Fb(\))432 4587 y Fd(h)p Fc(Expr5)15 b Fd(i)100 +b Fh(::=)f Fd(\000)30 b(h)p Fc(Expr6)15 b Fd(i)859 4699 +y(j)195 b Fb(!)30 b Fd(h)p Fc(Expr6)15 b Fd(i)859 4812 +y(j)195 b(h)p Fc(Expr6)15 b Fd(i)432 4965 y(h)p Fc(Expr4)g +Fd(i)100 b Fh(::=)f Fd(h)p Fc(Expr4)15 b Fd(i)31 b(h)p +Fc(MulOp)15 b Fd(i)30 b(h)p Fc(Expr5)15 b Fd(i)859 5078 +y(j)195 b(h)p Fc(Expr5)15 b Fd(i)1854 5652 y Fh(3)p eop +end +%%Page: 4 4 +TeXDict begin 4 3 bop 432 536 a Fd(h)p Fc(Expr3)15 b +Fd(i)100 b Fh(::=)f Fd(h)p Fc(Expr3)15 b Fd(i)31 b(h)p +Fc(AddOp)14 b Fd(i)31 b(h)p Fc(Expr4)15 b Fd(i)859 649 +y(j)195 b(h)p Fc(Expr4)15 b Fd(i)432 816 y(h)p Fc(Expr2)g +Fd(i)100 b Fh(::=)f Fd(h)p Fc(Expr2)15 b Fd(i)31 b(h)p +Fc(RelOp)15 b Fd(i)31 b(h)p Fc(Expr3)15 b Fd(i)859 929 +y(j)195 b(h)p Fc(Expr3)15 b Fd(i)432 1097 y(h)p Fc(Expr1)g +Fd(i)100 b Fh(::=)f Fd(h)p Fc(Expr2)15 b Fd(i)31 b Fb(&&)f +Fd(h)p Fc(Expr1)15 b Fd(i)859 1210 y(j)195 b(h)p Fc(Expr2)15 +b Fd(i)432 1377 y(h)p Fc(Expr)f Fd(i)100 b Fh(::=)g Fd(h)p +Fc(Expr1)15 b Fd(i)31 b(jj)f(h)p Fc(Expr)15 b Fd(i)813 +1490 y(j)196 b(h)p Fc(Expr1)15 b Fd(i)432 1658 y(h)p +Fc(ListExpr)f Fd(i)100 b Fh(::=)g Fa(\017)966 1770 y +Fd(j)196 b(h)p Fc(Expr)15 b Fd(i)966 1883 y(j)196 b(h)p +Fc(Expr)15 b Fd(i)30 b Fb(,)g Fd(h)p Fc(ListExpr)15 b +Fd(i)432 2036 y(h)p Fc(AddOp)f Fd(i)100 b Fh(::=)f(+)908 +2149 y Fd(j)195 b(\000)432 2317 y(h)p Fc(MulOp)15 b Fd(i)100 +b Fh(::=)f Fb(*)898 2430 y Fd(j)195 b Fb(/)898 2543 y +Fd(j)g Fb(\045)432 2696 y Fd(h)p Fc(RelOp)15 b Fd(i)100 +b Fh(::=)g Fa(<)871 2809 y Fd(j)196 b Fa(<)p Fh(=)871 +2922 y Fd(j)g Fa(>)871 3035 y Fd(j)g Fa(>)p Fh(=)871 +3148 y Fd(j)g Fh(==)871 3260 y Fd(j)g Fb(!)p Fh(=)1854 +5652 y(4)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/DocJavalette.tex b/DocJavalette.tex new file mode 100644 index 0000000..23dd261 --- /dev/null +++ b/DocJavalette.tex @@ -0,0 +1,223 @@ +\batchmode +%This Latex file is machine-generated by the BNF-converter + +\documentclass[a4paper,11pt]{article} +\author{BNF-converter} +\title{The Language Javalette} +\setlength{\parindent}{0mm} +\setlength{\parskip}{1mm} +\begin{document} + +\maketitle + +\newcommand{\emptyP}{\mbox{$\epsilon$}} +\newcommand{\terminal}[1]{\mbox{{\texttt {#1}}}} +\newcommand{\nonterminal}[1]{\mbox{$\langle \mbox{{\sl #1 }} \! \rangle$}} +\newcommand{\arrow}{\mbox{::=}} +\newcommand{\delimit}{\mbox{$|$}} +\newcommand{\reserved}[1]{\mbox{{\texttt {#1}}}} +\newcommand{\literal}[1]{\mbox{{\texttt {#1}}}} +\newcommand{\symb}[1]{\mbox{{\texttt {#1}}}} + +This document was automatically generated by the {\em BNF-Converter}. It was generated together with the lexer, the parser, and the abstract syntax module, which guarantees that the document matches with the implementation of the language (provided no hand-hacking has taken place). + +\section*{The lexical structure of Javalette} +\subsection*{Identifiers} +Identifiers \nonterminal{Ident} are unquoted strings beginning with a letter, +followed by any combination of letters, digits, and the characters {\tt \_ '}, +reserved words excluded. + + +\subsection*{Literals} +Integer literals \nonterminal{Int}\ are nonempty sequences of digits. + + +Double-precision float literals \nonterminal{Double}\ have the structure +indicated by the regular expression $\nonterminal{digit}+ \mbox{{\it `.'}} \nonterminal{digit}+ (\mbox{{\it `e'}} \mbox{{\it `-'}}? \nonterminal{digit}+)?$ i.e.\ +two sequences of digits separated by a decimal point, optionally +followed by an unsigned or negative exponent. + + +String literals \nonterminal{String}\ have the form +\terminal{"}$x$\terminal{"}, where $x$ is any sequence of any characters +except \terminal{"}\ unless preceded by \verb6\6. + + + + +\subsection*{Reserved words and symbols} +The set of reserved words is the set of terminals appearing in the grammar. Those reserved words that consist of non-letter characters are called symbols, and they are treated in a different way from those that are similar to identifiers. The lexer follows rules familiar from languages like Haskell, C, and Java, including longest match and spacing conventions. + +The reserved words used in Javalette are the following: \\ + +\begin{tabular}{lll} +{\reserved{boolean}} &{\reserved{double}} &{\reserved{else}} \\ +{\reserved{false}} &{\reserved{if}} &{\reserved{int}} \\ +{\reserved{return}} &{\reserved{true}} &{\reserved{void}} \\ +{\reserved{while}} & & \\ +\end{tabular}\\ + +The symbols used in Javalette are the following: \\ + +\begin{tabular}{lll} +{\symb{(}} &{\symb{)}} &{\symb{,}} \\ +{\symb{\{}} &{\symb{\}}} &{\symb{;}} \\ +{\symb{{$=$}}} &{\symb{{$+$}{$+$}}} &{\symb{{$-$}{$-$}}} \\ +{\symb{{$-$}}} &{\symb{!}} &{\symb{\&\&}} \\ +{\symb{{$|$}{$|$}}} &{\symb{{$<$}}} &{\symb{{$>$}}} \\ +{\symb{{$+$}}} &{\symb{*}} &{\symb{/}} \\ +{\symb{\%}} &{\symb{{$<$}{$=$}}} &{\symb{{$>$}{$=$}}} \\ +{\symb{{$=$}{$=$}}} &{\symb{!{$=$}}} & \\ +\end{tabular}\\ + +\subsection*{Comments} +Single-line comments begin with {\symb{\#}}, {\symb{//}}. \\Multiple-line comments are enclosed with {\symb{/*}} and {\symb{*/}}. + +\section*{The syntactic structure of Javalette} +Non-terminals are enclosed between $\langle$ and $\rangle$. +The symbols {\arrow} (production), {\delimit} (union) +and {\emptyP} (empty rule) belong to the BNF notation. +All other symbols are terminals.\\ + +\begin{tabular}{lll} +{\nonterminal{Program}} & {\arrow} &{\nonterminal{ListTopDef}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{TopDef}} & {\arrow} &{\nonterminal{Type}} {\nonterminal{Ident}} {\terminal{(}} {\nonterminal{ListArg}} {\terminal{)}} {\nonterminal{Block}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListTopDef}} & {\arrow} &{\nonterminal{TopDef}} \\ + & {\delimit} &{\nonterminal{TopDef}} {\nonterminal{ListTopDef}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Arg}} & {\arrow} &{\nonterminal{Type}} {\nonterminal{Ident}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListArg}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Arg}} \\ + & {\delimit} &{\nonterminal{Arg}} {\terminal{,}} {\nonterminal{ListArg}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Block}} & {\arrow} &{\terminal{\{}} {\nonterminal{ListStmt}} {\terminal{\}}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListStmt}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Stmt}} {\nonterminal{ListStmt}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Stmt}} & {\arrow} &{\terminal{;}} \\ + & {\delimit} &{\nonterminal{Block}} \\ + & {\delimit} &{\nonterminal{Type}} {\nonterminal{ListItem}} {\terminal{;}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$=$}}} {\nonterminal{Expr}} {\terminal{;}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$+$}{$+$}}} {\terminal{;}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$-$}{$-$}}} {\terminal{;}} \\ + & {\delimit} &{\terminal{return}} {\nonterminal{Expr}} {\terminal{;}} \\ + & {\delimit} &{\terminal{return}} {\terminal{;}} \\ + & {\delimit} &{\terminal{if}} {\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} {\nonterminal{Stmt}} \\ + & {\delimit} &{\terminal{if}} {\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} {\nonterminal{Stmt}} {\terminal{else}} {\nonterminal{Stmt}} \\ + & {\delimit} &{\terminal{while}} {\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} {\nonterminal{Stmt}} \\ + & {\delimit} &{\nonterminal{Expr}} {\terminal{;}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Item}} & {\arrow} &{\nonterminal{Ident}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$=$}}} {\nonterminal{Expr}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListItem}} & {\arrow} &{\nonterminal{Item}} \\ + & {\delimit} &{\nonterminal{Item}} {\terminal{,}} {\nonterminal{ListItem}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Type}} & {\arrow} &{\terminal{int}} \\ + & {\delimit} &{\terminal{double}} \\ + & {\delimit} &{\terminal{boolean}} \\ + & {\delimit} &{\terminal{void}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListType}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Type}} \\ + & {\delimit} &{\nonterminal{Type}} {\terminal{,}} {\nonterminal{ListType}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr6}} & {\arrow} &{\nonterminal{Ident}} \\ + & {\delimit} &{\nonterminal{Integer}} \\ + & {\delimit} &{\nonterminal{Double}} \\ + & {\delimit} &{\terminal{true}} \\ + & {\delimit} &{\terminal{false}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{(}} {\nonterminal{ListExpr}} {\terminal{)}} \\ + & {\delimit} &{\nonterminal{String}} \\ + & {\delimit} &{\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr5}} & {\arrow} &{\terminal{{$-$}}} {\nonterminal{Expr6}} \\ + & {\delimit} &{\terminal{!}} {\nonterminal{Expr6}} \\ + & {\delimit} &{\nonterminal{Expr6}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr4}} & {\arrow} &{\nonterminal{Expr4}} {\nonterminal{MulOp}} {\nonterminal{Expr5}} \\ + & {\delimit} &{\nonterminal{Expr5}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr3}} & {\arrow} &{\nonterminal{Expr3}} {\nonterminal{AddOp}} {\nonterminal{Expr4}} \\ + & {\delimit} &{\nonterminal{Expr4}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr2}} & {\arrow} &{\nonterminal{Expr2}} {\nonterminal{RelOp}} {\nonterminal{Expr3}} \\ + & {\delimit} &{\nonterminal{Expr3}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr1}} & {\arrow} &{\nonterminal{Expr2}} {\terminal{\&\&}} {\nonterminal{Expr1}} \\ + & {\delimit} &{\nonterminal{Expr2}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr}} & {\arrow} &{\nonterminal{Expr1}} {\terminal{{$|$}{$|$}}} {\nonterminal{Expr}} \\ + & {\delimit} &{\nonterminal{Expr1}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListExpr}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Expr}} \\ + & {\delimit} &{\nonterminal{Expr}} {\terminal{,}} {\nonterminal{ListExpr}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{AddOp}} & {\arrow} &{\terminal{{$+$}}} \\ + & {\delimit} &{\terminal{{$-$}}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{MulOp}} & {\arrow} &{\terminal{*}} \\ + & {\delimit} &{\terminal{/}} \\ + & {\delimit} &{\terminal{\%}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{RelOp}} & {\arrow} &{\terminal{{$<$}}} \\ + & {\delimit} &{\terminal{{$<$}{$=$}}} \\ + & {\delimit} &{\terminal{{$>$}}} \\ + & {\delimit} &{\terminal{{$>$}{$=$}}} \\ + & {\delimit} &{\terminal{{$=$}{$=$}}} \\ + & {\delimit} &{\terminal{!{$=$}}} \\ +\end{tabular}\\ + + + +\end{document} + diff --git a/DocJavalette.tex.bak b/DocJavalette.tex.bak new file mode 100644 index 0000000..a1f39c8 --- /dev/null +++ b/DocJavalette.tex.bak @@ -0,0 +1,223 @@ +\batchmode +%This Latex file is machine-generated by the BNF-converter + +\documentclass[a4paper,11pt]{article} +\author{BNF-converter} +\title{The Language Javalette} +\setlength{\parindent}{0mm} +\setlength{\parskip}{1mm} +\begin{document} + +\maketitle + +\newcommand{\emptyP}{\mbox{$\epsilon$}} +\newcommand{\terminal}[1]{\mbox{{\texttt {#1}}}} +\newcommand{\nonterminal}[1]{\mbox{$\langle \mbox{{\sl #1 }} \! \rangle$}} +\newcommand{\arrow}{\mbox{::=}} +\newcommand{\delimit}{\mbox{$|$}} +\newcommand{\reserved}[1]{\mbox{{\texttt {#1}}}} +\newcommand{\literal}[1]{\mbox{{\texttt {#1}}}} +\newcommand{\symb}[1]{\mbox{{\texttt {#1}}}} + +This document was automatically generated by the {\em BNF-Converter}. It was generated together with the lexer, the parser, and the abstract syntax module, which guarantees that the document matches with the implementation of the language (provided no hand-hacking has taken place). + +\section*{The lexical structure of Javalette} +\subsection*{Identifiers} +Identifiers \nonterminal{Ident} are unquoted strings beginning with a letter, +followed by any combination of letters, digits, and the characters {\tt \_ '}, +reserved words excluded. + + +\subsection*{Literals} +Integer literals \nonterminal{Int}\ are nonempty sequences of digits. + + +Double-precision float literals \nonterminal{Double}\ have the structure +indicated by the regular expression $\nonterminal{digit}+ \mbox{{\it `.'}} \nonterminal{digit}+ (\mbox{{\it `e'}} \mbox{{\it `-'}}? \nonterminal{digit}+)?$ i.e.\ +two sequences of digits separated by a decimal point, optionally +followed by an unsigned or negative exponent. + + +String literals \nonterminal{String}\ have the form +\terminal{"}$x$\terminal{"}, where $x$ is any sequence of any characters +except \terminal{"}\ unless preceded by \verb6\6. + + + + +\subsection*{Reserved words and symbols} +The set of reserved words is the set of terminals appearing in the grammar. Those reserved words that consist of non-letter characters are called symbols, and they are treated in a different way from those that are similar to identifiers. The lexer follows rules familiar from languages like Haskell, C, and Java, including longest match and spacing conventions. + +The reserved words used in Javalette are the following: \\ + +\begin{tabular}{lll} +{\reserved{boolean}} &{\reserved{double}} &{\reserved{else}} \\ +{\reserved{false}} &{\reserved{if}} &{\reserved{int}} \\ +{\reserved{return}} &{\reserved{true}} &{\reserved{void}} \\ +{\reserved{while}} & & \\ +\end{tabular}\\ + +The symbols used in Javalette are the following: \\ + +\begin{tabular}{lll} +{\symb{(}} &{\symb{)}} &{\symb{,}} \\ +{\symb{\{}} &{\symb{\}}} &{\symb{;}} \\ +{\symb{{$=$}}} &{\symb{{$+$}{$+$}}} &{\symb{{$-$}{$-$}}} \\ +{\symb{{$-$}}} &{\symb{!}} &{\symb{\&\&}} \\ +{\symb{{$|$}{$|$}}} &{\symb{{$+$}}} &{\symb{*}} \\ +{\symb{/}} &{\symb{\%}} &{\symb{{$<$}}} \\ +{\symb{{$<$}{$=$}}} &{\symb{{$>$}}} &{\symb{{$>$}{$=$}}} \\ +{\symb{{$=$}{$=$}}} &{\symb{!{$=$}}} & \\ +\end{tabular}\\ + +\subsection*{Comments} +Single-line comments begin with {\symb{\#}}, {\symb{//}}. \\Multiple-line comments are enclosed with {\symb{/*}} and {\symb{*/}}. + +\section*{The syntactic structure of Javalette} +Non-terminals are enclosed between $\langle$ and $\rangle$. +The symbols {\arrow} (production), {\delimit} (union) +and {\emptyP} (empty rule) belong to the BNF notation. +All other symbols are terminals.\\ + +\begin{tabular}{lll} +{\nonterminal{Program}} & {\arrow} &{\nonterminal{ListTopDef}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{TopDef}} & {\arrow} &{\nonterminal{Type}} {\nonterminal{Ident}} {\terminal{(}} {\nonterminal{ListArg}} {\terminal{)}} {\nonterminal{Block}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListTopDef}} & {\arrow} &{\nonterminal{TopDef}} \\ + & {\delimit} &{\nonterminal{TopDef}} {\nonterminal{ListTopDef}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Arg}} & {\arrow} &{\nonterminal{Type}} {\nonterminal{Ident}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListArg}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Arg}} \\ + & {\delimit} &{\nonterminal{Arg}} {\terminal{,}} {\nonterminal{ListArg}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Block}} & {\arrow} &{\terminal{\{}} {\nonterminal{ListStmt}} {\terminal{\}}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListStmt}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Stmt}} {\nonterminal{ListStmt}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Stmt}} & {\arrow} &{\terminal{;}} \\ + & {\delimit} &{\nonterminal{Block}} \\ + & {\delimit} &{\nonterminal{Type}} {\nonterminal{ListItem}} {\terminal{;}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$=$}}} {\nonterminal{Expr}} {\terminal{;}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$+$}{$+$}}} {\terminal{;}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$-$}{$-$}}} {\terminal{;}} \\ + & {\delimit} &{\terminal{return}} {\nonterminal{Expr}} {\terminal{;}} \\ + & {\delimit} &{\terminal{return}} {\terminal{;}} \\ + & {\delimit} &{\terminal{if}} {\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} {\nonterminal{Stmt}} \\ + & {\delimit} &{\terminal{if}} {\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} {\nonterminal{Stmt}} {\terminal{else}} {\nonterminal{Stmt}} \\ + & {\delimit} &{\terminal{while}} {\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} {\nonterminal{Stmt}} \\ + & {\delimit} &{\nonterminal{Expr}} {\terminal{;}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Item}} & {\arrow} &{\nonterminal{Ident}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{{$=$}}} {\nonterminal{Expr}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListItem}} & {\arrow} &{\nonterminal{Item}} \\ + & {\delimit} &{\nonterminal{Item}} {\terminal{,}} {\nonterminal{ListItem}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Type}} & {\arrow} &{\terminal{int}} \\ + & {\delimit} &{\terminal{double}} \\ + & {\delimit} &{\terminal{boolean}} \\ + & {\delimit} &{\terminal{void}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListType}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Type}} \\ + & {\delimit} &{\nonterminal{Type}} {\terminal{,}} {\nonterminal{ListType}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr6}} & {\arrow} &{\nonterminal{Ident}} \\ + & {\delimit} &{\nonterminal{Integer}} \\ + & {\delimit} &{\nonterminal{Double}} \\ + & {\delimit} &{\terminal{true}} \\ + & {\delimit} &{\terminal{false}} \\ + & {\delimit} &{\nonterminal{Ident}} {\terminal{(}} {\nonterminal{ListExpr}} {\terminal{)}} \\ + & {\delimit} &{\nonterminal{String}} \\ + & {\delimit} &{\terminal{(}} {\nonterminal{Expr}} {\terminal{)}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr5}} & {\arrow} &{\terminal{{$-$}}} {\nonterminal{Expr6}} \\ + & {\delimit} &{\terminal{!}} {\nonterminal{Expr6}} \\ + & {\delimit} &{\nonterminal{Expr6}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr4}} & {\arrow} &{\nonterminal{Expr4}} {\nonterminal{MulOp}} {\nonterminal{Expr5}} \\ + & {\delimit} &{\nonterminal{Expr5}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr3}} & {\arrow} &{\nonterminal{Expr3}} {\nonterminal{AddOp}} {\nonterminal{Expr4}} \\ + & {\delimit} &{\nonterminal{Expr4}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr2}} & {\arrow} &{\nonterminal{Expr2}} {\nonterminal{RelOp}} {\nonterminal{Expr3}} \\ + & {\delimit} &{\nonterminal{Expr3}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr1}} & {\arrow} &{\nonterminal{Expr2}} {\terminal{\&\&}} {\nonterminal{Expr1}} \\ + & {\delimit} &{\nonterminal{Expr2}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{Expr}} & {\arrow} &{\nonterminal{Expr1}} {\terminal{{$|$}{$|$}}} {\nonterminal{Expr}} \\ + & {\delimit} &{\nonterminal{Expr1}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{ListExpr}} & {\arrow} &{\emptyP} \\ + & {\delimit} &{\nonterminal{Expr}} \\ + & {\delimit} &{\nonterminal{Expr}} {\terminal{,}} {\nonterminal{ListExpr}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{AddOp}} & {\arrow} &{\terminal{{$+$}}} \\ + & {\delimit} &{\terminal{{$-$}}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{MulOp}} & {\arrow} &{\terminal{*}} \\ + & {\delimit} &{\terminal{/}} \\ + & {\delimit} &{\terminal{\%}} \\ +\end{tabular}\\ + +\begin{tabular}{lll} +{\nonterminal{RelOp}} & {\arrow} &{\terminal{{$<$}}} \\ + & {\delimit} &{\terminal{{$<$}{$=$}}} \\ + & {\delimit} &{\terminal{{$>$}}} \\ + & {\delimit} &{\terminal{{$>$}{$=$}}} \\ + & {\delimit} &{\terminal{{$=$}{$=$}}} \\ + & {\delimit} &{\terminal{!{$=$}}} \\ +\end{tabular}\\ + + + +\end{document} + diff --git a/DocJavalette.txt b/DocJavalette.txt new file mode 100644 index 0000000..77090b3 --- /dev/null +++ b/DocJavalette.txt @@ -0,0 +1,131 @@ +The Language Javalette +BNF Converter + + +%This txt2tags file is machine-generated by the BNF-converter +%Process by txt2tags to generate html or latex + + + +This document was automatically generated by the //BNF-Converter//. It was generated together with the lexer, the parser, and the abstract syntax module, which guarantees that the document matches with the implementation of the language (provided no hand-hacking has taken place). + +==The lexical structure of Javalette== +===Identifiers=== +Identifiers //Ident// are unquoted strings beginning with a letter, +followed by any combination of letters, digits, and the characters ``_ '`` +reserved words excluded. + + +===Literals=== +Integer literals //Integer// are nonempty sequences of digits. + + +Double-precision float literals //Double// have the structure +indicated by the regular expression ``digit+ '.' digit+ ('e' ('-')? digit+)?`` i.e.\ +two sequences of digits separated by a decimal point, optionally +followed by an unsigned or negative exponent. + + +String literals //String// have the form +``"``//x//``"``}, where //x// is any sequence of any characters +except ``"`` unless preceded by ``\``. + + + + +===Reserved words and symbols=== +The set of reserved words is the set of terminals appearing in the grammar. Those reserved words that consist of non-letter characters are called symbols, and they are treated in a different way from those that are similar to identifiers. The lexer follows rules familiar from languages like Haskell, C, and Java, including longest match and spacing conventions. + +The reserved words used in Javalette are the following: + | ``boolean`` | ``double`` | ``else`` | ``false`` + | ``if`` | ``int`` | ``return`` | ``true`` + | ``void`` | ``while`` | | + +The symbols used in Javalette are the following: + | ( | ) | , | { + | } | ; | = | ++ + | -- | - | ! | && + | || | < | > | + + | * | / | % | <= + | >= | == | != | + +===Comments=== +Single-line comments begin with #, //.Multiple-line comments are enclosed with /* and */. + +==The syntactic structure of Javalette== +Non-terminals are enclosed between < and >. +The symbols -> (production), **|** (union) +and **eps** (empty rule) belong to the BNF notation. +All other symbols are terminals. + + | //Program// | -> | //[TopDef]// + | //TopDef// | -> | //Type// //Ident// ``(`` //[Arg]// ``)`` //Block// + | //[TopDef]// | -> | //TopDef// + | | **|** | //TopDef// //[TopDef]// + | //Arg// | -> | //Type// //Ident// + | //[Arg]// | -> | **eps** + | | **|** | //Arg// + | | **|** | //Arg// ``,`` //[Arg]// + | //Block// | -> | ``{`` //[Stmt]// ``}`` + | //[Stmt]// | -> | **eps** + | | **|** | //Stmt// //[Stmt]// + | //Stmt// | -> | ``;`` + | | **|** | //Block// + | | **|** | //Type// //[Item]// ``;`` + | | **|** | //Ident// ``=`` //Expr// ``;`` + | | **|** | //Ident// ``++`` ``;`` + | | **|** | //Ident// ``--`` ``;`` + | | **|** | ``return`` //Expr// ``;`` + | | **|** | ``return`` ``;`` + | | **|** | ``if`` ``(`` //Expr// ``)`` //Stmt// + | | **|** | ``if`` ``(`` //Expr// ``)`` //Stmt// ``else`` //Stmt// + | | **|** | ``while`` ``(`` //Expr// ``)`` //Stmt// + | | **|** | //Expr// ``;`` + | //Item// | -> | //Ident// + | | **|** | //Ident// ``=`` //Expr// + | //[Item]// | -> | //Item// + | | **|** | //Item// ``,`` //[Item]// + | //Type// | -> | ``int`` + | | **|** | ``double`` + | | **|** | ``boolean`` + | | **|** | ``void`` + | //[Type]// | -> | **eps** + | | **|** | //Type// + | | **|** | //Type// ``,`` //[Type]// + | //Expr6// | -> | //Ident// + | | **|** | //Integer// + | | **|** | //Double// + | | **|** | ``true`` + | | **|** | ``false`` + | | **|** | //Ident// ``(`` //[Expr]// ``)`` + | | **|** | //String// + | | **|** | ``(`` //Expr// ``)`` + | //Expr5// | -> | ``-`` //Expr6// + | | **|** | ``!`` //Expr6// + | | **|** | //Expr6// + | //Expr4// | -> | //Expr4// //MulOp// //Expr5// + | | **|** | //Expr5// + | //Expr3// | -> | //Expr3// //AddOp// //Expr4// + | | **|** | //Expr4// + | //Expr2// | -> | //Expr2// //RelOp// //Expr3// + | | **|** | //Expr3// + | //Expr1// | -> | //Expr2// ``&&`` //Expr1// + | | **|** | //Expr2// + | //Expr// | -> | //Expr1// ``||`` //Expr// + | | **|** | //Expr1// + | //[Expr]// | -> | **eps** + | | **|** | //Expr// + | | **|** | //Expr// ``,`` //[Expr]// + | //AddOp// | -> | ``+`` + | | **|** | ``-`` + | //MulOp// | -> | ``*`` + | | **|** | ``/`` + | | **|** | ``%`` + | //RelOp// | -> | ``<`` + | | **|** | ``<=`` + | | **|** | ``>`` + | | **|** | ``>=`` + | | **|** | ``==`` + | | **|** | ``!=`` + + diff --git a/DocJavalette.txt.bak b/DocJavalette.txt.bak new file mode 100644 index 0000000..9c1a249 --- /dev/null +++ b/DocJavalette.txt.bak @@ -0,0 +1,131 @@ +The Language Javalette +BNF Converter + + +%This txt2tags file is machine-generated by the BNF-converter +%Process by txt2tags to generate html or latex + + + +This document was automatically generated by the //BNF-Converter//. It was generated together with the lexer, the parser, and the abstract syntax module, which guarantees that the document matches with the implementation of the language (provided no hand-hacking has taken place). + +==The lexical structure of Javalette== +===Identifiers=== +Identifiers //Ident// are unquoted strings beginning with a letter, +followed by any combination of letters, digits, and the characters ``_ '`` +reserved words excluded. + + +===Literals=== +Integer literals //Integer// are nonempty sequences of digits. + + +Double-precision float literals //Double// have the structure +indicated by the regular expression ``digit+ '.' digit+ ('e' ('-')? digit+)?`` i.e.\ +two sequences of digits separated by a decimal point, optionally +followed by an unsigned or negative exponent. + + +String literals //String// have the form +``"``//x//``"``}, where //x// is any sequence of any characters +except ``"`` unless preceded by ``\``. + + + + +===Reserved words and symbols=== +The set of reserved words is the set of terminals appearing in the grammar. Those reserved words that consist of non-letter characters are called symbols, and they are treated in a different way from those that are similar to identifiers. The lexer follows rules familiar from languages like Haskell, C, and Java, including longest match and spacing conventions. + +The reserved words used in Javalette are the following: + | ``boolean`` | ``double`` | ``else`` | ``false`` + | ``if`` | ``int`` | ``return`` | ``true`` + | ``void`` | ``while`` | | + +The symbols used in Javalette are the following: + | ( | ) | , | { + | } | ; | = | ++ + | -- | - | ! | && + | || | + | * | / + | % | < | <= | > + | >= | == | != | + +===Comments=== +Single-line comments begin with #, //.Multiple-line comments are enclosed with /* and */. + +==The syntactic structure of Javalette== +Non-terminals are enclosed between < and >. +The symbols -> (production), **|** (union) +and **eps** (empty rule) belong to the BNF notation. +All other symbols are terminals. + + | //Program// | -> | //[TopDef]// + | //TopDef// | -> | //Type// //Ident// ``(`` //[Arg]// ``)`` //Block// + | //[TopDef]// | -> | //TopDef// + | | **|** | //TopDef// //[TopDef]// + | //Arg// | -> | //Type// //Ident// + | //[Arg]// | -> | **eps** + | | **|** | //Arg// + | | **|** | //Arg// ``,`` //[Arg]// + | //Block// | -> | ``{`` //[Stmt]// ``}`` + | //[Stmt]// | -> | **eps** + | | **|** | //Stmt// //[Stmt]// + | //Stmt// | -> | ``;`` + | | **|** | //Block// + | | **|** | //Type// //[Item]// ``;`` + | | **|** | //Ident// ``=`` //Expr// ``;`` + | | **|** | //Ident// ``++`` ``;`` + | | **|** | //Ident// ``--`` ``;`` + | | **|** | ``return`` //Expr// ``;`` + | | **|** | ``return`` ``;`` + | | **|** | ``if`` ``(`` //Expr// ``)`` //Stmt// + | | **|** | ``if`` ``(`` //Expr// ``)`` //Stmt// ``else`` //Stmt// + | | **|** | ``while`` ``(`` //Expr// ``)`` //Stmt// + | | **|** | //Expr// ``;`` + | //Item// | -> | //Ident// + | | **|** | //Ident// ``=`` //Expr// + | //[Item]// | -> | //Item// + | | **|** | //Item// ``,`` //[Item]// + | //Type// | -> | ``int`` + | | **|** | ``double`` + | | **|** | ``boolean`` + | | **|** | ``void`` + | //[Type]// | -> | **eps** + | | **|** | //Type// + | | **|** | //Type// ``,`` //[Type]// + | //Expr6// | -> | //Ident// + | | **|** | //Integer// + | | **|** | //Double// + | | **|** | ``true`` + | | **|** | ``false`` + | | **|** | //Ident// ``(`` //[Expr]// ``)`` + | | **|** | //String// + | | **|** | ``(`` //Expr// ``)`` + | //Expr5// | -> | ``-`` //Expr6// + | | **|** | ``!`` //Expr6// + | | **|** | //Expr6// + | //Expr4// | -> | //Expr4// //MulOp// //Expr5// + | | **|** | //Expr5// + | //Expr3// | -> | //Expr3// //AddOp// //Expr4// + | | **|** | //Expr4// + | //Expr2// | -> | //Expr2// //RelOp// //Expr3// + | | **|** | //Expr3// + | //Expr1// | -> | //Expr2// ``&&`` //Expr1// + | | **|** | //Expr2// + | //Expr// | -> | //Expr1// ``||`` //Expr// + | | **|** | //Expr1// + | //[Expr]// | -> | **eps** + | | **|** | //Expr// + | | **|** | //Expr// ``,`` //[Expr]// + | //AddOp// | -> | ``+`` + | | **|** | ``-`` + | //MulOp// | -> | ``*`` + | | **|** | ``/`` + | | **|** | ``%`` + | //RelOp// | -> | ``<`` + | | **|** | ``<=`` + | | **|** | ``>`` + | | **|** | ``>=`` + | | **|** | ``==`` + | | **|** | ``!=`` + + diff --git a/ErrM.hi b/ErrM.hi new file mode 100644 index 0000000..50c7d1c Binary files /dev/null and b/ErrM.hi differ diff --git a/ErrM.hs b/ErrM.hs new file mode 100644 index 0000000..0e410d9 --- /dev/null +++ b/ErrM.hs @@ -0,0 +1,26 @@ +-- BNF Converter: Error Monad +-- Copyright (C) 2004 Author: Aarne Ranta + +-- This file comes with NO WARRANTY and may be used FOR ANY PURPOSE. +module ErrM where + +-- the Error monad: like Maybe type with error msgs + +import Control.Monad (MonadPlus(..), liftM) + +data Err a = Ok a | Bad String + deriving (Read, Show, Eq, Ord) + +instance Monad Err where + return = Ok + fail = Bad + Ok a >>= f = f a + Bad s >>= f = Bad s + +instance Functor Err where + fmap = liftM + +instance MonadPlus Err where + mzero = Bad "Err.mzero" + mplus (Bad _) y = y + mplus x _ = x diff --git a/ErrM.hs.bak b/ErrM.hs.bak new file mode 100644 index 0000000..0e410d9 --- /dev/null +++ b/ErrM.hs.bak @@ -0,0 +1,26 @@ +-- BNF Converter: Error Monad +-- Copyright (C) 2004 Author: Aarne Ranta + +-- This file comes with NO WARRANTY and may be used FOR ANY PURPOSE. +module ErrM where + +-- the Error monad: like Maybe type with error msgs + +import Control.Monad (MonadPlus(..), liftM) + +data Err a = Ok a | Bad String + deriving (Read, Show, Eq, Ord) + +instance Monad Err where + return = Ok + fail = Bad + Ok a >>= f = f a + Bad s >>= f = Bad s + +instance Functor Err where + fmap = liftM + +instance MonadPlus Err where + mzero = Bad "Err.mzero" + mplus (Bad _) y = y + mplus x _ = x diff --git a/ErrM.o b/ErrM.o new file mode 100644 index 0000000..0eefbdd Binary files /dev/null and b/ErrM.o differ diff --git a/Javalette.cf b/Javalette.cf new file mode 100644 index 0000000..c0715f0 --- /dev/null +++ b/Javalette.cf @@ -0,0 +1,132 @@ +-- programs ------------------------------------------------ + +entrypoints Program ; + +Program. Program ::= [TopDef] ; + +FnDef. TopDef ::= Type Ident "(" [Arg] ")" Block ; + +separator nonempty TopDef "" ; + +Arg. Arg ::= Type Ident; + +separator Arg "," ; + +-- statements ---------------------------------------------- + +Block. Block ::= "{" [Stmt] "}" ; + +separator Stmt "" ; + +Empty. Stmt ::= ";" ; + +BStmt. Stmt ::= Block ; + +Decl. Stmt ::= Type [Item] ";" ; + +NoInit. Item ::= Ident ; + +Init. Item ::= Ident "=" Expr ; + +separator nonempty Item "," ; + +Ass. Stmt ::= Ident "=" Expr ";" ; + +Incr. Stmt ::= Ident "++" ";" ; + +Decr. Stmt ::= Ident "--" ";" ; + +Ret. Stmt ::= "return" Expr ";" ; + +VRet. Stmt ::= "return" ";" ; + +Cond. Stmt ::= "if" "(" Expr ")" Stmt ; + +CondElse. Stmt ::= "if" "(" Expr ")" Stmt "else" Stmt ; + +While. Stmt ::= "while" "(" Expr ")" Stmt ; + +SExp. Stmt ::= Expr ";" ; + +-- Types --------------------------------------------------- + +Int. Type ::= "int" ; + +Doub. Type ::= "double" ; + +Bool. Type ::= "boolean" ; + +Void. Type ::= "void" ; + +internal Fun. Type ::= Type "(" [Type] ")" ; + +separator Type "," ; + +-- Expressions --------------------------------------------- + +EVar. Expr6 ::= Ident ; + +ELitInt. Expr6 ::= Integer ; + +ELitDoub. Expr6 ::= Double; + +ELitTrue. Expr6 ::= "true" ; + +ELitFalse. Expr6 ::= "false" ; + +EApp. Expr6 ::= Ident "(" [Expr] ")" ; + +EString. Expr6 ::= String ; + +Neg. Expr5 ::= "-" Expr6 ; + +Not. Expr5 ::= "!" Expr6 ; + +EMul. Expr4 ::= Expr4 MulOp Expr5 ; + +EAdd. Expr3 ::= Expr3 AddOp Expr4 ; + +ERel. Expr2 ::= Expr2 RelOp Expr3 ; + +EAnd. Expr1 ::= Expr2 "&&" Expr1 ; + +EOr. Expr ::= Expr1 "||" Expr ; + +internal TAnot. Expr ::= "<" Type ">" "(" Expr ")" ; + +coercions Expr 6 ; + +separator Expr "," ; + +-- operators ----------------------------------------------- + +Plus. AddOp ::= "+" ; + +Minus. AddOp ::= "-" ; + +Times. MulOp ::= "*" ; + +Div. MulOp ::= "/" ; + +Mod. MulOp ::= "%" ; + +LTH. RelOp ::= "<" ; + +LE. RelOp ::= "<=" ; + +GTH. RelOp ::= ">" ; + +GE. RelOp ::= ">=" ; + +EQU. RelOp ::= "==" ; + +NE. RelOp ::= "!=" ; + +-- comments ------------------------------------------------ + +comment "#" ; + +comment "//" ; + +comment "/*" "*/" ; + diff --git a/Javalette.hi b/Javalette.hi new file mode 100644 index 0000000..8cf967b Binary files /dev/null and b/Javalette.hi differ diff --git a/Javalette.hs b/Javalette.hs new file mode 100644 index 0000000..3f7873f --- /dev/null +++ b/Javalette.hs @@ -0,0 +1,36 @@ +import System.Environment (getArgs) +import System.Exit (exitFailure) +import System.FilePath.Posix + +import AbsJavalette +import LexJavalette +import ParJavalette +import ErrM +import PrintJavalette + +import TypeChecker +import Compiler + + +check :: String -> IO () +check s = case pProgram (myLexer s) of + Bad err -> do putStrLn "SYNTAX ERROR" + putStrLn err + exitFailure + Ok tree -> case typecheck tree of + Bad err -> do putStrLn "TYPE ERROR" + putStrLn err + exitFailure + Ok at -> do --putStrLn $ printTree at ++ "OK\n" + comp at + +comp :: Program -> IO () +comp p = do a <- getArgs + putStrLn $ compile p $ takeBaseName $ head a + +main :: IO () +main = do args <- getArgs + case args of + [file] -> readFile file >>= check + _ -> do putStrLn "Usage: lab2 " + exitFailure diff --git a/Javalette.hs~ b/Javalette.hs~ new file mode 100644 index 0000000..9cea2b3 --- /dev/null +++ b/Javalette.hs~ @@ -0,0 +1,30 @@ +import System.Environment (getArgs) +import System.Exit (exitFailure) + +import AbsJavalette +import LexJavalette +import ParJavalette +import ErrM + +import TypeChecker + + +-- driver + +check :: String -> IO () +check s = case pProgram (myLexer s) of + Bad err -> do putStrLn "SYNTAX ERROR" + putStrLn err + exitFailure + Ok tree -> case typecheck tree of + Bad err -> do putStrLn "TYPE ERROR" + putStrLn err + exitFailure + Ok _ -> putStrLn "OK\n" ++ printTree tree + +main :: IO () +main = do args <- getArgs + case args of + [file] -> readFile file >>= check + _ -> do putStrLn "Usage: lab2 " + exitFailure diff --git a/Javalette.o b/Javalette.o new file mode 100644 index 0000000..d3f97c2 Binary files /dev/null and b/Javalette.o differ diff --git a/LexJavalette.hi b/LexJavalette.hi new file mode 100644 index 0000000..a9f8689 Binary files /dev/null and b/LexJavalette.hi differ diff --git a/LexJavalette.hs b/LexJavalette.hs new file mode 100644 index 0000000..803c6a3 --- /dev/null +++ b/LexJavalette.hs @@ -0,0 +1,340 @@ +{-# OPTIONS -fglasgow-exts -cpp #-} +{-# LINE 3 "LexJavalette.x" #-} + +{-# OPTIONS -fno-warn-incomplete-patterns #-} +module LexJavalette where + + + +#if __GLASGOW_HASKELL__ >= 603 +#include "ghcconfig.h" +#elif defined(__GLASGOW_HASKELL__) +#include "config.h" +#endif +#if __GLASGOW_HASKELL__ >= 503 +import Data.Array +import Data.Char (ord) +import Data.Array.Base (unsafeAt) +#else +import Array +import Char (ord) +#endif +#if __GLASGOW_HASKELL__ >= 503 +import GHC.Exts +#else +import GlaExts +#endif +alex_base :: AlexAddr +alex_base = AlexA# "\x01\x00\x00\x00\x1f\x00\x00\x00\x39\x00\x00\x00\x3a\x00\x00\x00\x3b\x00\x00\x00\x3c\x00\x00\x00\x1d\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x23\x00\x00\x00\x24\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x1c\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x26\x00\x00\x00\x33\x00\x00\x00\xde\xff\xff\xff\x9a\x00\x00\x00\x6a\x01\x00\x00\x00\x00\x00\x00\x15\x01\x00\x00\xe5\x01\x00\x00\xd3\x00\x00\x00\x3d\x00\x00\x00\xe5\x00\x00\x00\xf0\x00\x00\x00\x1b\x01\x00\x00\xc0\x01\x00\x00\xca\x01\x00\x00"# + +alex_table :: AlexAddr +alex_table = AlexA# "\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x14\x00\x1a\x00\x02\x00\xff\xff\x0e\x00\x15\x00\xff\xff\x0e\x00\x0e\x00\x0e\x00\x0f\x00\x0e\x00\x10\x00\xff\xff\x06\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\xff\xff\x0e\x00\x11\x00\x13\x00\x12\x00\xff\xff\xff\xff\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x00\x0a\x00\x0e\x00\x0a\x00\x09\x00\x04\x00\x0a\x00\x0a\x00\x07\x00\x08\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x20\x00\x00\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x16\x00\x0e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x1b\x00\x00\x00\x00\x00\xff\xff\x18\x00\x1b\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\xff\xff\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x21\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x1c\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\xff\xff\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x1c\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + +alex_check :: AlexAddr +alex_check = AlexA# "\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x23\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x2a\x00\x2a\x00\x2d\x00\x2a\x00\x2a\x00\x2f\x00\x2a\x00\x2a\x00\x2f\x00\x2f\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2b\x00\x3d\x00\x3d\x00\x26\x00\x7c\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x3d\x00\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xd7\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x22\x00\xff\xff\xff\xff\xf7\x00\x5f\x00\x27\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\x00\xff\xff\xff\xff\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x5c\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\x27\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x5c\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xff\xff\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# + +alex_deflt :: AlexAddr +alex_deflt = AlexA# "\x17\x00\xff\xff\x03\x00\x03\x00\x05\x00\x05\x00\xff\xff\x0c\x00\xff\xff\x0c\x00\x0c\x00\x0c\x00\x0c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# + +alex_accept = listArray (0::Int,34) [[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_4))],[(AlexAccSkip)],[(AlexAccSkip)],[],[],[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[],[],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[],[],[],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_8))],[],[],[]] +{-# LINE 35 "LexJavalette.x" #-} + + +tok f p s = f p s + +share :: String -> String +share = id + +data Tok = + TS !String -- reserved words and symbols + | TL !String -- string literals + | TI !String -- integer literals + | TV !String -- identifiers + | TD !String -- double precision float literals + | TC !String -- character literals + + deriving (Eq,Show,Ord) + +data Token = + PT Posn Tok + | Err Posn + deriving (Eq,Show,Ord) + +tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l +tokenPos (Err (Pn _ l _) :_) = "line " ++ show l +tokenPos _ = "end of file" + +posLineCol (Pn _ l c) = (l,c) +mkPosToken t@(PT p _) = (posLineCol p, prToken t) + +prToken t = case t of + PT _ (TS s) -> s + PT _ (TI s) -> s + PT _ (TV s) -> s + PT _ (TD s) -> s + PT _ (TC s) -> s + + _ -> show t + +data BTree = N | B String Tok BTree BTree deriving (Show) + +eitherResIdent :: (String -> Tok) -> String -> Tok +eitherResIdent tv s = treeFind resWords + where + treeFind N = tv s + treeFind (B a t left right) | s < a = treeFind left + | s > a = treeFind right + | s == a = t + +resWords = b "int" (b "else" (b "double" (b "boolean" N N) N) (b "if" (b "false" N N) N)) (b "void" (b "true" (b "return" N N) N) (b "while" N N)) + where b s = B s (TS s) + +unescapeInitTail :: String -> String +unescapeInitTail = unesc . tail where + unesc s = case s of + '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs + '\\':'n':cs -> '\n' : unesc cs + '\\':'t':cs -> '\t' : unesc cs + '"':[] -> [] + c:cs -> c : unesc cs + _ -> [] + +------------------------------------------------------------------- +-- Alex wrapper code. +-- A modified "posn" wrapper. +------------------------------------------------------------------- + +data Posn = Pn !Int !Int !Int + deriving (Eq, Show,Ord) + +alexStartPos :: Posn +alexStartPos = Pn 0 1 1 + +alexMove :: Posn -> Char -> Posn +alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1) +alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1 +alexMove (Pn a l c) _ = Pn (a+1) l (c+1) + +type AlexInput = (Posn, -- current position, + Char, -- previous char + String) -- current input string + +tokens :: String -> [Token] +tokens str = go (alexStartPos, '\n', str) + where + go :: (Posn, Char, String) -> [Token] + go inp@(pos, _, str) = + case alexScan inp 0 of + AlexEOF -> [] + AlexError (pos, _, _) -> [Err pos] + AlexSkip inp' len -> go inp' + AlexToken inp' len act -> act pos (take len str) : (go inp') + +alexGetChar :: AlexInput -> Maybe (Char,AlexInput) +alexGetChar (p, c, []) = Nothing +alexGetChar (p, _, (c:s)) = + let p' = alexMove p c + in p' `seq` Just (c, (p', c, s)) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar (p, c, s) = c + +alex_action_4 = tok (\p s -> PT p (TS $ share s)) +alex_action_5 = tok (\p s -> PT p (eitherResIdent (TV . share) s)) +alex_action_6 = tok (\p s -> PT p (TL $ share $ unescapeInitTail s)) +alex_action_7 = tok (\p s -> PT p (TI $ share s)) +alex_action_8 = tok (\p s -> PT p (TD $ share s)) +{-# LINE 1 "templates/GenericTemplate.hs" #-} +{-# LINE 1 "templates/GenericTemplate.hs" #-} +{-# LINE 1 "" #-} +{-# LINE 1 "" #-} +{-# LINE 1 "templates/GenericTemplate.hs" #-} +-- ----------------------------------------------------------------------------- +-- ALEX TEMPLATE +-- +-- This code is in the PUBLIC DOMAIN; you may copy it freely and use +-- it for any purpose whatsoever. + +-- ----------------------------------------------------------------------------- +-- INTERNALS and main scanner engine + +{-# LINE 37 "templates/GenericTemplate.hs" #-} + +{-# LINE 47 "templates/GenericTemplate.hs" #-} + + +data AlexAddr = AlexA# Addr# + +#if __GLASGOW_HASKELL__ < 503 +uncheckedShiftL# = shiftL# +#endif + +{-# INLINE alexIndexInt16OffAddr #-} +alexIndexInt16OffAddr (AlexA# arr) off = +#ifdef WORDS_BIGENDIAN + narrow16Int# i + where + i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low) + high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#))) + low = int2Word# (ord# (indexCharOffAddr# arr off')) + off' = off *# 2# +#else + indexInt16OffAddr# arr off +#endif + + + + + +{-# INLINE alexIndexInt32OffAddr #-} +alexIndexInt32OffAddr (AlexA# arr) off = +#ifdef WORDS_BIGENDIAN + narrow32Int# i + where + i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#` + (b2 `uncheckedShiftL#` 16#) `or#` + (b1 `uncheckedShiftL#` 8#) `or#` b0) + b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#))) + b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#))) + b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#))) + b0 = int2Word# (ord# (indexCharOffAddr# arr off')) + off' = off *# 4# +#else + indexInt32OffAddr# arr off +#endif + + + + + +#if __GLASGOW_HASKELL__ < 503 +quickIndex arr i = arr ! i +#else +-- GHC >= 503, unsafeAt is available from Data.Array.Base. +quickIndex = unsafeAt +#endif + + + + +-- ----------------------------------------------------------------------------- +-- Main lexing routines + +data AlexReturn a + = AlexEOF + | AlexError !AlexInput + | AlexSkip !AlexInput !Int + | AlexToken !AlexInput !Int a + +-- alexScan :: AlexInput -> StartCode -> AlexReturn a +alexScan input (I# (sc)) + = alexScanUser undefined input (I# (sc)) + +alexScanUser user input (I# (sc)) + = case alex_scan_tkn user input 0# input sc AlexNone of + (AlexNone, input') -> + case alexGetChar input of + Nothing -> + + + + AlexEOF + Just _ -> + + + + AlexError input' + + (AlexLastSkip input len, _) -> + + + + AlexSkip input len + + (AlexLastAcc k input len, _) -> + + + + AlexToken input len k + + +-- Push the input through the DFA, remembering the most recent accepting +-- state it encountered. + +alex_scan_tkn user orig_input len input s last_acc = + input `seq` -- strict in the input + let + new_acc = check_accs (alex_accept `quickIndex` (I# (s))) + in + new_acc `seq` + case alexGetChar input of + Nothing -> (new_acc, input) + Just (c, new_input) -> + + + + let + !(base) = alexIndexInt32OffAddr alex_base s + !((I# (ord_c))) = ord c + !(offset) = (base +# ord_c) + !(check) = alexIndexInt16OffAddr alex_check offset + + !(new_s) = if (offset >=# 0#) && (check ==# ord_c) + then alexIndexInt16OffAddr alex_table offset + else alexIndexInt16OffAddr alex_deflt s + in + case new_s of + -1# -> (new_acc, input) + -- on an error, we want to keep the input *before* the + -- character that failed, not after. + _ -> alex_scan_tkn user orig_input (len +# 1#) + new_input new_s new_acc + + where + check_accs [] = last_acc + check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len)) + check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len)) + check_accs (AlexAccPred a pred : rest) + | pred user orig_input (I# (len)) input + = AlexLastAcc a input (I# (len)) + check_accs (AlexAccSkipPred pred : rest) + | pred user orig_input (I# (len)) input + = AlexLastSkip input (I# (len)) + check_accs (_ : rest) = check_accs rest + +data AlexLastAcc a + = AlexNone + | AlexLastAcc a !AlexInput !Int + | AlexLastSkip !AlexInput !Int + +data AlexAcc a user + = AlexAcc a + | AlexAccSkip + | AlexAccPred a (AlexAccPred user) + | AlexAccSkipPred (AlexAccPred user) + +type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool + +-- ----------------------------------------------------------------------------- +-- Predicates on a rule + +alexAndPred p1 p2 user in1 len in2 + = p1 user in1 len in2 && p2 user in1 len in2 + +--alexPrevCharIsPred :: Char -> AlexAccPred _ +alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input + +--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ +alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input + +--alexRightContext :: Int -> AlexAccPred _ +alexRightContext (I# (sc)) user _ _ input = + case alex_scan_tkn user input 0# input sc AlexNone of + (AlexNone, _) -> False + _ -> True + -- TODO: there's no need to find the longest + -- match when checking the right context, just + -- the first match will do. + +-- used by wrappers +iUnbox (I# (i)) = i diff --git a/LexJavalette.o b/LexJavalette.o new file mode 100644 index 0000000..e51fde9 Binary files /dev/null and b/LexJavalette.o differ diff --git a/LexJavalette.x b/LexJavalette.x new file mode 100644 index 0000000..002c641 --- /dev/null +++ b/LexJavalette.x @@ -0,0 +1,135 @@ +-- -*- haskell -*- +-- This Alex file was machine-generated by the BNF converter +{ +{-# OPTIONS -fno-warn-incomplete-patterns #-} +module LexJavalette where + + +} + + +$l = [a-zA-Z\192 - \255] # [\215 \247] -- isolatin1 letter FIXME +$c = [A-Z\192-\221] # [\215] -- capital isolatin1 letter FIXME +$s = [a-z\222-\255] # [\247] -- small isolatin1 letter FIXME +$d = [0-9] -- digit +$i = [$l $d _ '] -- identifier character +$u = [\0-\255] -- universal: any character + +@rsyms = -- symbols and non-identifier-like reserved words + \( | \) | \, | \{ | \} | \; | \= | \+ \+ | \- \- | \- | \! | \& \& | \| \| | \< | \> | \+ | \* | \/ | \% | \< \= | \> \= | \= \= | \! \= + +:- +"#" [.]* ; -- Toss single line comments +"//" [.]* ; -- Toss single line comments +"/*" ([$u # \*] | \* [$u # \/])* ("*")+ "/" ; + +$white+ ; +@rsyms { tok (\p s -> PT p (TS $ share s)) } + +$l $i* { tok (\p s -> PT p (eitherResIdent (TV . share) s)) } +\" ([$u # [\" \\ \n]] | (\\ (\" | \\ | \' | n | t)))* \"{ tok (\p s -> PT p (TL $ share $ unescapeInitTail s)) } + +$d+ { tok (\p s -> PT p (TI $ share s)) } +$d+ \. $d+ (e (\-)? $d+)? { tok (\p s -> PT p (TD $ share s)) } + +{ + +tok f p s = f p s + +share :: String -> String +share = id + +data Tok = + TS !String -- reserved words and symbols + | TL !String -- string literals + | TI !String -- integer literals + | TV !String -- identifiers + | TD !String -- double precision float literals + | TC !String -- character literals + + deriving (Eq,Show,Ord) + +data Token = + PT Posn Tok + | Err Posn + deriving (Eq,Show,Ord) + +tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l +tokenPos (Err (Pn _ l _) :_) = "line " ++ show l +tokenPos _ = "end of file" + +posLineCol (Pn _ l c) = (l,c) +mkPosToken t@(PT p _) = (posLineCol p, prToken t) + +prToken t = case t of + PT _ (TS s) -> s + PT _ (TI s) -> s + PT _ (TV s) -> s + PT _ (TD s) -> s + PT _ (TC s) -> s + + _ -> show t + +data BTree = N | B String Tok BTree BTree deriving (Show) + +eitherResIdent :: (String -> Tok) -> String -> Tok +eitherResIdent tv s = treeFind resWords + where + treeFind N = tv s + treeFind (B a t left right) | s < a = treeFind left + | s > a = treeFind right + | s == a = t + +resWords = b "int" (b "else" (b "double" (b "boolean" N N) N) (b "if" (b "false" N N) N)) (b "void" (b "true" (b "return" N N) N) (b "while" N N)) + where b s = B s (TS s) + +unescapeInitTail :: String -> String +unescapeInitTail = unesc . tail where + unesc s = case s of + '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs + '\\':'n':cs -> '\n' : unesc cs + '\\':'t':cs -> '\t' : unesc cs + '"':[] -> [] + c:cs -> c : unesc cs + _ -> [] + +------------------------------------------------------------------- +-- Alex wrapper code. +-- A modified "posn" wrapper. +------------------------------------------------------------------- + +data Posn = Pn !Int !Int !Int + deriving (Eq, Show,Ord) + +alexStartPos :: Posn +alexStartPos = Pn 0 1 1 + +alexMove :: Posn -> Char -> Posn +alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1) +alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1 +alexMove (Pn a l c) _ = Pn (a+1) l (c+1) + +type AlexInput = (Posn, -- current position, + Char, -- previous char + String) -- current input string + +tokens :: String -> [Token] +tokens str = go (alexStartPos, '\n', str) + where + go :: (Posn, Char, String) -> [Token] + go inp@(pos, _, str) = + case alexScan inp 0 of + AlexEOF -> [] + AlexError (pos, _, _) -> [Err pos] + AlexSkip inp' len -> go inp' + AlexToken inp' len act -> act pos (take len str) : (go inp') + +alexGetChar :: AlexInput -> Maybe (Char,AlexInput) +alexGetChar (p, c, []) = Nothing +alexGetChar (p, _, (c:s)) = + let p' = alexMove p c + in p' `seq` Just (c, (p', c, s)) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar (p, c, s) = c +} diff --git a/LexJavalette.x.bak b/LexJavalette.x.bak new file mode 100644 index 0000000..3ca8407 --- /dev/null +++ b/LexJavalette.x.bak @@ -0,0 +1,135 @@ +-- -*- haskell -*- +-- This Alex file was machine-generated by the BNF converter +{ +{-# OPTIONS -fno-warn-incomplete-patterns #-} +module LexJavalette where + + +} + + +$l = [a-zA-Z\192 - \255] # [\215 \247] -- isolatin1 letter FIXME +$c = [A-Z\192-\221] # [\215] -- capital isolatin1 letter FIXME +$s = [a-z\222-\255] # [\247] -- small isolatin1 letter FIXME +$d = [0-9] -- digit +$i = [$l $d _ '] -- identifier character +$u = [\0-\255] -- universal: any character + +@rsyms = -- symbols and non-identifier-like reserved words + \( | \) | \, | \{ | \} | \; | \= | \+ \+ | \- \- | \- | \! | \& \& | \| \| | \+ | \* | \/ | \% | \< | \< \= | \> | \> \= | \= \= | \! \= + +:- +"#" [.]* ; -- Toss single line comments +"//" [.]* ; -- Toss single line comments +"/*" ([$u # \*] | \* [$u # \/])* ("*")+ "/" ; + +$white+ ; +@rsyms { tok (\p s -> PT p (TS $ share s)) } + +$l $i* { tok (\p s -> PT p (eitherResIdent (TV . share) s)) } +\" ([$u # [\" \\ \n]] | (\\ (\" | \\ | \' | n | t)))* \"{ tok (\p s -> PT p (TL $ share $ unescapeInitTail s)) } + +$d+ { tok (\p s -> PT p (TI $ share s)) } +$d+ \. $d+ (e (\-)? $d+)? { tok (\p s -> PT p (TD $ share s)) } + +{ + +tok f p s = f p s + +share :: String -> String +share = id + +data Tok = + TS !String -- reserved words and symbols + | TL !String -- string literals + | TI !String -- integer literals + | TV !String -- identifiers + | TD !String -- double precision float literals + | TC !String -- character literals + + deriving (Eq,Show,Ord) + +data Token = + PT Posn Tok + | Err Posn + deriving (Eq,Show,Ord) + +tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l +tokenPos (Err (Pn _ l _) :_) = "line " ++ show l +tokenPos _ = "end of file" + +posLineCol (Pn _ l c) = (l,c) +mkPosToken t@(PT p _) = (posLineCol p, prToken t) + +prToken t = case t of + PT _ (TS s) -> s + PT _ (TI s) -> s + PT _ (TV s) -> s + PT _ (TD s) -> s + PT _ (TC s) -> s + + _ -> show t + +data BTree = N | B String Tok BTree BTree deriving (Show) + +eitherResIdent :: (String -> Tok) -> String -> Tok +eitherResIdent tv s = treeFind resWords + where + treeFind N = tv s + treeFind (B a t left right) | s < a = treeFind left + | s > a = treeFind right + | s == a = t + +resWords = b "int" (b "else" (b "double" (b "boolean" N N) N) (b "if" (b "false" N N) N)) (b "void" (b "true" (b "return" N N) N) (b "while" N N)) + where b s = B s (TS s) + +unescapeInitTail :: String -> String +unescapeInitTail = unesc . tail where + unesc s = case s of + '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs + '\\':'n':cs -> '\n' : unesc cs + '\\':'t':cs -> '\t' : unesc cs + '"':[] -> [] + c:cs -> c : unesc cs + _ -> [] + +------------------------------------------------------------------- +-- Alex wrapper code. +-- A modified "posn" wrapper. +------------------------------------------------------------------- + +data Posn = Pn !Int !Int !Int + deriving (Eq, Show,Ord) + +alexStartPos :: Posn +alexStartPos = Pn 0 1 1 + +alexMove :: Posn -> Char -> Posn +alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1) +alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1 +alexMove (Pn a l c) _ = Pn (a+1) l (c+1) + +type AlexInput = (Posn, -- current position, + Char, -- previous char + String) -- current input string + +tokens :: String -> [Token] +tokens str = go (alexStartPos, '\n', str) + where + go :: (Posn, Char, String) -> [Token] + go inp@(pos, _, str) = + case alexScan inp 0 of + AlexEOF -> [] + AlexError (pos, _, _) -> [Err pos] + AlexSkip inp' len -> go inp' + AlexToken inp' len act -> act pos (take len str) : (go inp') + +alexGetChar :: AlexInput -> Maybe (Char,AlexInput) +alexGetChar (p, c, []) = Nothing +alexGetChar (p, _, (c:s)) = + let p' = alexMove p c + in p' `seq` Just (c, (p', c, s)) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar (p, c, s) = c +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eba278a --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +all: + happy -gca ParJavalette.y + alex -g LexJavalette.x + latex DocJavalette.tex; dvips DocJavalette.dvi -o DocJavalette.ps + ghc --make TestJavalette.hs -o TestJavalette + ghc --make Javalette.hs -o jlc +clean: + -rm -f *.log *.aux *.hi *.o *.dvi + -rm -f DocJavalette.ps +distclean: clean + -rm -f DocJavalette.* LexJavalette.* ParJavalette.* LayoutJavalette.* SkelJavalette.* PrintJavalette.* TestJavalette.* AbsJavalette.* TestJavalette ErrM.* SharedString.* Javalette.dtd XMLJavalette.* Makefile* + +jlc: + ghc --make Javalette.hs -o jlc diff --git a/ParJavalette.hi b/ParJavalette.hi new file mode 100644 index 0000000..4e6b0f0 Binary files /dev/null and b/ParJavalette.hi differ diff --git a/ParJavalette.hs b/ParJavalette.hs new file mode 100644 index 0000000..277e926 --- /dev/null +++ b/ParJavalette.hs @@ -0,0 +1,1214 @@ +{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-} +{-# OPTIONS -fglasgow-exts -cpp #-} +{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-} +module ParJavalette where +import AbsJavalette +import LexJavalette +import ErrM +#if __GLASGOW_HASKELL__ >= 503 +import qualified Data.Array as Happy_Data_Array +#else +import qualified Array as Happy_Data_Array +#endif +#if __GLASGOW_HASKELL__ >= 503 +import qualified GHC.Exts as Happy_GHC_Exts +#else +import qualified GlaExts as Happy_GHC_Exts +#endif + +-- parser produced by Happy Version 1.18.4 + +newtype HappyAbsSyn = HappyAbsSyn HappyAny +#if __GLASGOW_HASKELL__ >= 607 +type HappyAny = Happy_GHC_Exts.Any +#else +type HappyAny = forall a . a +#endif +happyIn4 :: (Ident) -> (HappyAbsSyn ) +happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn4 #-} +happyOut4 :: (HappyAbsSyn ) -> (Ident) +happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut4 #-} +happyIn5 :: (Integer) -> (HappyAbsSyn ) +happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn5 #-} +happyOut5 :: (HappyAbsSyn ) -> (Integer) +happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut5 #-} +happyIn6 :: (Double) -> (HappyAbsSyn ) +happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn6 #-} +happyOut6 :: (HappyAbsSyn ) -> (Double) +happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut6 #-} +happyIn7 :: (String) -> (HappyAbsSyn ) +happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn7 #-} +happyOut7 :: (HappyAbsSyn ) -> (String) +happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut7 #-} +happyIn8 :: (Program) -> (HappyAbsSyn ) +happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn8 #-} +happyOut8 :: (HappyAbsSyn ) -> (Program) +happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut8 #-} +happyIn9 :: (TopDef) -> (HappyAbsSyn ) +happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn9 #-} +happyOut9 :: (HappyAbsSyn ) -> (TopDef) +happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut9 #-} +happyIn10 :: ([TopDef]) -> (HappyAbsSyn ) +happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn10 #-} +happyOut10 :: (HappyAbsSyn ) -> ([TopDef]) +happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut10 #-} +happyIn11 :: (Arg) -> (HappyAbsSyn ) +happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn11 #-} +happyOut11 :: (HappyAbsSyn ) -> (Arg) +happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut11 #-} +happyIn12 :: ([Arg]) -> (HappyAbsSyn ) +happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn12 #-} +happyOut12 :: (HappyAbsSyn ) -> ([Arg]) +happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut12 #-} +happyIn13 :: (Block) -> (HappyAbsSyn ) +happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn13 #-} +happyOut13 :: (HappyAbsSyn ) -> (Block) +happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut13 #-} +happyIn14 :: ([Stmt]) -> (HappyAbsSyn ) +happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn14 #-} +happyOut14 :: (HappyAbsSyn ) -> ([Stmt]) +happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut14 #-} +happyIn15 :: (Stmt) -> (HappyAbsSyn ) +happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn15 #-} +happyOut15 :: (HappyAbsSyn ) -> (Stmt) +happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut15 #-} +happyIn16 :: (Item) -> (HappyAbsSyn ) +happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn16 #-} +happyOut16 :: (HappyAbsSyn ) -> (Item) +happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut16 #-} +happyIn17 :: ([Item]) -> (HappyAbsSyn ) +happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn17 #-} +happyOut17 :: (HappyAbsSyn ) -> ([Item]) +happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut17 #-} +happyIn18 :: (Type) -> (HappyAbsSyn ) +happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn18 #-} +happyOut18 :: (HappyAbsSyn ) -> (Type) +happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut18 #-} +happyIn19 :: ([Type]) -> (HappyAbsSyn ) +happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn19 #-} +happyOut19 :: (HappyAbsSyn ) -> ([Type]) +happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut19 #-} +happyIn20 :: (Expr) -> (HappyAbsSyn ) +happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn20 #-} +happyOut20 :: (HappyAbsSyn ) -> (Expr) +happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut20 #-} +happyIn21 :: (Expr) -> (HappyAbsSyn ) +happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn21 #-} +happyOut21 :: (HappyAbsSyn ) -> (Expr) +happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut21 #-} +happyIn22 :: (Expr) -> (HappyAbsSyn ) +happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn22 #-} +happyOut22 :: (HappyAbsSyn ) -> (Expr) +happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut22 #-} +happyIn23 :: (Expr) -> (HappyAbsSyn ) +happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn23 #-} +happyOut23 :: (HappyAbsSyn ) -> (Expr) +happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut23 #-} +happyIn24 :: (Expr) -> (HappyAbsSyn ) +happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn24 #-} +happyOut24 :: (HappyAbsSyn ) -> (Expr) +happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut24 #-} +happyIn25 :: (Expr) -> (HappyAbsSyn ) +happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn25 #-} +happyOut25 :: (HappyAbsSyn ) -> (Expr) +happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut25 #-} +happyIn26 :: (Expr) -> (HappyAbsSyn ) +happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn26 #-} +happyOut26 :: (HappyAbsSyn ) -> (Expr) +happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut26 #-} +happyIn27 :: ([Expr]) -> (HappyAbsSyn ) +happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn27 #-} +happyOut27 :: (HappyAbsSyn ) -> ([Expr]) +happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut27 #-} +happyIn28 :: (AddOp) -> (HappyAbsSyn ) +happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn28 #-} +happyOut28 :: (HappyAbsSyn ) -> (AddOp) +happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut28 #-} +happyIn29 :: (MulOp) -> (HappyAbsSyn ) +happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn29 #-} +happyOut29 :: (HappyAbsSyn ) -> (MulOp) +happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut29 #-} +happyIn30 :: (RelOp) -> (HappyAbsSyn ) +happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn30 #-} +happyOut30 :: (HappyAbsSyn ) -> (RelOp) +happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut30 #-} +happyInTok :: (Token) -> (HappyAbsSyn ) +happyInTok x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyInTok #-} +happyOutTok :: (HappyAbsSyn ) -> (Token) +happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOutTok #-} + + +happyActOffsets :: HappyAddr +happyActOffsets = HappyA# "\x4e\x00\xa3\x00\x00\x00\x8f\x00\x4e\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x4e\x00\xaf\x00\xae\x00\x8c\x00\x00\x00\xab\x00\x4e\x00\x00\x00\x00\x00\x00\x00\x01\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x05\x00\xfa\xff\x1f\x00\x95\x00\x97\x00\x4d\x00\x00\x00\x00\x00\x3f\x00\x3f\x00\x00\x00\x9a\x00\x31\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x79\x00\x94\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x80\x00\x00\x00\x4d\x00\x4d\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x71\x00\x74\x00\x67\x00\x4d\x00\x4d\x00\x64\x00\x63\x00\x00\x00\x00\x00\x5a\x00\x56\x00\x5d\x00\x00\x00\x2f\x00\x4d\x00\x00\x00\x05\x00\x00\x00\xfa\xff\x00\x00\x00\x00\x59\x00\x00\x00\x50\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x33\x00\x00\x00\x26\x00\x00\x00\x00\x00"# + +happyGotoOffsets :: HappyAddr +happyGotoOffsets = HappyA# "\x0d\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x34\x00\x21\x00\x00\x00\x00\x00\x2e\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x20\x00\xf6\xff\xf3\xff\x00\x00\x00\x00\x49\x01\x00\x00\x00\x00\x83\x01\x72\x01\x00\x00\x00\x00\x32\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x01\x66\x01\x50\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x01\x00\x00\x00\x00\x6e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\xef\x00\x00\x00\xf0\xff\x00\x00\xe9\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00"# + +happyDefActions :: HappyAddr +happyDefActions = HappyA# "\x00\x00\x00\x00\xfe\xff\x00\x00\xf8\xff\xfa\xff\x00\x00\xdd\xff\xde\xff\xdf\xff\xdc\xff\x00\x00\xf7\xff\xf5\xff\xf4\xff\x00\x00\x00\x00\xf6\xff\x00\x00\xf5\xff\xf3\xff\xf9\xff\xf1\xff\x00\x00\xd8\xff\xd7\xff\xd6\xff\xd2\xff\xee\xff\xf0\xff\x00\x00\xce\xff\xcc\xff\xca\xff\xc8\xff\xc6\xff\xc4\xff\x00\x00\x00\x00\xf2\xff\xef\xff\x00\x00\x00\x00\xd4\xff\x00\x00\x00\x00\xd5\xff\x00\x00\xfd\xff\xfc\xff\xfb\xff\x00\x00\xd8\xff\x00\x00\xe8\xff\x00\x00\xcf\xff\xd0\xff\x00\x00\xe4\xff\x00\x00\x00\x00\x00\x00\xbb\xff\xb9\xff\xba\xff\xb8\xff\xb7\xff\xb6\xff\x00\x00\xbf\xff\xc0\xff\x00\x00\xbe\xff\xbd\xff\xbc\xff\xe3\xff\xe1\xff\x00\x00\xc3\xff\x00\x00\x00\x00\x00\x00\xea\xff\xeb\xff\x00\x00\xc2\xff\x00\x00\xed\xff\x00\x00\x00\x00\xcd\xff\xcb\xff\xc7\xff\xc9\xff\xc5\xff\xd1\xff\x00\x00\xe9\xff\x00\x00\x00\x00\x00\x00\xe2\xff\xe0\xff\xd3\xff\xc3\xff\xec\xff\xc1\xff\xe7\xff\xe5\xff\x00\x00\xe6\xff"# + +happyCheck :: HappyAddr +happyCheck = HappyA# "\xff\xff\x18\x00\x01\x00\x00\x00\x0a\x00\x04\x00\x05\x00\x06\x00\x00\x00\x19\x00\x10\x00\x0a\x00\x0b\x00\x1a\x00\x18\x00\x0c\x00\x0d\x00\x04\x00\x05\x00\x06\x00\x0c\x00\x0d\x00\x11\x00\x12\x00\x13\x00\x18\x00\x19\x00\x0e\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x01\x00\x07\x00\x08\x00\x04\x00\x0c\x00\x06\x00\x0e\x00\x0f\x00\x0e\x00\x0a\x00\x0b\x00\x01\x00\x14\x00\x15\x00\x16\x00\x17\x00\x06\x00\x0a\x00\x19\x00\x00\x00\x0a\x00\x0b\x00\x09\x00\x18\x00\x19\x00\x01\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1b\x00\x1a\x00\x01\x00\x00\x00\x1f\x00\x22\x00\x02\x00\x22\x00\x23\x00\x24\x00\x25\x00\x0a\x00\x0b\x00\x03\x00\x1b\x00\x02\x00\x05\x00\x06\x00\x1f\x00\x02\x00\x06\x00\x22\x00\x23\x00\x24\x00\x25\x00\x0e\x00\x18\x00\x19\x00\x1b\x00\x06\x00\x06\x00\x1d\x00\x1f\x00\x06\x00\x20\x00\x22\x00\x23\x00\x24\x00\x25\x00\x00\x00\x01\x00\x02\x00\x03\x00\x03\x00\x07\x00\x01\x00\x01\x00\x00\x00\x01\x00\x02\x00\x03\x00\x07\x00\x08\x00\x09\x00\x02\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x00\x00\x01\x00\x02\x00\x03\x00\x01\x00\x07\x00\x08\x00\x06\x00\x01\x00\x09\x00\x06\x00\x0b\x00\x0e\x00\x22\x00\x0e\x00\x0d\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x00\x02\x00\x03\x00\x22\x00\x04\x00\x02\x00\x01\x00\x03\x00\x09\x00\x22\x00\x0b\x00\x27\x00\xff\xff\x0e\x00\xff\xff\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x00\x02\x00\x03\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\x0e\x00\xff\xff\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\x0e\x00\xff\xff\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00\x01\x00\x02\x00\x03\x00\x10\x00\x11\x00\x12\x00\x13\x00\x10\x00\x11\x00\x12\x00\xff\xff\x10\x00\x11\x00\xff\xff\xff\xff\x10\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# + +happyTable :: HappyAddr +happyTable = HappyA# "\x00\x00\x45\x00\x27\x00\x4c\x00\x47\x00\x17\x00\x28\x00\x29\x00\x4c\x00\x48\x00\x48\x00\x2a\x00\x2b\x00\x3d\x00\x45\x00\x4d\x00\x67\x00\x03\x00\x04\x00\x05\x00\x4d\x00\x4e\x00\x4a\x00\x4b\x00\x4c\x00\x08\x00\x09\x00\x06\x00\x2c\x00\x2d\x00\x0a\x00\x2e\x00\x2f\x00\x0b\x00\x30\x00\x03\x00\x31\x00\x32\x00\x33\x00\x27\x00\x0e\x00\x14\x00\x17\x00\x3f\x00\x29\x00\x40\x00\x41\x00\x10\x00\x2a\x00\x2b\x00\x27\x00\x42\x00\x43\x00\x44\x00\x45\x00\x37\x00\x17\x00\x48\x00\x11\x00\x2a\x00\x2b\x00\x15\x00\x08\x00\x09\x00\x27\x00\x2c\x00\x2d\x00\x0a\x00\x2e\x00\x2f\x00\x0b\x00\x30\x00\x03\x00\x31\x00\x32\x00\x33\x00\x2c\x00\x6f\x00\x27\x00\x0b\x00\x2f\x00\x03\x00\x65\x00\x03\x00\x31\x00\x32\x00\x33\x00\x2a\x00\x2b\x00\x6a\x00\x2c\x00\x66\x00\x04\x00\x0c\x00\x2f\x00\x69\x00\x6b\x00\x03\x00\x31\x00\x32\x00\x33\x00\x06\x00\x08\x00\x09\x00\x2c\x00\x54\x00\x55\x00\x0a\x00\x2f\x00\x59\x00\x0b\x00\x03\x00\x31\x00\x32\x00\x33\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x5a\x00\x5b\x00\x50\x00\x50\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x51\x00\x52\x00\x53\x00\x61\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x56\x00\x6b\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x56\x00\x57\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x34\x00\x0e\x00\x0f\x00\x63\x00\x38\x00\x1c\x00\x3c\x00\x6f\x00\x10\x00\x03\x00\x1e\x00\x3d\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x03\x00\x17\x00\x13\x00\x0e\x00\x14\x00\x1c\x00\x03\x00\x6c\x00\xff\xff\x00\x00\x1e\x00\x00\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x6d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x66\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x55\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x5f\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x61\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x63\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x35\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x3a\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x5d\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x1f\x00\x20\x00\x21\x00\x5e\x00\x1f\x00\x20\x00\x5c\x00\x00\x00\x1f\x00\x5b\x00\x00\x00\x00\x00\x38\x00\x34\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + +happyReduceArr = Happy_Data_Array.array (1, 73) [ + (1 , happyReduce_1), + (2 , happyReduce_2), + (3 , happyReduce_3), + (4 , happyReduce_4), + (5 , happyReduce_5), + (6 , happyReduce_6), + (7 , happyReduce_7), + (8 , happyReduce_8), + (9 , happyReduce_9), + (10 , happyReduce_10), + (11 , happyReduce_11), + (12 , happyReduce_12), + (13 , happyReduce_13), + (14 , happyReduce_14), + (15 , happyReduce_15), + (16 , happyReduce_16), + (17 , happyReduce_17), + (18 , happyReduce_18), + (19 , happyReduce_19), + (20 , happyReduce_20), + (21 , happyReduce_21), + (22 , happyReduce_22), + (23 , happyReduce_23), + (24 , happyReduce_24), + (25 , happyReduce_25), + (26 , happyReduce_26), + (27 , happyReduce_27), + (28 , happyReduce_28), + (29 , happyReduce_29), + (30 , happyReduce_30), + (31 , happyReduce_31), + (32 , happyReduce_32), + (33 , happyReduce_33), + (34 , happyReduce_34), + (35 , happyReduce_35), + (36 , happyReduce_36), + (37 , happyReduce_37), + (38 , happyReduce_38), + (39 , happyReduce_39), + (40 , happyReduce_40), + (41 , happyReduce_41), + (42 , happyReduce_42), + (43 , happyReduce_43), + (44 , happyReduce_44), + (45 , happyReduce_45), + (46 , happyReduce_46), + (47 , happyReduce_47), + (48 , happyReduce_48), + (49 , happyReduce_49), + (50 , happyReduce_50), + (51 , happyReduce_51), + (52 , happyReduce_52), + (53 , happyReduce_53), + (54 , happyReduce_54), + (55 , happyReduce_55), + (56 , happyReduce_56), + (57 , happyReduce_57), + (58 , happyReduce_58), + (59 , happyReduce_59), + (60 , happyReduce_60), + (61 , happyReduce_61), + (62 , happyReduce_62), + (63 , happyReduce_63), + (64 , happyReduce_64), + (65 , happyReduce_65), + (66 , happyReduce_66), + (67 , happyReduce_67), + (68 , happyReduce_68), + (69 , happyReduce_69), + (70 , happyReduce_70), + (71 , happyReduce_71), + (72 , happyReduce_72), + (73 , happyReduce_73) + ] + +happy_n_terms = 40 :: Int +happy_n_nonterms = 27 :: Int + +happyReduce_1 = happySpecReduce_1 0# happyReduction_1 +happyReduction_1 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TV happy_var_1)) -> + happyIn4 + (Ident happy_var_1 + )} + +happyReduce_2 = happySpecReduce_1 1# happyReduction_2 +happyReduction_2 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TI happy_var_1)) -> + happyIn5 + ((read happy_var_1) :: Integer + )} + +happyReduce_3 = happySpecReduce_1 2# happyReduction_3 +happyReduction_3 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TD happy_var_1)) -> + happyIn6 + ((read happy_var_1) :: Double + )} + +happyReduce_4 = happySpecReduce_1 3# happyReduction_4 +happyReduction_4 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TL happy_var_1)) -> + happyIn7 + (happy_var_1 + )} + +happyReduce_5 = happySpecReduce_1 4# happyReduction_5 +happyReduction_5 happy_x_1 + = case happyOut10 happy_x_1 of { happy_var_1 -> + happyIn8 + (Program happy_var_1 + )} + +happyReduce_6 = happyReduce 6# 5# happyReduction_6 +happyReduction_6 (happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut18 happy_x_1 of { happy_var_1 -> + case happyOut4 happy_x_2 of { happy_var_2 -> + case happyOut12 happy_x_4 of { happy_var_4 -> + case happyOut13 happy_x_6 of { happy_var_6 -> + happyIn9 + (FnDef happy_var_1 happy_var_2 happy_var_4 happy_var_6 + ) `HappyStk` happyRest}}}} + +happyReduce_7 = happySpecReduce_1 6# happyReduction_7 +happyReduction_7 happy_x_1 + = case happyOut9 happy_x_1 of { happy_var_1 -> + happyIn10 + ((:[]) happy_var_1 + )} + +happyReduce_8 = happySpecReduce_2 6# happyReduction_8 +happyReduction_8 happy_x_2 + happy_x_1 + = case happyOut9 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_2 of { happy_var_2 -> + happyIn10 + ((:) happy_var_1 happy_var_2 + )}} + +happyReduce_9 = happySpecReduce_2 7# happyReduction_9 +happyReduction_9 happy_x_2 + happy_x_1 + = case happyOut18 happy_x_1 of { happy_var_1 -> + case happyOut4 happy_x_2 of { happy_var_2 -> + happyIn11 + (Arg happy_var_1 happy_var_2 + )}} + +happyReduce_10 = happySpecReduce_0 8# happyReduction_10 +happyReduction_10 = happyIn12 + ([] + ) + +happyReduce_11 = happySpecReduce_1 8# happyReduction_11 +happyReduction_11 happy_x_1 + = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn12 + ((:[]) happy_var_1 + )} + +happyReduce_12 = happySpecReduce_3 8# happyReduction_12 +happyReduction_12 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut11 happy_x_1 of { happy_var_1 -> + case happyOut12 happy_x_3 of { happy_var_3 -> + happyIn12 + ((:) happy_var_1 happy_var_3 + )}} + +happyReduce_13 = happySpecReduce_3 9# happyReduction_13 +happyReduction_13 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut14 happy_x_2 of { happy_var_2 -> + happyIn13 + (Block (reverse happy_var_2) + )} + +happyReduce_14 = happySpecReduce_0 10# happyReduction_14 +happyReduction_14 = happyIn14 + ([] + ) + +happyReduce_15 = happySpecReduce_2 10# happyReduction_15 +happyReduction_15 happy_x_2 + happy_x_1 + = case happyOut14 happy_x_1 of { happy_var_1 -> + case happyOut15 happy_x_2 of { happy_var_2 -> + happyIn14 + (flip (:) happy_var_1 happy_var_2 + )}} + +happyReduce_16 = happySpecReduce_1 11# happyReduction_16 +happyReduction_16 happy_x_1 + = happyIn15 + (Empty + ) + +happyReduce_17 = happySpecReduce_1 11# happyReduction_17 +happyReduction_17 happy_x_1 + = case happyOut13 happy_x_1 of { happy_var_1 -> + happyIn15 + (BStmt happy_var_1 + )} + +happyReduce_18 = happySpecReduce_3 11# happyReduction_18 +happyReduction_18 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut18 happy_x_1 of { happy_var_1 -> + case happyOut17 happy_x_2 of { happy_var_2 -> + happyIn15 + (Decl happy_var_1 happy_var_2 + )}} + +happyReduce_19 = happyReduce 4# 11# happyReduction_19 +happyReduction_19 (happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut4 happy_x_1 of { happy_var_1 -> + case happyOut26 happy_x_3 of { happy_var_3 -> + happyIn15 + (Ass happy_var_1 happy_var_3 + ) `HappyStk` happyRest}} + +happyReduce_20 = happySpecReduce_3 11# happyReduction_20 +happyReduction_20 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut4 happy_x_1 of { happy_var_1 -> + happyIn15 + (Incr happy_var_1 + )} + +happyReduce_21 = happySpecReduce_3 11# happyReduction_21 +happyReduction_21 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut4 happy_x_1 of { happy_var_1 -> + happyIn15 + (Decr happy_var_1 + )} + +happyReduce_22 = happySpecReduce_3 11# happyReduction_22 +happyReduction_22 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut26 happy_x_2 of { happy_var_2 -> + happyIn15 + (Ret happy_var_2 + )} + +happyReduce_23 = happySpecReduce_2 11# happyReduction_23 +happyReduction_23 happy_x_2 + happy_x_1 + = happyIn15 + (VRet + ) + +happyReduce_24 = happyReduce 5# 11# happyReduction_24 +happyReduction_24 (happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut26 happy_x_3 of { happy_var_3 -> + case happyOut15 happy_x_5 of { happy_var_5 -> + happyIn15 + (Cond happy_var_3 happy_var_5 + ) `HappyStk` happyRest}} + +happyReduce_25 = happyReduce 7# 11# happyReduction_25 +happyReduction_25 (happy_x_7 `HappyStk` + happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut26 happy_x_3 of { happy_var_3 -> + case happyOut15 happy_x_5 of { happy_var_5 -> + case happyOut15 happy_x_7 of { happy_var_7 -> + happyIn15 + (CondElse happy_var_3 happy_var_5 happy_var_7 + ) `HappyStk` happyRest}}} + +happyReduce_26 = happyReduce 5# 11# happyReduction_26 +happyReduction_26 (happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut26 happy_x_3 of { happy_var_3 -> + case happyOut15 happy_x_5 of { happy_var_5 -> + happyIn15 + (While happy_var_3 happy_var_5 + ) `HappyStk` happyRest}} + +happyReduce_27 = happySpecReduce_2 11# happyReduction_27 +happyReduction_27 happy_x_2 + happy_x_1 + = case happyOut26 happy_x_1 of { happy_var_1 -> + happyIn15 + (SExp happy_var_1 + )} + +happyReduce_28 = happySpecReduce_1 12# happyReduction_28 +happyReduction_28 happy_x_1 + = case happyOut4 happy_x_1 of { happy_var_1 -> + happyIn16 + (NoInit happy_var_1 + )} + +happyReduce_29 = happySpecReduce_3 12# happyReduction_29 +happyReduction_29 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut4 happy_x_1 of { happy_var_1 -> + case happyOut26 happy_x_3 of { happy_var_3 -> + happyIn16 + (Init happy_var_1 happy_var_3 + )}} + +happyReduce_30 = happySpecReduce_1 13# happyReduction_30 +happyReduction_30 happy_x_1 + = case happyOut16 happy_x_1 of { happy_var_1 -> + happyIn17 + ((:[]) happy_var_1 + )} + +happyReduce_31 = happySpecReduce_3 13# happyReduction_31 +happyReduction_31 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut16 happy_x_1 of { happy_var_1 -> + case happyOut17 happy_x_3 of { happy_var_3 -> + happyIn17 + ((:) happy_var_1 happy_var_3 + )}} + +happyReduce_32 = happySpecReduce_1 14# happyReduction_32 +happyReduction_32 happy_x_1 + = happyIn18 + (Int + ) + +happyReduce_33 = happySpecReduce_1 14# happyReduction_33 +happyReduction_33 happy_x_1 + = happyIn18 + (Doub + ) + +happyReduce_34 = happySpecReduce_1 14# happyReduction_34 +happyReduction_34 happy_x_1 + = happyIn18 + (Bool + ) + +happyReduce_35 = happySpecReduce_1 14# happyReduction_35 +happyReduction_35 happy_x_1 + = happyIn18 + (Void + ) + +happyReduce_36 = happySpecReduce_0 15# happyReduction_36 +happyReduction_36 = happyIn19 + ([] + ) + +happyReduce_37 = happySpecReduce_1 15# happyReduction_37 +happyReduction_37 happy_x_1 + = case happyOut18 happy_x_1 of { happy_var_1 -> + happyIn19 + ((:[]) happy_var_1 + )} + +happyReduce_38 = happySpecReduce_3 15# happyReduction_38 +happyReduction_38 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut18 happy_x_1 of { happy_var_1 -> + case happyOut19 happy_x_3 of { happy_var_3 -> + happyIn19 + ((:) happy_var_1 happy_var_3 + )}} + +happyReduce_39 = happySpecReduce_1 16# happyReduction_39 +happyReduction_39 happy_x_1 + = case happyOut4 happy_x_1 of { happy_var_1 -> + happyIn20 + (EVar happy_var_1 + )} + +happyReduce_40 = happySpecReduce_1 16# happyReduction_40 +happyReduction_40 happy_x_1 + = case happyOut5 happy_x_1 of { happy_var_1 -> + happyIn20 + (ELitInt happy_var_1 + )} + +happyReduce_41 = happySpecReduce_1 16# happyReduction_41 +happyReduction_41 happy_x_1 + = case happyOut6 happy_x_1 of { happy_var_1 -> + happyIn20 + (ELitDoub happy_var_1 + )} + +happyReduce_42 = happySpecReduce_1 16# happyReduction_42 +happyReduction_42 happy_x_1 + = happyIn20 + (ELitTrue + ) + +happyReduce_43 = happySpecReduce_1 16# happyReduction_43 +happyReduction_43 happy_x_1 + = happyIn20 + (ELitFalse + ) + +happyReduce_44 = happyReduce 4# 16# happyReduction_44 +happyReduction_44 (happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut4 happy_x_1 of { happy_var_1 -> + case happyOut27 happy_x_3 of { happy_var_3 -> + happyIn20 + (EApp happy_var_1 happy_var_3 + ) `HappyStk` happyRest}} + +happyReduce_45 = happySpecReduce_1 16# happyReduction_45 +happyReduction_45 happy_x_1 + = case happyOut7 happy_x_1 of { happy_var_1 -> + happyIn20 + (EString happy_var_1 + )} + +happyReduce_46 = happySpecReduce_3 16# happyReduction_46 +happyReduction_46 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut26 happy_x_2 of { happy_var_2 -> + happyIn20 + (happy_var_2 + )} + +happyReduce_47 = happySpecReduce_2 17# happyReduction_47 +happyReduction_47 happy_x_2 + happy_x_1 + = case happyOut20 happy_x_2 of { happy_var_2 -> + happyIn21 + (Neg happy_var_2 + )} + +happyReduce_48 = happySpecReduce_2 17# happyReduction_48 +happyReduction_48 happy_x_2 + happy_x_1 + = case happyOut20 happy_x_2 of { happy_var_2 -> + happyIn21 + (Not happy_var_2 + )} + +happyReduce_49 = happySpecReduce_1 17# happyReduction_49 +happyReduction_49 happy_x_1 + = case happyOut20 happy_x_1 of { happy_var_1 -> + happyIn21 + (happy_var_1 + )} + +happyReduce_50 = happySpecReduce_3 18# happyReduction_50 +happyReduction_50 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut22 happy_x_1 of { happy_var_1 -> + case happyOut29 happy_x_2 of { happy_var_2 -> + case happyOut21 happy_x_3 of { happy_var_3 -> + happyIn22 + (EMul happy_var_1 happy_var_2 happy_var_3 + )}}} + +happyReduce_51 = happySpecReduce_1 18# happyReduction_51 +happyReduction_51 happy_x_1 + = case happyOut21 happy_x_1 of { happy_var_1 -> + happyIn22 + (happy_var_1 + )} + +happyReduce_52 = happySpecReduce_3 19# happyReduction_52 +happyReduction_52 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut23 happy_x_1 of { happy_var_1 -> + case happyOut28 happy_x_2 of { happy_var_2 -> + case happyOut22 happy_x_3 of { happy_var_3 -> + happyIn23 + (EAdd happy_var_1 happy_var_2 happy_var_3 + )}}} + +happyReduce_53 = happySpecReduce_1 19# happyReduction_53 +happyReduction_53 happy_x_1 + = case happyOut22 happy_x_1 of { happy_var_1 -> + happyIn23 + (happy_var_1 + )} + +happyReduce_54 = happySpecReduce_3 20# happyReduction_54 +happyReduction_54 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut24 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_2 of { happy_var_2 -> + case happyOut23 happy_x_3 of { happy_var_3 -> + happyIn24 + (ERel happy_var_1 happy_var_2 happy_var_3 + )}}} + +happyReduce_55 = happySpecReduce_1 20# happyReduction_55 +happyReduction_55 happy_x_1 + = case happyOut23 happy_x_1 of { happy_var_1 -> + happyIn24 + (happy_var_1 + )} + +happyReduce_56 = happySpecReduce_3 21# happyReduction_56 +happyReduction_56 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut24 happy_x_1 of { happy_var_1 -> + case happyOut25 happy_x_3 of { happy_var_3 -> + happyIn25 + (EAnd happy_var_1 happy_var_3 + )}} + +happyReduce_57 = happySpecReduce_1 21# happyReduction_57 +happyReduction_57 happy_x_1 + = case happyOut24 happy_x_1 of { happy_var_1 -> + happyIn25 + (happy_var_1 + )} + +happyReduce_58 = happySpecReduce_3 22# happyReduction_58 +happyReduction_58 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut25 happy_x_1 of { happy_var_1 -> + case happyOut26 happy_x_3 of { happy_var_3 -> + happyIn26 + (EOr happy_var_1 happy_var_3 + )}} + +happyReduce_59 = happySpecReduce_1 22# happyReduction_59 +happyReduction_59 happy_x_1 + = case happyOut25 happy_x_1 of { happy_var_1 -> + happyIn26 + (happy_var_1 + )} + +happyReduce_60 = happySpecReduce_0 23# happyReduction_60 +happyReduction_60 = happyIn27 + ([] + ) + +happyReduce_61 = happySpecReduce_1 23# happyReduction_61 +happyReduction_61 happy_x_1 + = case happyOut26 happy_x_1 of { happy_var_1 -> + happyIn27 + ((:[]) happy_var_1 + )} + +happyReduce_62 = happySpecReduce_3 23# happyReduction_62 +happyReduction_62 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut26 happy_x_1 of { happy_var_1 -> + case happyOut27 happy_x_3 of { happy_var_3 -> + happyIn27 + ((:) happy_var_1 happy_var_3 + )}} + +happyReduce_63 = happySpecReduce_1 24# happyReduction_63 +happyReduction_63 happy_x_1 + = happyIn28 + (Plus + ) + +happyReduce_64 = happySpecReduce_1 24# happyReduction_64 +happyReduction_64 happy_x_1 + = happyIn28 + (Minus + ) + +happyReduce_65 = happySpecReduce_1 25# happyReduction_65 +happyReduction_65 happy_x_1 + = happyIn29 + (Times + ) + +happyReduce_66 = happySpecReduce_1 25# happyReduction_66 +happyReduction_66 happy_x_1 + = happyIn29 + (Div + ) + +happyReduce_67 = happySpecReduce_1 25# happyReduction_67 +happyReduction_67 happy_x_1 + = happyIn29 + (Mod + ) + +happyReduce_68 = happySpecReduce_1 26# happyReduction_68 +happyReduction_68 happy_x_1 + = happyIn30 + (LTH + ) + +happyReduce_69 = happySpecReduce_1 26# happyReduction_69 +happyReduction_69 happy_x_1 + = happyIn30 + (LE + ) + +happyReduce_70 = happySpecReduce_1 26# happyReduction_70 +happyReduction_70 happy_x_1 + = happyIn30 + (GTH + ) + +happyReduce_71 = happySpecReduce_1 26# happyReduction_71 +happyReduction_71 happy_x_1 + = happyIn30 + (GE + ) + +happyReduce_72 = happySpecReduce_1 26# happyReduction_72 +happyReduction_72 happy_x_1 + = happyIn30 + (EQU + ) + +happyReduce_73 = happySpecReduce_1 26# happyReduction_73 +happyReduction_73 happy_x_1 + = happyIn30 + (NE + ) + +happyNewToken action sts stk [] = + happyDoAction 39# notHappyAtAll action sts stk [] + +happyNewToken action sts stk (tk:tks) = + let cont i = happyDoAction i tk action sts stk tks in + case tk of { + PT _ (TS "(") -> cont 1#; + PT _ (TS ")") -> cont 2#; + PT _ (TS ",") -> cont 3#; + PT _ (TS "{") -> cont 4#; + PT _ (TS "}") -> cont 5#; + PT _ (TS ";") -> cont 6#; + PT _ (TS "=") -> cont 7#; + PT _ (TS "++") -> cont 8#; + PT _ (TS "--") -> cont 9#; + PT _ (TS "-") -> cont 10#; + PT _ (TS "!") -> cont 11#; + PT _ (TS "&&") -> cont 12#; + PT _ (TS "||") -> cont 13#; + PT _ (TS "<") -> cont 14#; + PT _ (TS ">") -> cont 15#; + PT _ (TS "+") -> cont 16#; + PT _ (TS "*") -> cont 17#; + PT _ (TS "/") -> cont 18#; + PT _ (TS "%") -> cont 19#; + PT _ (TS "<=") -> cont 20#; + PT _ (TS ">=") -> cont 21#; + PT _ (TS "==") -> cont 22#; + PT _ (TS "!=") -> cont 23#; + PT _ (TS "boolean") -> cont 24#; + PT _ (TS "double") -> cont 25#; + PT _ (TS "else") -> cont 26#; + PT _ (TS "false") -> cont 27#; + PT _ (TS "if") -> cont 28#; + PT _ (TS "int") -> cont 29#; + PT _ (TS "return") -> cont 30#; + PT _ (TS "true") -> cont 31#; + PT _ (TS "void") -> cont 32#; + PT _ (TS "while") -> cont 33#; + PT _ (TV happy_dollar_dollar) -> cont 34#; + PT _ (TI happy_dollar_dollar) -> cont 35#; + PT _ (TD happy_dollar_dollar) -> cont 36#; + PT _ (TL happy_dollar_dollar) -> cont 37#; + _ -> cont 38#; + _ -> happyError' (tk:tks) + } + +happyError_ tk tks = happyError' (tk:tks) + +happyThen :: () => Err a -> (a -> Err b) -> Err b +happyThen = (thenM) +happyReturn :: () => a -> Err a +happyReturn = (returnM) +happyThen1 m k tks = (thenM) m (\a -> k a tks) +happyReturn1 :: () => a -> b -> Err a +happyReturn1 = \a tks -> (returnM) a +happyError' :: () => [(Token)] -> Err a +happyError' = happyError + +pProgram tks = happySomeParser where + happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut8 x)) + +happySeq = happyDontSeq + + +returnM :: a -> Err a +returnM = return + +thenM :: Err a -> (a -> Err b) -> Err b +thenM = (>>=) + +happyError :: [Token] -> Err a +happyError ts = + Bad $ "syntax error at " ++ tokenPos ts ++ + case ts of + [] -> [] + [Err _] -> " due to lexer error" + _ -> " before " ++ unwords (map prToken (take 4 ts)) + +myLexer = tokens +{-# LINE 1 "templates/GenericTemplate.hs" #-} +{-# LINE 1 "templates/GenericTemplate.hs" #-} +{-# LINE 1 "" #-} +{-# LINE 1 "" #-} +{-# LINE 1 "templates/GenericTemplate.hs" #-} +-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp + +{-# LINE 28 "templates/GenericTemplate.hs" #-} + + +data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList + + + + + +{-# LINE 49 "templates/GenericTemplate.hs" #-} + +{-# LINE 59 "templates/GenericTemplate.hs" #-} + +{-# LINE 68 "templates/GenericTemplate.hs" #-} + +infixr 9 `HappyStk` +data HappyStk a = HappyStk a (HappyStk a) + +----------------------------------------------------------------------------- +-- starting the parse + +happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll + +----------------------------------------------------------------------------- +-- Accepting the parse + +-- If the current token is 0#, it means we've just accepted a partial +-- parse (a %partial parser). We must ignore the saved token on the top of +-- the stack in this case. +happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) = + happyReturn1 ans +happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans) + +----------------------------------------------------------------------------- +-- Arrays only: do the next action + + + +happyDoAction i tk st + = {- nothing -} + + + case action of + 0# -> {- nothing -} + happyFail i tk st + -1# -> {- nothing -} + happyAccept i tk st + n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -} + + (happyReduceArr Happy_Data_Array.! rule) i tk st + where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#)))))) + n -> {- nothing -} + + + happyShift new_state i tk st + where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) + where off = indexShortOffAddr happyActOffsets st + off_i = (off Happy_GHC_Exts.+# i) + check = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#)) + then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==# i) + else False + action | check = indexShortOffAddr happyTable off_i + | otherwise = indexShortOffAddr happyDefActions st + +{-# LINE 127 "templates/GenericTemplate.hs" #-} + + +indexShortOffAddr (HappyA# arr) off = +#if __GLASGOW_HASKELL__ > 500 + Happy_GHC_Exts.narrow16Int# i +#elif __GLASGOW_HASKELL__ == 500 + Happy_GHC_Exts.intToInt16# i +#else + Happy_GHC_Exts.iShiftRA# (Happy_GHC_Exts.iShiftL# i 16#) 16# +#endif + where +#if __GLASGOW_HASKELL__ >= 503 + i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low) +#else + i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.shiftL# high 8#) low) +#endif + high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#))) + low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off')) + off' = off Happy_GHC_Exts.*# 2# + + + + + +data HappyAddr = HappyA# Happy_GHC_Exts.Addr# + + + + +----------------------------------------------------------------------------- +-- HappyState data type (not arrays) + +{-# LINE 170 "templates/GenericTemplate.hs" #-} + +----------------------------------------------------------------------------- +-- Shifting a token + +happyShift new_state 0# tk st sts stk@(x `HappyStk` _) = + let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in +-- trace "shifting the error token" $ + happyDoAction i tk new_state (HappyCons (st) (sts)) (stk) + +happyShift new_state i tk st sts stk = + happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk) + +-- happyReduce is specialised for the common cases. + +happySpecReduce_0 i fn 0# tk st sts stk + = happyFail 0# tk st sts stk +happySpecReduce_0 nt fn j tk st@((action)) sts stk + = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk) + +happySpecReduce_1 i fn 0# tk st sts stk + = happyFail 0# tk st sts stk +happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk') + = let r = fn v1 in + happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk')) + +happySpecReduce_2 i fn 0# tk st sts stk + = happyFail 0# tk st sts stk +happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk') + = let r = fn v1 v2 in + happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk')) + +happySpecReduce_3 i fn 0# tk st sts stk + = happyFail 0# tk st sts stk +happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk') + = let r = fn v1 v2 v3 in + happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk')) + +happyReduce k i fn 0# tk st sts stk + = happyFail 0# tk st sts stk +happyReduce k nt fn j tk st sts stk + = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of + sts1@((HappyCons (st1@(action)) (_))) -> + let r = fn stk in -- it doesn't hurt to always seq here... + happyDoSeq r (happyGoto nt j tk st1 sts1 r) + +happyMonadReduce k nt fn 0# tk st sts stk + = happyFail 0# tk st sts stk +happyMonadReduce k nt fn j tk st sts stk = + happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk)) + where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts)) + drop_stk = happyDropStk k stk + +happyMonad2Reduce k nt fn 0# tk st sts stk + = happyFail 0# tk st sts stk +happyMonad2Reduce k nt fn j tk st sts stk = + happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk)) + where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts)) + drop_stk = happyDropStk k stk + + off = indexShortOffAddr happyGotoOffsets st1 + off_i = (off Happy_GHC_Exts.+# nt) + new_state = indexShortOffAddr happyTable off_i + + + + +happyDrop 0# l = l +happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t + +happyDropStk 0# l = l +happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs + +----------------------------------------------------------------------------- +-- Moving to a new state after a reduction + + +happyGoto nt j tk st = + {- nothing -} + happyDoAction j tk new_state + where off = indexShortOffAddr happyGotoOffsets st + off_i = (off Happy_GHC_Exts.+# nt) + new_state = indexShortOffAddr happyTable off_i + + + + +----------------------------------------------------------------------------- +-- Error recovery (0# is the error token) + +-- parse error if we are in recovery and we fail again +happyFail 0# tk old_st _ stk = +-- trace "failing" $ + happyError_ tk + +{- We don't need state discarding for our restricted implementation of + "error". In fact, it can cause some bogus parses, so I've disabled it + for now --SDM + +-- discard a state +happyFail 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) = +-- trace ("discarding state, depth " ++ show (length stk)) $ + happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk)) +-} + +-- Enter error recovery: generate an error token, +-- save the old token and carry on. +happyFail i tk (action) sts stk = +-- trace "entering error recovery" $ + happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk) + +-- Internal happy errors: + +notHappyAtAll = error "Internal Happy error\n" + +----------------------------------------------------------------------------- +-- Hack to get the typechecker to accept our action functions + + +happyTcHack :: Happy_GHC_Exts.Int# -> a -> a +happyTcHack x y = y +{-# INLINE happyTcHack #-} + + +----------------------------------------------------------------------------- +-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq +-- otherwise it emits +-- happySeq = happyDontSeq + +happyDoSeq, happyDontSeq :: a -> b -> b +happyDoSeq a b = a `seq` b +happyDontSeq a b = b + +----------------------------------------------------------------------------- +-- Don't inline any functions from the template. GHC has a nasty habit +-- of deciding to inline happyGoto everywhere, which increases the size of +-- the generated parser quite a bit. + + +{-# NOINLINE happyDoAction #-} +{-# NOINLINE happyTable #-} +{-# NOINLINE happyCheck #-} +{-# NOINLINE happyActOffsets #-} +{-# NOINLINE happyGotoOffsets #-} +{-# NOINLINE happyDefActions #-} + +{-# NOINLINE happyShift #-} +{-# NOINLINE happySpecReduce_0 #-} +{-# NOINLINE happySpecReduce_1 #-} +{-# NOINLINE happySpecReduce_2 #-} +{-# NOINLINE happySpecReduce_3 #-} +{-# NOINLINE happyReduce #-} +{-# NOINLINE happyMonadReduce #-} +{-# NOINLINE happyGoto #-} +{-# NOINLINE happyFail #-} + +-- end of Happy Template. diff --git a/ParJavalette.o b/ParJavalette.o new file mode 100644 index 0000000..1b89752 Binary files /dev/null and b/ParJavalette.o differ diff --git a/ParJavalette.y b/ParJavalette.y new file mode 100644 index 0000000..ab8f3f1 --- /dev/null +++ b/ParJavalette.y @@ -0,0 +1,222 @@ +-- This Happy file was machine-generated by the BNF converter +{ +{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-} +module ParJavalette where +import AbsJavalette +import LexJavalette +import ErrM +} + +%name pProgram Program + +-- no lexer declaration +%monad { Err } { thenM } { returnM } +%tokentype { Token } + +%token + '(' { PT _ (TS "(") } + ')' { PT _ (TS ")") } + ',' { PT _ (TS ",") } + '{' { PT _ (TS "{") } + '}' { PT _ (TS "}") } + ';' { PT _ (TS ";") } + '=' { PT _ (TS "=") } + '++' { PT _ (TS "++") } + '--' { PT _ (TS "--") } + '-' { PT _ (TS "-") } + '!' { PT _ (TS "!") } + '&&' { PT _ (TS "&&") } + '||' { PT _ (TS "||") } + '<' { PT _ (TS "<") } + '>' { PT _ (TS ">") } + '+' { PT _ (TS "+") } + '*' { PT _ (TS "*") } + '/' { PT _ (TS "/") } + '%' { PT _ (TS "%") } + '<=' { PT _ (TS "<=") } + '>=' { PT _ (TS ">=") } + '==' { PT _ (TS "==") } + '!=' { PT _ (TS "!=") } + 'boolean' { PT _ (TS "boolean") } + 'double' { PT _ (TS "double") } + 'else' { PT _ (TS "else") } + 'false' { PT _ (TS "false") } + 'if' { PT _ (TS "if") } + 'int' { PT _ (TS "int") } + 'return' { PT _ (TS "return") } + 'true' { PT _ (TS "true") } + 'void' { PT _ (TS "void") } + 'while' { PT _ (TS "while") } + +L_ident { PT _ (TV $$) } +L_integ { PT _ (TI $$) } +L_doubl { PT _ (TD $$) } +L_quoted { PT _ (TL $$) } +L_err { _ } + + +%% + +Ident :: { Ident } : L_ident { Ident $1 } +Integer :: { Integer } : L_integ { (read $1) :: Integer } +Double :: { Double } : L_doubl { (read $1) :: Double } +String :: { String } : L_quoted { $1 } + +Program :: { Program } +Program : ListTopDef { Program $1 } + + +TopDef :: { TopDef } +TopDef : Type Ident '(' ListArg ')' Block { FnDef $1 $2 $4 $6 } + + +ListTopDef :: { [TopDef] } +ListTopDef : TopDef { (:[]) $1 } + | TopDef ListTopDef { (:) $1 $2 } + + +Arg :: { Arg } +Arg : Type Ident { Arg $1 $2 } + + +ListArg :: { [Arg] } +ListArg : {- empty -} { [] } + | Arg { (:[]) $1 } + | Arg ',' ListArg { (:) $1 $3 } + + +Block :: { Block } +Block : '{' ListStmt '}' { Block (reverse $2) } + + +ListStmt :: { [Stmt] } +ListStmt : {- empty -} { [] } + | ListStmt Stmt { flip (:) $1 $2 } + + +Stmt :: { Stmt } +Stmt : ';' { Empty } + | Block { BStmt $1 } + | Type ListItem ';' { Decl $1 $2 } + | Ident '=' Expr ';' { Ass $1 $3 } + | Ident '++' ';' { Incr $1 } + | Ident '--' ';' { Decr $1 } + | 'return' Expr ';' { Ret $2 } + | 'return' ';' { VRet } + | 'if' '(' Expr ')' Stmt { Cond $3 $5 } + | 'if' '(' Expr ')' Stmt 'else' Stmt { CondElse $3 $5 $7 } + | 'while' '(' Expr ')' Stmt { While $3 $5 } + | Expr ';' { SExp $1 } + + +Item :: { Item } +Item : Ident { NoInit $1 } + | Ident '=' Expr { Init $1 $3 } + + +ListItem :: { [Item] } +ListItem : Item { (:[]) $1 } + | Item ',' ListItem { (:) $1 $3 } + + +Type :: { Type } +Type : 'int' { Int } + | 'double' { Doub } + | 'boolean' { Bool } + | 'void' { Void } + + +ListType :: { [Type] } +ListType : {- empty -} { [] } + | Type { (:[]) $1 } + | Type ',' ListType { (:) $1 $3 } + + +Expr6 :: { Expr } +Expr6 : Ident { EVar $1 } + | Integer { ELitInt $1 } + | Double { ELitDoub $1 } + | 'true' { ELitTrue } + | 'false' { ELitFalse } + | Ident '(' ListExpr ')' { EApp $1 $3 } + | String { EString $1 } + | '(' Expr ')' { $2 } + + +Expr5 :: { Expr } +Expr5 : '-' Expr6 { Neg $2 } + | '!' Expr6 { Not $2 } + | Expr6 { $1 } + + +Expr4 :: { Expr } +Expr4 : Expr4 MulOp Expr5 { EMul $1 $2 $3 } + | Expr5 { $1 } + + +Expr3 :: { Expr } +Expr3 : Expr3 AddOp Expr4 { EAdd $1 $2 $3 } + | Expr4 { $1 } + + +Expr2 :: { Expr } +Expr2 : Expr2 RelOp Expr3 { ERel $1 $2 $3 } + | Expr3 { $1 } + + +Expr1 :: { Expr } +Expr1 : Expr2 '&&' Expr1 { EAnd $1 $3 } + | Expr2 { $1 } + + +Expr :: { Expr } +Expr : Expr1 '||' Expr { EOr $1 $3 } + | Expr1 { $1 } + + +ListExpr :: { [Expr] } +ListExpr : {- empty -} { [] } + | Expr { (:[]) $1 } + | Expr ',' ListExpr { (:) $1 $3 } + + +AddOp :: { AddOp } +AddOp : '+' { Plus } + | '-' { Minus } + + +MulOp :: { MulOp } +MulOp : '*' { Times } + | '/' { Div } + | '%' { Mod } + + +RelOp :: { RelOp } +RelOp : '<' { LTH } + | '<=' { LE } + | '>' { GTH } + | '>=' { GE } + | '==' { EQU } + | '!=' { NE } + + + +{ + +returnM :: a -> Err a +returnM = return + +thenM :: Err a -> (a -> Err b) -> Err b +thenM = (>>=) + +happyError :: [Token] -> Err a +happyError ts = + Bad $ "syntax error at " ++ tokenPos ts ++ + case ts of + [] -> [] + [Err _] -> " due to lexer error" + _ -> " before " ++ unwords (map prToken (take 4 ts)) + +myLexer = tokens +} + diff --git a/ParJavalette.y.bak b/ParJavalette.y.bak new file mode 100644 index 0000000..c2d982c --- /dev/null +++ b/ParJavalette.y.bak @@ -0,0 +1,222 @@ +-- This Happy file was machine-generated by the BNF converter +{ +{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-} +module ParJavalette where +import AbsJavalette +import LexJavalette +import ErrM +} + +%name pProgram Program + +-- no lexer declaration +%monad { Err } { thenM } { returnM } +%tokentype { Token } + +%token + '(' { PT _ (TS "(") } + ')' { PT _ (TS ")") } + ',' { PT _ (TS ",") } + '{' { PT _ (TS "{") } + '}' { PT _ (TS "}") } + ';' { PT _ (TS ";") } + '=' { PT _ (TS "=") } + '++' { PT _ (TS "++") } + '--' { PT _ (TS "--") } + '-' { PT _ (TS "-") } + '!' { PT _ (TS "!") } + '&&' { PT _ (TS "&&") } + '||' { PT _ (TS "||") } + '+' { PT _ (TS "+") } + '*' { PT _ (TS "*") } + '/' { PT _ (TS "/") } + '%' { PT _ (TS "%") } + '<' { PT _ (TS "<") } + '<=' { PT _ (TS "<=") } + '>' { PT _ (TS ">") } + '>=' { PT _ (TS ">=") } + '==' { PT _ (TS "==") } + '!=' { PT _ (TS "!=") } + 'boolean' { PT _ (TS "boolean") } + 'double' { PT _ (TS "double") } + 'else' { PT _ (TS "else") } + 'false' { PT _ (TS "false") } + 'if' { PT _ (TS "if") } + 'int' { PT _ (TS "int") } + 'return' { PT _ (TS "return") } + 'true' { PT _ (TS "true") } + 'void' { PT _ (TS "void") } + 'while' { PT _ (TS "while") } + +L_ident { PT _ (TV $$) } +L_integ { PT _ (TI $$) } +L_doubl { PT _ (TD $$) } +L_quoted { PT _ (TL $$) } +L_err { _ } + + +%% + +Ident :: { Ident } : L_ident { Ident $1 } +Integer :: { Integer } : L_integ { (read $1) :: Integer } +Double :: { Double } : L_doubl { (read $1) :: Double } +String :: { String } : L_quoted { $1 } + +Program :: { Program } +Program : ListTopDef { Program $1 } + + +TopDef :: { TopDef } +TopDef : Type Ident '(' ListArg ')' Block { FnDef $1 $2 $4 $6 } + + +ListTopDef :: { [TopDef] } +ListTopDef : TopDef { (:[]) $1 } + | TopDef ListTopDef { (:) $1 $2 } + + +Arg :: { Arg } +Arg : Type Ident { Arg $1 $2 } + + +ListArg :: { [Arg] } +ListArg : {- empty -} { [] } + | Arg { (:[]) $1 } + | Arg ',' ListArg { (:) $1 $3 } + + +Block :: { Block } +Block : '{' ListStmt '}' { Block (reverse $2) } + + +ListStmt :: { [Stmt] } +ListStmt : {- empty -} { [] } + | ListStmt Stmt { flip (:) $1 $2 } + + +Stmt :: { Stmt } +Stmt : ';' { Empty } + | Block { BStmt $1 } + | Type ListItem ';' { Decl $1 $2 } + | Ident '=' Expr ';' { Ass $1 $3 } + | Ident '++' ';' { Incr $1 } + | Ident '--' ';' { Decr $1 } + | 'return' Expr ';' { Ret $2 } + | 'return' ';' { VRet } + | 'if' '(' Expr ')' Stmt { Cond $3 $5 } + | 'if' '(' Expr ')' Stmt 'else' Stmt { CondElse $3 $5 $7 } + | 'while' '(' Expr ')' Stmt { While $3 $5 } + | Expr ';' { SExp $1 } + + +Item :: { Item } +Item : Ident { NoInit $1 } + | Ident '=' Expr { Init $1 $3 } + + +ListItem :: { [Item] } +ListItem : Item { (:[]) $1 } + | Item ',' ListItem { (:) $1 $3 } + + +Type :: { Type } +Type : 'int' { Int } + | 'double' { Doub } + | 'boolean' { Bool } + | 'void' { Void } + + +ListType :: { [Type] } +ListType : {- empty -} { [] } + | Type { (:[]) $1 } + | Type ',' ListType { (:) $1 $3 } + + +Expr6 :: { Expr } +Expr6 : Ident { EVar $1 } + | Integer { ELitInt $1 } + | Double { ELitDoub $1 } + | 'true' { ELitTrue } + | 'false' { ELitFalse } + | Ident '(' ListExpr ')' { EApp $1 $3 } + | String { EString $1 } + | '(' Expr ')' { $2 } + + +Expr5 :: { Expr } +Expr5 : '-' Expr6 { Neg $2 } + | '!' Expr6 { Not $2 } + | Expr6 { $1 } + + +Expr4 :: { Expr } +Expr4 : Expr4 MulOp Expr5 { EMul $1 $2 $3 } + | Expr5 { $1 } + + +Expr3 :: { Expr } +Expr3 : Expr3 AddOp Expr4 { EAdd $1 $2 $3 } + | Expr4 { $1 } + + +Expr2 :: { Expr } +Expr2 : Expr2 RelOp Expr3 { ERel $1 $2 $3 } + | Expr3 { $1 } + + +Expr1 :: { Expr } +Expr1 : Expr2 '&&' Expr1 { EAnd $1 $3 } + | Expr2 { $1 } + + +Expr :: { Expr } +Expr : Expr1 '||' Expr { EOr $1 $3 } + | Expr1 { $1 } + + +ListExpr :: { [Expr] } +ListExpr : {- empty -} { [] } + | Expr { (:[]) $1 } + | Expr ',' ListExpr { (:) $1 $3 } + + +AddOp :: { AddOp } +AddOp : '+' { Plus } + | '-' { Minus } + + +MulOp :: { MulOp } +MulOp : '*' { Times } + | '/' { Div } + | '%' { Mod } + + +RelOp :: { RelOp } +RelOp : '<' { LTH } + | '<=' { LE } + | '>' { GTH } + | '>=' { GE } + | '==' { EQU } + | '!=' { NE } + + + +{ + +returnM :: a -> Err a +returnM = return + +thenM :: Err a -> (a -> Err b) -> Err b +thenM = (>>=) + +happyError :: [Token] -> Err a +happyError ts = + Bad $ "syntax error at " ++ tokenPos ts ++ + case ts of + [] -> [] + [Err _] -> " due to lexer error" + _ -> " before " ++ unwords (map prToken (take 4 ts)) + +myLexer = tokens +} + diff --git a/PrintJavalette.hi b/PrintJavalette.hi new file mode 100644 index 0000000..d936d55 Binary files /dev/null and b/PrintJavalette.hi differ diff --git a/PrintJavalette.hs b/PrintJavalette.hs new file mode 100644 index 0000000..fe2f07a --- /dev/null +++ b/PrintJavalette.hs @@ -0,0 +1,199 @@ +{-# OPTIONS -fno-warn-incomplete-patterns #-} +module PrintJavalette where + +-- pretty-printer generated by the BNF converter + +import AbsJavalette +import Char + +-- the top-level printing method +printTree :: Print a => a -> String +printTree = render . prt 0 + +type Doc = [ShowS] -> [ShowS] + +doc :: ShowS -> Doc +doc = (:) + +render :: Doc -> String +render d = rend 0 (map ($ "") $ d []) "" where + rend i ss = case ss of + "[" :ts -> showChar '[' . rend i ts + "(" :ts -> showChar '(' . rend i ts + "{" :ts -> showChar '{' . new (i+1) . rend (i+1) ts + "}" : ";":ts -> new (i-1) . space "}" . showChar ';' . new (i-1) . rend (i-1) ts + "}" :ts -> new (i-1) . showChar '}' . new (i-1) . rend (i-1) ts + ";" :ts -> showChar ';' . new i . rend i ts + t : "," :ts -> showString t . space "," . rend i ts + t : ")" :ts -> showString t . showChar ')' . rend i ts + t : "]" :ts -> showString t . showChar ']' . rend i ts + t :ts -> space t . rend i ts + _ -> id + new i = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace + space t = showString t . (\s -> if null s then "" else (' ':s)) + +parenth :: Doc -> Doc +parenth ss = doc (showChar '(') . ss . doc (showChar ')') + +concatS :: [ShowS] -> ShowS +concatS = foldr (.) id + +concatD :: [Doc] -> Doc +concatD = foldr (.) id + +replicateS :: Int -> ShowS -> ShowS +replicateS n f = concatS (replicate n f) + +-- the printer class does the job +class Print a where + prt :: Int -> a -> Doc + prtList :: [a] -> Doc + prtList = concatD . map (prt 0) + +instance Print a => Print [a] where + prt _ = prtList + +instance Print Char where + prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'') + prtList s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"') + +mkEsc :: Char -> Char -> ShowS +mkEsc q s = case s of + _ | s == q -> showChar '\\' . showChar s + '\\'-> showString "\\\\" + '\n' -> showString "\\n" + '\t' -> showString "\\t" + _ -> showChar s + +prPrec :: Int -> Int -> Doc -> Doc +prPrec i j = if j prPrec i 0 (concatD [prt 0 topdefs]) + + +instance Print TopDef where + prt i e = case e of + FnDef type' id args block -> prPrec i 0 (concatD [prt 0 type' , prt 0 id , doc (showString "(") , prt 0 args , doc (showString ")") , prt 0 block]) + + prtList es = case es of + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , prt 0 xs]) + +instance Print Arg where + prt i e = case e of + Arg type' id -> prPrec i 0 (concatD [prt 0 type' , prt 0 id]) + + prtList es = case es of + [] -> (concatD []) + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print Block where + prt i e = case e of + Block stmts -> prPrec i 0 (concatD [doc (showString "{") , prt 0 stmts , doc (showString "}")]) + + +instance Print Stmt where + prt i e = case e of + Empty -> prPrec i 0 (concatD [doc (showString ";")]) + BStmt block -> prPrec i 0 (concatD [prt 0 block]) + Decl type' items -> prPrec i 0 (concatD [prt 0 type' , prt 0 items , doc (showString ";")]) + Ass id expr -> prPrec i 0 (concatD [prt 0 id , doc (showString "=") , prt 0 expr , doc (showString ";")]) + Incr id -> prPrec i 0 (concatD [prt 0 id , doc (showString "++") , doc (showString ";")]) + Decr id -> prPrec i 0 (concatD [prt 0 id , doc (showString "--") , doc (showString ";")]) + Ret expr -> prPrec i 0 (concatD [doc (showString "return") , prt 0 expr , doc (showString ";")]) + VRet -> prPrec i 0 (concatD [doc (showString "return") , doc (showString ";")]) + Cond expr stmt -> prPrec i 0 (concatD [doc (showString "if") , doc (showString "(") , prt 0 expr , doc (showString ")") , prt 0 stmt]) + CondElse expr stmt0 stmt -> prPrec i 0 (concatD [doc (showString "if") , doc (showString "(") , prt 0 expr , doc (showString ")") , prt 0 stmt0 , doc (showString "else") , prt 0 stmt]) + While expr stmt -> prPrec i 0 (concatD [doc (showString "while") , doc (showString "(") , prt 0 expr , doc (showString ")") , prt 0 stmt]) + SExp expr -> prPrec i 0 (concatD [prt 0 expr , doc (showString ";")]) + + prtList es = case es of + [] -> (concatD []) + x:xs -> (concatD [prt 0 x , prt 0 xs]) + +instance Print Item where + prt i e = case e of + NoInit id -> prPrec i 0 (concatD [prt 0 id]) + Init id expr -> prPrec i 0 (concatD [prt 0 id , doc (showString "=") , prt 0 expr]) + + prtList es = case es of + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print Type where + prt i e = case e of + Int -> prPrec i 0 (concatD [doc (showString "int")]) + Doub -> prPrec i 0 (concatD [doc (showString "double")]) + Bool -> prPrec i 0 (concatD [doc (showString "boolean")]) + Void -> prPrec i 0 (concatD [doc (showString "void")]) + Fun type' types -> prPrec i 0 (concatD [prt 0 type' , doc (showString "(") , prt 0 types , doc (showString ")")]) + + prtList es = case es of + [] -> (concatD []) + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print Expr where + prt i e = case e of + EVar id -> prPrec i 6 (concatD [prt 0 id]) + ELitInt n -> prPrec i 6 (concatD [prt 0 n]) + ELitDoub d -> prPrec i 6 (concatD [prt 0 d]) + ELitTrue -> prPrec i 6 (concatD [doc (showString "true")]) + ELitFalse -> prPrec i 6 (concatD [doc (showString "false")]) + EApp id exprs -> prPrec i 6 (concatD [prt 0 id , doc (showString "(") , prt 0 exprs , doc (showString ")")]) + EString str -> prPrec i 6 (concatD [prt 0 str]) + Neg expr -> prPrec i 5 (concatD [doc (showString "-") , prt 6 expr]) + Not expr -> prPrec i 5 (concatD [doc (showString "!") , prt 6 expr]) + EMul expr0 mulop expr -> prPrec i 4 (concatD [prt 4 expr0 , prt 0 mulop , prt 5 expr]) + EAdd expr0 addop expr -> prPrec i 3 (concatD [prt 3 expr0 , prt 0 addop , prt 4 expr]) + ERel expr0 relop expr -> prPrec i 2 (concatD [prt 2 expr0 , prt 0 relop , prt 3 expr]) + EAnd expr0 expr -> prPrec i 1 (concatD [prt 2 expr0 , doc (showString "&&") , prt 1 expr]) + EOr expr0 expr -> prPrec i 0 (concatD [prt 1 expr0 , doc (showString "||") , prt 0 expr]) + TAnot type' expr -> prPrec i 0 (concatD [doc (showString "<") , prt 0 type' , doc (showString ">") , doc (showString "(") , prt 0 expr , doc (showString ")")]) + + prtList es = case es of + [] -> (concatD []) + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print AddOp where + prt i e = case e of + Plus -> prPrec i 0 (concatD [doc (showString "+")]) + Minus -> prPrec i 0 (concatD [doc (showString "-")]) + + +instance Print MulOp where + prt i e = case e of + Times -> prPrec i 0 (concatD [doc (showString "*")]) + Div -> prPrec i 0 (concatD [doc (showString "/")]) + Mod -> prPrec i 0 (concatD [doc (showString "%")]) + + +instance Print RelOp where + prt i e = case e of + LTH -> prPrec i 0 (concatD [doc (showString "<")]) + LE -> prPrec i 0 (concatD [doc (showString "<=")]) + GTH -> prPrec i 0 (concatD [doc (showString ">")]) + GE -> prPrec i 0 (concatD [doc (showString ">=")]) + EQU -> prPrec i 0 (concatD [doc (showString "==")]) + NE -> prPrec i 0 (concatD [doc (showString "!=")]) + + + diff --git a/PrintJavalette.hs.bak b/PrintJavalette.hs.bak new file mode 100644 index 0000000..809db80 --- /dev/null +++ b/PrintJavalette.hs.bak @@ -0,0 +1,198 @@ +{-# OPTIONS -fno-warn-incomplete-patterns #-} +module PrintJavalette where + +-- pretty-printer generated by the BNF converter + +import AbsJavalette +import Char + +-- the top-level printing method +printTree :: Print a => a -> String +printTree = render . prt 0 + +type Doc = [ShowS] -> [ShowS] + +doc :: ShowS -> Doc +doc = (:) + +render :: Doc -> String +render d = rend 0 (map ($ "") $ d []) "" where + rend i ss = case ss of + "[" :ts -> showChar '[' . rend i ts + "(" :ts -> showChar '(' . rend i ts + "{" :ts -> showChar '{' . new (i+1) . rend (i+1) ts + "}" : ";":ts -> new (i-1) . space "}" . showChar ';' . new (i-1) . rend (i-1) ts + "}" :ts -> new (i-1) . showChar '}' . new (i-1) . rend (i-1) ts + ";" :ts -> showChar ';' . new i . rend i ts + t : "," :ts -> showString t . space "," . rend i ts + t : ")" :ts -> showString t . showChar ')' . rend i ts + t : "]" :ts -> showString t . showChar ']' . rend i ts + t :ts -> space t . rend i ts + _ -> id + new i = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace + space t = showString t . (\s -> if null s then "" else (' ':s)) + +parenth :: Doc -> Doc +parenth ss = doc (showChar '(') . ss . doc (showChar ')') + +concatS :: [ShowS] -> ShowS +concatS = foldr (.) id + +concatD :: [Doc] -> Doc +concatD = foldr (.) id + +replicateS :: Int -> ShowS -> ShowS +replicateS n f = concatS (replicate n f) + +-- the printer class does the job +class Print a where + prt :: Int -> a -> Doc + prtList :: [a] -> Doc + prtList = concatD . map (prt 0) + +instance Print a => Print [a] where + prt _ = prtList + +instance Print Char where + prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'') + prtList s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"') + +mkEsc :: Char -> Char -> ShowS +mkEsc q s = case s of + _ | s == q -> showChar '\\' . showChar s + '\\'-> showString "\\\\" + '\n' -> showString "\\n" + '\t' -> showString "\\t" + _ -> showChar s + +prPrec :: Int -> Int -> Doc -> Doc +prPrec i j = if j prPrec i 0 (concatD [prt 0 topdefs]) + + +instance Print TopDef where + prt i e = case e of + FnDef type' id args block -> prPrec i 0 (concatD [prt 0 type' , prt 0 id , doc (showString "(") , prt 0 args , doc (showString ")") , prt 0 block]) + + prtList es = case es of + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , prt 0 xs]) + +instance Print Arg where + prt i e = case e of + Arg type' id -> prPrec i 0 (concatD [prt 0 type' , prt 0 id]) + + prtList es = case es of + [] -> (concatD []) + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print Block where + prt i e = case e of + Block stmts -> prPrec i 0 (concatD [doc (showString "{") , prt 0 stmts , doc (showString "}")]) + + +instance Print Stmt where + prt i e = case e of + Empty -> prPrec i 0 (concatD [doc (showString ";")]) + BStmt block -> prPrec i 0 (concatD [prt 0 block]) + Decl type' items -> prPrec i 0 (concatD [prt 0 type' , prt 0 items , doc (showString ";")]) + Ass id expr -> prPrec i 0 (concatD [prt 0 id , doc (showString "=") , prt 0 expr , doc (showString ";")]) + Incr id -> prPrec i 0 (concatD [prt 0 id , doc (showString "++") , doc (showString ";")]) + Decr id -> prPrec i 0 (concatD [prt 0 id , doc (showString "--") , doc (showString ";")]) + Ret expr -> prPrec i 0 (concatD [doc (showString "return") , prt 0 expr , doc (showString ";")]) + VRet -> prPrec i 0 (concatD [doc (showString "return") , doc (showString ";")]) + Cond expr stmt -> prPrec i 0 (concatD [doc (showString "if") , doc (showString "(") , prt 0 expr , doc (showString ")") , prt 0 stmt]) + CondElse expr stmt0 stmt -> prPrec i 0 (concatD [doc (showString "if") , doc (showString "(") , prt 0 expr , doc (showString ")") , prt 0 stmt0 , doc (showString "else") , prt 0 stmt]) + While expr stmt -> prPrec i 0 (concatD [doc (showString "while") , doc (showString "(") , prt 0 expr , doc (showString ")") , prt 0 stmt]) + SExp expr -> prPrec i 0 (concatD [prt 0 expr , doc (showString ";")]) + + prtList es = case es of + [] -> (concatD []) + x:xs -> (concatD [prt 0 x , prt 0 xs]) + +instance Print Item where + prt i e = case e of + NoInit id -> prPrec i 0 (concatD [prt 0 id]) + Init id expr -> prPrec i 0 (concatD [prt 0 id , doc (showString "=") , prt 0 expr]) + + prtList es = case es of + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print Type where + prt i e = case e of + Int -> prPrec i 0 (concatD [doc (showString "int")]) + Doub -> prPrec i 0 (concatD [doc (showString "double")]) + Bool -> prPrec i 0 (concatD [doc (showString "boolean")]) + Void -> prPrec i 0 (concatD [doc (showString "void")]) + Fun type' types -> prPrec i 0 (concatD [prt 0 type' , doc (showString "(") , prt 0 types , doc (showString ")")]) + + prtList es = case es of + [] -> (concatD []) + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print Expr where + prt i e = case e of + EVar id -> prPrec i 6 (concatD [prt 0 id]) + ELitInt n -> prPrec i 6 (concatD [prt 0 n]) + ELitDoub d -> prPrec i 6 (concatD [prt 0 d]) + ELitTrue -> prPrec i 6 (concatD [doc (showString "true")]) + ELitFalse -> prPrec i 6 (concatD [doc (showString "false")]) + EApp id exprs -> prPrec i 6 (concatD [prt 0 id , doc (showString "(") , prt 0 exprs , doc (showString ")")]) + EString str -> prPrec i 6 (concatD [prt 0 str]) + Neg expr -> prPrec i 5 (concatD [doc (showString "-") , prt 6 expr]) + Not expr -> prPrec i 5 (concatD [doc (showString "!") , prt 6 expr]) + EMul expr0 mulop expr -> prPrec i 4 (concatD [prt 4 expr0 , prt 0 mulop , prt 5 expr]) + EAdd expr0 addop expr -> prPrec i 3 (concatD [prt 3 expr0 , prt 0 addop , prt 4 expr]) + ERel expr0 relop expr -> prPrec i 2 (concatD [prt 2 expr0 , prt 0 relop , prt 3 expr]) + EAnd expr0 expr -> prPrec i 1 (concatD [prt 2 expr0 , doc (showString "&&") , prt 1 expr]) + EOr expr0 expr -> prPrec i 0 (concatD [prt 1 expr0 , doc (showString "||") , prt 0 expr]) + + prtList es = case es of + [] -> (concatD []) + [x] -> (concatD [prt 0 x]) + x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs]) + +instance Print AddOp where + prt i e = case e of + Plus -> prPrec i 0 (concatD [doc (showString "+")]) + Minus -> prPrec i 0 (concatD [doc (showString "-")]) + + +instance Print MulOp where + prt i e = case e of + Times -> prPrec i 0 (concatD [doc (showString "*")]) + Div -> prPrec i 0 (concatD [doc (showString "/")]) + Mod -> prPrec i 0 (concatD [doc (showString "%")]) + + +instance Print RelOp where + prt i e = case e of + LTH -> prPrec i 0 (concatD [doc (showString "<")]) + LE -> prPrec i 0 (concatD [doc (showString "<=")]) + GTH -> prPrec i 0 (concatD [doc (showString ">")]) + GE -> prPrec i 0 (concatD [doc (showString ">=")]) + EQU -> prPrec i 0 (concatD [doc (showString "==")]) + NE -> prPrec i 0 (concatD [doc (showString "!=")]) + + + diff --git a/PrintJavalette.o b/PrintJavalette.o new file mode 100644 index 0000000..e0d9c1e Binary files /dev/null and b/PrintJavalette.o differ diff --git a/PrintUtils.class b/PrintUtils.class new file mode 100644 index 0000000..22fbedd Binary files /dev/null and b/PrintUtils.class differ diff --git a/Runtime.class b/Runtime.class new file mode 100644 index 0000000..1d929d6 Binary files /dev/null and b/Runtime.class differ diff --git a/Runtime.java b/Runtime.java new file mode 100644 index 0000000..8f61829 --- /dev/null +++ b/Runtime.java @@ -0,0 +1,68 @@ +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.io.IOException; + +class Runtime { + + public static void main(String [] argv) { + Runtime.printString("Runtime test\nWrite a int: "); + + int i = Runtime.readInt(); + Runtime.printString("Int: "); + Runtime.printInt(i); + + Runtime.printString("\nWrite a double: "); + double d = Runtime.readDouble(); + Runtime.printString("Double: "); + Runtime.printDouble(d); + Runtime.printString("\n"); + } + + public static void printInt(int i) { + System.out.print(i); + } + + public static void printDouble(double d) { + System.out.print(d); + } + + public static void printString(String s) { + System.out.print(s); + } + + public static int readInt() { + String line = null; + int val = 0; + try { + BufferedReader is = new BufferedReader( + new InputStreamReader(System.in)); + line = is.readLine(); + val = Integer.parseInt(line); + } catch (NumberFormatException ex) { + System.err.println("Not a valid number: " + line); + } catch (IOException e) { + System.err.println("Unexpected IO ERROR: " + e); + } + + return val; + } + + public static double readDouble() { + InputStreamReader convert = new InputStreamReader(System.in); + BufferedReader stdin = new BufferedReader(convert); + String instr = null; + double val = 0; + + try { + instr = stdin.readLine(); + val = new Double(instr).doubleValue();; + } catch(NumberFormatException ex) { + System.err.println("Not a valid number: " + instr); + } catch(IOException e) { + System.err.println("Unexpected IO ERROR: " + e); + } + + return val; + } + +} \ No newline at end of file diff --git a/SkelJavalette.hi b/SkelJavalette.hi new file mode 100644 index 0000000..28323e3 Binary files /dev/null and b/SkelJavalette.hi differ diff --git a/SkelJavalette.hs b/SkelJavalette.hs new file mode 100644 index 0000000..6692e33 --- /dev/null +++ b/SkelJavalette.hs @@ -0,0 +1,110 @@ +module SkelJavalette where + +-- Haskell module generated by the BNF converter + +import AbsJavalette +import ErrM +type Result = Err String + +failure :: Show a => a -> Result +failure x = Bad $ "Undefined case: " ++ show x + +transIdent :: Ident -> Result +transIdent x = case x of + Ident str -> failure x + + +transProgram :: Program -> Result +transProgram x = case x of + Program topdefs -> failure x + + +transTopDef :: TopDef -> Result +transTopDef x = case x of + FnDef type' id args block -> failure x + + +transArg :: Arg -> Result +transArg x = case x of + Arg type' id -> failure x + + +transBlock :: Block -> Result +transBlock x = case x of + Block stmts -> failure x + + +transStmt :: Stmt -> Result +transStmt x = case x of + Empty -> failure x + BStmt block -> failure x + Decl type' items -> failure x + Ass id expr -> failure x + Incr id -> failure x + Decr id -> failure x + Ret expr -> failure x + VRet -> failure x + Cond expr stmt -> failure x + CondElse expr stmt0 stmt -> failure x + While expr stmt -> failure x + SExp expr -> failure x + + +transItem :: Item -> Result +transItem x = case x of + NoInit id -> failure x + Init id expr -> failure x + + +transType :: Type -> Result +transType x = case x of + Int -> failure x + Doub -> failure x + Bool -> failure x + Void -> failure x + Fun type' types -> failure x + + +transExpr :: Expr -> Result +transExpr x = case x of + EVar id -> failure x + ELitInt n -> failure x + ELitDoub d -> failure x + ELitTrue -> failure x + ELitFalse -> failure x + EApp id exprs -> failure x + EString str -> failure x + Neg expr -> failure x + Not expr -> failure x + EMul expr0 mulop expr -> failure x + EAdd expr0 addop expr -> failure x + ERel expr0 relop expr -> failure x + EAnd expr0 expr -> failure x + EOr expr0 expr -> failure x + TAnot type' expr -> failure x + + +transAddOp :: AddOp -> Result +transAddOp x = case x of + Plus -> failure x + Minus -> failure x + + +transMulOp :: MulOp -> Result +transMulOp x = case x of + Times -> failure x + Div -> failure x + Mod -> failure x + + +transRelOp :: RelOp -> Result +transRelOp x = case x of + LTH -> failure x + LE -> failure x + GTH -> failure x + GE -> failure x + EQU -> failure x + NE -> failure x + + + diff --git a/SkelJavalette.hs.bak b/SkelJavalette.hs.bak new file mode 100644 index 0000000..450658a --- /dev/null +++ b/SkelJavalette.hs.bak @@ -0,0 +1,109 @@ +module SkelJavalette where + +-- Haskell module generated by the BNF converter + +import AbsJavalette +import ErrM +type Result = Err String + +failure :: Show a => a -> Result +failure x = Bad $ "Undefined case: " ++ show x + +transIdent :: Ident -> Result +transIdent x = case x of + Ident str -> failure x + + +transProgram :: Program -> Result +transProgram x = case x of + Program topdefs -> failure x + + +transTopDef :: TopDef -> Result +transTopDef x = case x of + FnDef type' id args block -> failure x + + +transArg :: Arg -> Result +transArg x = case x of + Arg type' id -> failure x + + +transBlock :: Block -> Result +transBlock x = case x of + Block stmts -> failure x + + +transStmt :: Stmt -> Result +transStmt x = case x of + Empty -> failure x + BStmt block -> failure x + Decl type' items -> failure x + Ass id expr -> failure x + Incr id -> failure x + Decr id -> failure x + Ret expr -> failure x + VRet -> failure x + Cond expr stmt -> failure x + CondElse expr stmt0 stmt -> failure x + While expr stmt -> failure x + SExp expr -> failure x + + +transItem :: Item -> Result +transItem x = case x of + NoInit id -> failure x + Init id expr -> failure x + + +transType :: Type -> Result +transType x = case x of + Int -> failure x + Doub -> failure x + Bool -> failure x + Void -> failure x + Fun type' types -> failure x + + +transExpr :: Expr -> Result +transExpr x = case x of + EVar id -> failure x + ELitInt n -> failure x + ELitDoub d -> failure x + ELitTrue -> failure x + ELitFalse -> failure x + EApp id exprs -> failure x + EString str -> failure x + Neg expr -> failure x + Not expr -> failure x + EMul expr0 mulop expr -> failure x + EAdd expr0 addop expr -> failure x + ERel expr0 relop expr -> failure x + EAnd expr0 expr -> failure x + EOr expr0 expr -> failure x + + +transAddOp :: AddOp -> Result +transAddOp x = case x of + Plus -> failure x + Minus -> failure x + + +transMulOp :: MulOp -> Result +transMulOp x = case x of + Times -> failure x + Div -> failure x + Mod -> failure x + + +transRelOp :: RelOp -> Result +transRelOp x = case x of + LTH -> failure x + LE -> failure x + GTH -> failure x + GE -> failure x + EQU -> failure x + NE -> failure x + + + diff --git a/SkelJavalette.o b/SkelJavalette.o new file mode 100644 index 0000000..ec06fce Binary files /dev/null and b/SkelJavalette.o differ diff --git a/TestJavalette b/TestJavalette new file mode 100755 index 0000000..5bdc9cd Binary files /dev/null and b/TestJavalette differ diff --git a/TestJavalette.hi b/TestJavalette.hi new file mode 100644 index 0000000..80bdf58 Binary files /dev/null and b/TestJavalette.hi differ diff --git a/TestJavalette.hs b/TestJavalette.hs new file mode 100644 index 0000000..32a8cbf --- /dev/null +++ b/TestJavalette.hs @@ -0,0 +1,58 @@ +-- automatically generated by BNF Converter +module Main where + + +import IO ( stdin, hGetContents ) +import System ( getArgs, getProgName ) + +import LexJavalette +import ParJavalette +import SkelJavalette +import PrintJavalette +import AbsJavalette + + + + +import ErrM + +type ParseFun a = [Token] -> Err a + +myLLexer = myLexer + +type Verbosity = Int + +putStrV :: Verbosity -> String -> IO () +putStrV v s = if v > 1 then putStrLn s else return () + +runFile :: (Print a, Show a) => Verbosity -> ParseFun a -> FilePath -> IO () +runFile v p f = putStrLn f >> readFile f >>= run v p + +run :: (Print a, Show a) => Verbosity -> ParseFun a -> String -> IO () +run v p s = let ts = myLLexer s in case p ts of + Bad s -> do putStrLn "\nParse Failed...\n" + putStrV v "Tokens:" + putStrV v $ show ts + putStrLn s + Ok tree -> do putStrLn "\nParse Successful!" + showTree v tree + + + +showTree :: (Show a, Print a) => Int -> a -> IO () +showTree v tree + = do + putStrV v $ "\n[Abstract Syntax]\n\n" ++ show tree + putStrV v $ "\n[Linearized tree]\n\n" ++ printTree tree + +main :: IO () +main = do args <- getArgs + case args of + [] -> hGetContents stdin >>= run 2 pProgram + "-s":fs -> mapM_ (runFile 0 pProgram) fs + fs -> mapM_ (runFile 2 pProgram) fs + + + + + diff --git a/TestJavalette.hs.bak b/TestJavalette.hs.bak new file mode 100644 index 0000000..32a8cbf --- /dev/null +++ b/TestJavalette.hs.bak @@ -0,0 +1,58 @@ +-- automatically generated by BNF Converter +module Main where + + +import IO ( stdin, hGetContents ) +import System ( getArgs, getProgName ) + +import LexJavalette +import ParJavalette +import SkelJavalette +import PrintJavalette +import AbsJavalette + + + + +import ErrM + +type ParseFun a = [Token] -> Err a + +myLLexer = myLexer + +type Verbosity = Int + +putStrV :: Verbosity -> String -> IO () +putStrV v s = if v > 1 then putStrLn s else return () + +runFile :: (Print a, Show a) => Verbosity -> ParseFun a -> FilePath -> IO () +runFile v p f = putStrLn f >> readFile f >>= run v p + +run :: (Print a, Show a) => Verbosity -> ParseFun a -> String -> IO () +run v p s = let ts = myLLexer s in case p ts of + Bad s -> do putStrLn "\nParse Failed...\n" + putStrV v "Tokens:" + putStrV v $ show ts + putStrLn s + Ok tree -> do putStrLn "\nParse Successful!" + showTree v tree + + + +showTree :: (Show a, Print a) => Int -> a -> IO () +showTree v tree + = do + putStrV v $ "\n[Abstract Syntax]\n\n" ++ show tree + putStrV v $ "\n[Linearized tree]\n\n" ++ printTree tree + +main :: IO () +main = do args <- getArgs + case args of + [] -> hGetContents stdin >>= run 2 pProgram + "-s":fs -> mapM_ (runFile 0 pProgram) fs + fs -> mapM_ (runFile 2 pProgram) fs + + + + + diff --git a/TestJavalette.o b/TestJavalette.o new file mode 100644 index 0000000..8d649f9 Binary files /dev/null and b/TestJavalette.o differ diff --git a/TypeChecker.hi b/TypeChecker.hi new file mode 100644 index 0000000..484bfe8 Binary files /dev/null and b/TypeChecker.hi differ diff --git a/TypeChecker.hs b/TypeChecker.hs new file mode 100644 index 0000000..a6d97e0 --- /dev/null +++ b/TypeChecker.hs @@ -0,0 +1,321 @@ +module TypeChecker where + +import Debug.Trace +import AbsJavalette +import PrintJavalette +import ErrM +import Control.Monad.State +import Data.List + +type AnotTree = [TopDef] +type Errors = [String] +type Env = [[(Ident, Type)]] +type MyState = (Env, AnotTree, Errors) +type MyStateM = State MyState + + +typecheck :: Program -> Err Program +typecheck (Program fs) = do let (at, err) = evalState (checkFuncs fs >> checkProgram fs >> getAnotTree) emptyState + if err == [] + then return (Program at) + else fail $ printTree at ++ (show err) + +getAnotTree :: MyStateM (AnotTree, Errors) +getAnotTree = do (_, at, e) <- get + return (at, e) + +checkFuncs :: [TopDef] -> MyStateM () +checkFuncs [] = return () +checkFuncs (f@(FnDef t i a (Block s)):fs) = do (env, at, err) <- get + case find (\(ident, _) -> ident == i) (concat env) of + -- TODO: check if args already in scope + Nothing -> do let args = [t | (Arg t _) <- a] + let newEnv = [(i, (Fun t args))]:env + put (newEnv, at, err) + checkFuncs fs + Just _ -> do addErr (show i ++ " already in scope") + checkFuncs fs + + +checkProgram :: [TopDef] -> MyStateM () +checkProgram [] = return () +checkProgram (f:fs) = do checkFun f + checkProgram fs + +checkFun :: TopDef -> MyStateM () +checkFun (FnDef t i a (Block s)) = do pushFunScope a + ns <- checkStmts s [] t + popFunScope + b <- addArgs a [] + (env, at, err) <- get + let newAt = at ++ [(FnDef t i b (Block ns))] + put (env, newAt, err) + return () + +checkStmts :: [Stmt] -> [Stmt] -> Type -> MyStateM [Stmt] +checkStmts [] nss rt = return nss +checkStmts (s:ss) nss rt = do ns <- checkStmt s rt + checkStmts ss (nss ++ [ns]) rt + +checkStmt :: Stmt -> Type -> MyStateM Stmt +checkStmt s rt = case s of + + BStmt (Block s) -> do pushBlockScope + ns <- checkStmts s [] rt + popBlockScope + return (BStmt (Block ns)) + + Decl t vars -> do nvars <- addVars t vars [] + return (Decl t nvars) + + Ass i e -> do vt <- findVarType i + (TAnot et ne) <- infer e + case vt of + Just t -> case t == et of + True -> return (Ass i (TAnot et ne)) + False -> do addErr (show e ++ " is not of the type " ++ + show t ++ " (" ++ show i ++ ")") + return (Ass i (TAnot et ne)) + Nothing -> return (Ass i e) + + + Incr i -> do m <- findVarType i + case m of + Just Int -> return (Incr i) + Just Doub -> return (Incr i) + Just t -> do addErr ("(" ++ show i ++ + ") incrementing is only allowed on Int " ++ + "and Doub, not on " ++ + show t) + return (Incr i) + Nothing -> do addErr ("(" ++ show i ++ ") incrementing is only " ++ + "allowed on Int and Doub") + return (Incr i) + + Decr i -> do m <- findVarType i + case m of + Just Int -> return (Decr i) + Just Doub -> return (Decr i) + Just t -> do addErr ("(" ++ show i ++ + ") decrementing is only allowed on Int " ++ + "and Doub, not on " ++ + show t) + return (Decr i) + Nothing -> do addErr ("(" ++ show i ++ ") decrementing is only " ++ + "allowed on Int and Doub") + return (Decr i) + + Ret e -> do m <- infer e + case m of + (TAnot t ne) -> case t == rt of + True -> return (Ret m) + False -> do addErr (show "wrong return type " ++ show t ++ + " should be " ++ show rt) + return (Ret m) + _ -> do addErr (show e ++ " return not annotated") + return (Ret m) + -- TODO check if it returns the right type + + VRet -> return VRet + + Cond e stm -> do m <- infer e + ns <- checkStmt stm rt + return (Cond m ns) + + CondElse e s1 s2 -> do m <- infer e + ns1 <- checkStmt s1 rt + ns2 <- checkStmt s2 rt + return (CondElse m ns1 ns2) + + While e stm -> do m <- infer e + ns <- checkStmt stm rt + return (While m ns) + + SExp e -> do m <- infer e + return (SExp m) + s -> do addErr "Not an valid statement" + return s + +addArgs :: [Arg] -> [Arg] -> MyStateM ([Arg]) +addArgs [] nass = return (nass) +addArgs ((Arg t i):ass) nass = do ((e:env), at, err) <- get + case (find (\(ident, nt) -> ident == i) e) of + Nothing -> do let newEnv = ((i, t):e):env + put(trace (show newEnv) newEnv, at, err) + addArgs ass ((Arg t i):nass) + Just ident -> do addErr (show ident ++ " already in scope") + addArgs ass ((Arg t i):nass) + + +addVars :: Type -> [Item] -> [Item] -> MyStateM ([Item]) +addVars t [] nis = return (nis) +addVars t ((NoInit i):is) nis = do ((e:env), at, err) <- get + case (find (\(ident, nt) -> ident == i) e) of + Nothing -> do let newEnv = ((i, t):e):env + put (newEnv, at, err) + addVars t is (nis ++ [(NoInit i)]) + Just ident -> do addErr (show ident ++ " already initialized") + addVars t is (nis ++ [(NoInit i)]) +addVars t ((Init i ex):is) nis = do (TAnot nt ne) <- infer ex + case t == nt of + True -> do ((e:env), at, err) <- get + case (find (\(ident, nt) -> ident == i) e) of + Nothing -> do let newEnv = ((i, t):e):env + put (newEnv, at, err) + addVars t is (nis ++ [(Init i (TAnot nt ne))]) + Just ident -> do addErr (show ident ++ " already initialized") + addVars t is (nis ++ [(Init i (TAnot nt ne))]) + False -> do addErr (show ex ++ " is not of type " ++ show t) + ((e:env), at, err) <- get + let newEnv = ((i, t):e):env + put (newEnv, at, err) + addVars t is (nis ++ [(Init i ex)]) + + + +infer :: Expr -> MyStateM Expr +infer expr = case expr of + EVar i -> do m <- findVarType i + case m of + Just t -> return (TAnot t (EVar i)) + Nothing -> return (EVar i) + + ELitInt e -> return (TAnot Int (ELitInt e)) + ELitDoub e -> return (TAnot Doub (ELitDoub e)) + ELitTrue -> return (TAnot Bool ELitTrue) + ELitFalse -> return (TAnot Bool ELitFalse) + EApp i exs -> do m <- findVarType i + nexs <- inferList exs [] + case m of + Just (Fun t a) -> case ((length nexs) == (length a)) of + True -> case (and [t1 == t2 | ((TAnot t1 _),t2) <- zip nexs a]) of + True -> return (TAnot t (EApp i nexs)) + False -> do addErr (show i ++ ":s arguments (" ++ + show nexs ++ ") are not equal to " ++ + show a) + return (TAnot t (EApp i nexs)) + False -> case i of + Ident "printString" -> case exs of + [EString _] -> return (EApp i exs) + _ -> do addErr ("printString only takes one literal string as a argument") + return (EApp i exs) + _ -> do addErr ("wrong number of arguments for " ++ show i) + return (TAnot t (EApp i nexs)) + + Nothing -> do addErr ("wrong arguments in " ++ show i) + return (EApp i exs) -- TODO: check for Nothing or other + + + EString e -> return (EString e) + Neg e -> do m <- infer e + case m of + (TAnot Int _) -> return (TAnot Int (Neg m)) + (TAnot Doub _) -> return (TAnot Doub (Neg m)) + _ -> do addErr (show e ++ " is not of type Int or Bool") + return (Neg e) + Not e -> do m <- infer e + case m of + (TAnot Bool _) -> return (TAnot Bool (Not m)) + _ -> do addErr (show e ++ " is not of type Bool") + return (Not e) + + EMul e1 op e2 -> do t <- findType e1 e2 [Int, Doub] + case t of + Just (Int, en1, en2) -> return (TAnot Int (EMul en1 op en2)) + Just (Doub, en1, en2) -> return (TAnot Doub (EMul en1 op en2)) + Nothing -> return (EMul e1 op e2) + + EAdd e1 op e2 -> do t <- findType e1 e2 [Int, Doub] + case t of + Just (Int, en1, en2) -> return (TAnot Int (EAdd en1 op en2)) + Just (Doub, en1, en2) -> return (TAnot Doub (EAdd en1 op en2)) + Nothing -> return (EAdd e1 op e2) + + ERel e1 op e2 -> case find (== op) [LTH,LE,GTH,GE] of + Just _ -> do t <- findType e1 e2 [Int, Doub] + case t of + Just (Int, en1, en2) -> return (TAnot Bool (ERel en1 op en2)) + Just (Doub, en1, en2) -> return (TAnot Bool (ERel en1 op en2)) + Nothing -> return (ERel e1 op e2) + + Nothing -> do m <- findType e1 e2 [Int, Doub, Bool] + case m of + Just (_, en1, en2) -> return (TAnot Bool (ERel en1 op en2)) + Nothing -> return (ERel e1 op e2) + + EAnd e1 e2 -> do t <- findType e1 e2 [Bool] + case t of + Just (Bool, en1, en2) -> return (TAnot Bool (EAnd en1 en2)) + Nothing -> return (EAnd e1 e2) + + EOr e1 e2 -> do t <- findType e1 e2 [Bool] + case t of + Just (Bool, en1, en2) -> return (TAnot Bool (EOr en1 en2)) + Nothing -> return (EOr e1 e2) + +inferList :: [Expr] -> [Expr] -> MyStateM [Expr] +inferList [] nes = return nes +inferList (e:es) nes = do ne <- infer e + inferList es (nes ++ [ne]) + +findType :: Expr -> Expr -> [Type] -> MyStateM (Maybe (Type, Expr, Expr)) +findType e1 e2 allowed = do t1 <- infer e1 + t2 <- infer e2 + let (TAnot tt1 _) = t1 + let (TAnot tt2 _) = t2 + case tt1 == tt2 of + True -> case t1 of + (TAnot t _) -> case (find (== t) allowed) of + Just _ -> return (Just (t, t1, t2)) + Nothing -> do addErr (show t ++ + " is not allowed here") + return Nothing + _ -> return Nothing + False -> do addErr (show e1 ++ " and " ++ show e2 ++ " are not of type " ++ show t1) + return Nothing + +findVarType :: Ident -> MyStateM (Maybe Type) +findVarType var = do (env, at, err) <- get + let m = find (\(i, t) -> i == var) (concat env) + case m of + Just t -> return (Just (snd t)) + Nothing -> do addErr ((show var) ++ " not in scope") + return Nothing + + +-- initializing functions +emptyState :: MyState +emptyState = (emptyEnv, [], []) + +emptyEnv :: Env +emptyEnv = [[ + (Ident "printString", (Fun Void [])), + (Ident "printDouble", (Fun Void [Doub])), + (Ident "printInt", (Fun Void [Int])), + (Ident "readDouble", (Fun Doub [])), + (Ident "readInt", (Fun Int [])) + ]] + +-- helper functions +pushFunScope :: [Arg] -> MyStateM () +pushFunScope a = do (env, at, err) <- get + let args = [(i,t) | (Arg t i) <- a] + put (args:env, at, err) + return () + +popFunScope :: MyStateM () +popFunScope = do (env, at, err) <- get + put (tail env, at, err) + return () + +pushBlockScope :: MyStateM () +pushBlockScope = pushFunScope [] + +popBlockScope :: MyStateM () +popBlockScope = popFunScope + +addErr :: String -> MyStateM () +addErr err = do (env, at, errs) <- get + put (env, at, err:errs) + return () + diff --git a/TypeChecker.hs~ b/TypeChecker.hs~ new file mode 100644 index 0000000..d434889 --- /dev/null +++ b/TypeChecker.hs~ @@ -0,0 +1,8 @@ +module TypeChecker where + +import AbsJavalette +import PrintJavalette +import ErrM + +typecheck :: Program -> Err() +typecheck (Program fs) = fail printTree fs diff --git a/TypeChecker.o b/TypeChecker.o new file mode 100644 index 0000000..b5c568e Binary files /dev/null and b/TypeChecker.o differ diff --git a/bnfc b/bnfc new file mode 100755 index 0000000..86f4340 Binary files /dev/null and b/bnfc differ diff --git a/jasmin/jasmin-2.4.zip b/jasmin/jasmin-2.4.zip new file mode 100644 index 0000000..cd069c1 Binary files /dev/null and b/jasmin/jasmin-2.4.zip differ diff --git a/jasmin/jasmin-2.4/Readme.txt b/jasmin/jasmin-2.4/Readme.txt new file mode 100644 index 0000000..9ed2058 --- /dev/null +++ b/jasmin/jasmin-2.4/Readme.txt @@ -0,0 +1,116 @@ +Jasmin README file 1 March 1997, Jonathan Meyer + Last updated October 2004 + +Introduction +------------ +Welcome to Jasmin version 1.1. + +Jasmin is a Java Assembler Interface. It takes ASCII descriptions for Java +classes, written in a simple assembler-like syntax, using the Java +Virtual Machine instruction set. It converts them into binary Java class +files suitable for loading into a Java interpreter. + +Jasmin was originally written as the companion to the +book "Java Virtual Machine", published by O'Reilly, written by +Jon Meyer and Troy Downing. (See http://www.ora.com/catalog/javavm/). +The book is now out of print. However, the Jasmin assembler retains its +usefulness as a utility, and continues its life as an OpenSource project. + +Background +---------- +Jasmin is today a little long in the tooth. It was originally coded in +1996 as a stop-gap until Sun released their own assembler. It has seen +no major upgrades since 1997. By 2004 Sun still has not released an +official assembler, so I decided to release Jasmin as a sourceforge +project. Hopefully this will inject some fresh life into the project... + +Home Page +--------- +Check out the Jasmin home page at: + + http://jasmin.sourceforge.net + +Requirements +------------ +Jasmin is written in Java, and should work with most Java 1.1 environments. + +To run Jasmin you need to have a Java 2 Runtime Environment available (e.g. JDK 1.4). +This can be downloaded from "http://www.javasoft.com/j2se/". + +Getting Started +--------------- +The Jasmin distribution contains a jasmin.jar file holding the Jasmin assembler. +To run Jasmin, execute the Jarfile, specifying any files to assemble +as command-line parameters, e.g. to assemble the "HelloWorld.j" file in examples, +first use cd to change into the Jasmin directory: + + cd c:\jasmin-1.1 [Windows] +or + cd ~/jasmin-1.1 [Unix] + +Then, to run Jasmin, use: + + java -jar jasmin.jar examples\HelloWorld.j [Windows] +or + java -jar jasmin.jar examples/HelloWorld.j [Unix/MacOsX] + + +After running Jasmin as above, it generates a compiled HelloWorld.class file +in the examples directory. + +You can then run the HelloWorld program by doing: + + java examples.HelloWorld + +Build Instructions +------------------ +Jasmin uses Ant as its build mechanism. See build.xml for instructions on how +to build Jasmin. In brief, you need to: + +1. Start a Terminal or Command window. +2. Change (cd) into the Jasmin directory +3. Make sure that java, javac etc. are on your path +4. Run build.bat (Windows) or build.sh (Unix). + +For example, on Windows, this might look something like: + + cd c:\jasmin-1.1 # change to Jasmin directory + build all + +Or, for Unix, it might be like: + + cd ~/jasmin-1.1 # change to Jasmin directory + ./build.sh all + +These scripts use the build.xml configuration file to specify build parameters. + +Where Next +---------- +After trying Jasmin out, have a look at the HelloWorld.j source in the examples directory, +try compiling and running the other examples. + +There is documentation for Jasmin in the doc directory. You should probably +start with the 'guide.html' document. + +Files +----- +The following files are included in this distribution: + + README.txt - this file + jasmin.jar - executable Jar file containing Jasmin assembler + examples/ - directory containing example files written for Jasmin + src/ - the Java source code and for the jasmin package + lib/ - Contains Java sources for the java_cup and jas packages + docs/ - various documentation files. + +Copyright +--------- +Jasmin is Copyright (1997-2004) Jonathan Meyer, under the terms of +the GNU General Public License. See license-jasmin.txt for more. + +Jasmin uses the JAS package which has its own copyright - see lib/jas/README. +[sbktech.org no longer seem to be in existence, but the code lives +on in this project]. + +Jasmin utilizes Scott E. Hudson's Java Cup package v0.9e, which is also in +the lib directory. See http://www.cs.princeton.edu/~appel/modern/java/CUP/ diff --git a/jasmin/jasmin-2.4/build.bat b/jasmin/jasmin-2.4/build.bat new file mode 100644 index 0000000..867a785 --- /dev/null +++ b/jasmin/jasmin-2.4/build.bat @@ -0,0 +1,107 @@ +@echo off + +REM Copyright 2001,2004 The Apache Software Foundation +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +if exist "%HOME%\antrc_pre.bat" call "%HOME%\antrc_pre.bat" + +if "%OS%"=="Windows_NT" @setlocal + +rem %~dp0 is expanded pathname of the current script under NT +set ANT_HOME=. +rem set DEFAULT_ANT_HOME=%~dp0.. + +if "%ANT_HOME%"=="" set ANT_HOME=%DEFAULT_ANT_HOME% +set DEFAULT_ANT_HOME= + +rem Slurp the command line arguments. This loop allows for an unlimited number +rem of arguments (up to the command line limit, anyway). +set ANT_CMD_LINE_ARGS=%1 +if ""%1""=="""" goto doneStart +shift +:setupArgs +if ""%1""=="""" goto doneStart +set ANT_CMD_LINE_ARGS=%ANT_CMD_LINE_ARGS% %1 +shift +goto setupArgs +rem This label provides a place for the argument list loop to break out +rem and for NT handling to skip to. + +:doneStart +rem find ANT_HOME if it does not exist due to either an invalid value passed +rem by the user or the %0 problem on Windows 9x +if exist "%ANT_HOME%\lib\ant.jar" goto checkJava + +rem check for ant in Program Files +if not exist "%ProgramFiles%\ant" goto checkSystemDrive +set ANT_HOME=%ProgramFiles%\ant +goto checkJava + +:checkSystemDrive +rem check for ant in root directory of system drive +if not exist %SystemDrive%\ant\lib\ant.jar goto checkCDrive +set ANT_HOME=%SystemDrive%\ant +goto checkJava + +:checkCDrive +rem check for ant in C:\ant for Win9X users +if not exist C:\ant\lib\ant.jar goto noAntHome +set ANT_HOME=C:\ant +goto checkJava + +:noAntHome +echo ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME. +goto end + +:checkJava +set _JAVACMD=%JAVACMD% + +if "%JAVA_HOME%" == "" goto noJavaHome +if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome +if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe +goto checkJikes + +:noJavaHome +if "%_JAVACMD%" == "" set _JAVACMD=java.exe + +:checkJikes +if not "%JIKESPATH%"=="" goto runAntWithJikes + +:runAnt +if not "%CLASSPATH%"=="" goto runAntWithClasspath +"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS% +goto end + +:runAntWithClasspath +"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -lib "%CLASSPATH%" %ANT_CMD_LINE_ARGS% +goto end + +:runAntWithJikes +if not "%CLASSPATH%"=="" goto runAntWithJikesAndClasspath +"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS% +goto end + +:runAntWithJikesAndClasspath +"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -lib "%CLASSPATH%" %ANT_CMD_LINE_ARGS% +goto end + +:end +set _JAVACMD= +set ANT_CMD_LINE_ARGS= + +if "%OS%"=="Windows_NT" @endlocal + +:mainEnd +if exist "%HOME%\antrc_post.bat" call "%HOME%\antrc_post.bat" + diff --git a/jasmin/jasmin-2.4/build.sh b/jasmin/jasmin-2.4/build.sh new file mode 100644 index 0000000..4a97d12 --- /dev/null +++ b/jasmin/jasmin-2.4/build.sh @@ -0,0 +1,305 @@ +#! /bin/sh + +# Copyright 2001-2004 The Apache Software Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ANT_HOME=. +export ANT_HOME + +# Extract launch and ant arguments, (see details below). +ant_exec_args= +no_config=false +use_jikes_default=false +ant_exec_debug=false +show_help=false +for arg in "$@" ; do + if [ "$arg" = "--noconfig" ] ; then + no_config=true + elif [ "$arg" = "--usejikes" ] ; then + use_jikes_default=true + elif [ "$arg" = "--execdebug" ] ; then + ant_exec_debug=true + elif [ my"$arg" = my"--h" -o my"$arg" = my"--help" ] ; then + show_help=true + ant_exec_args="$ant_exec_args -h" + else + if [ my"$arg" = my"-h" -o my"$arg" = my"-help" ] ; then + show_help=true + fi + ant_exec_args="$ant_exec_args \"$arg\"" + fi +done + +# Source/default ant configuration +if $no_config ; then + rpm_mode=false + usejikes=$use_jikes_default +else + # load system-wide ant configuration + if [ -f "/etc/ant.conf" ] ; then + . /etc/ant.conf + fi + + # load user ant configuration + if [ -f "$HOME/.ant/ant.conf" ] ; then + . $HOME/.ant/ant.conf + fi + if [ -f "$HOME/.antrc" ] ; then + . "$HOME/.antrc" + fi + + # provide default configuration values + if [ -z "$rpm_mode" ] ; then + rpm_mode=false + fi + if [ -z "$usejikes" ] ; then + usejikes=$use_jikes_default + fi +fi + +# Setup Java environment in rpm mode +if $rpm_mode ; then + if [ -f /usr/share/java-utils/java-functions ] ; then + . /usr/share/java-utils/java-functions + set_jvm + set_javacmd + fi +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +case "`uname`" in + CYGWIN*) cygwin=true ;; + Darwin*) darwin=true + if [ -z "$JAVA_HOME" ] ; then + JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home + fi + ;; +esac + +if [ -z "$ANT_HOME" -o ! -d "$ANT_HOME" ] ; then + # try to find ANT + if [ -d /opt/ant ] ; then + ANT_HOME=/opt/ant + fi + + if [ -d "${HOME}/opt/ant" ] ; then + ANT_HOME="${HOME}/opt/ant" + fi + + ## resolve links - $0 may be a link to ant's home + PRG="$0" + progname=`basename "$0"` + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi + done + + ANT_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + ANT_HOME=`cd "$ANT_HOME" && pwd` +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$ANT_HOME" ] && + ANT_HOME=`cygpath --unix "$ANT_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# set ANT_LIB location +ANT_LIB="${ANT_HOME}/lib" + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD=`which java 2> /dev/null ` + if [ -z "$JAVACMD" ] ; then + JAVACMD=java + fi + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." + echo " We cannot execute $JAVACMD" + exit 1 +fi + +# Build local classpath using just the launcher in non-rpm mode or +# use the Jpackage helper in rpm mode with basic and default jars +# specified in the ant.conf configuration. Because the launcher is +# used, libraries linked in ANT_HOME will also be include, but this +# is discouraged as it is not java-version safe. A user should +# request optional jars and their dependencies via the OPT_JAR_LIST +# variable +if $rpm_mode && [ -f /usr/bin/build-classpath ] ; then + LOCALCLASSPATH="$(/usr/bin/build-classpath ant ant-launcher jaxp_parser_impl xml-commons-apis)" + # If the user requested to try to add some other jars to the classpath + if [ -n "$OPT_JAR_LIST" ] ; then + _OPTCLASSPATH="$(/usr/bin/build-classpath $OPT_JAR_LIST 2> /dev/null)" + if [ -n "$_OPTCLASSPATH" ] ; then + LOCALCLASSPATH="$LOCALCLASSPATH:$_OPTCLASSPATH" + fi + fi + + # Explicitly add javac path to classpath, assume JAVA_HOME set + # properly in rpm mode + if [ -f "$JAVA_HOME/lib/tools.jar" ] ; then + LOCALCLASSPATH="$LOCALCLASSPATH:$JAVA_HOME/lib/tools.jar" + fi + if [ -f "$JAVA_HOME/lib/classes.zip" ] ; then + LOCALCLASSPATH="$LOCALCLASSPATH:$JAVA_HOME/lib/classes.zip" + fi + + # if CLASSPATH_OVERRIDE env var is set, LOCALCLASSPATH will be + # user CLASSPATH first and ant-found jars after. + # In that case, the user CLASSPATH will override ant-found jars + # + # if CLASSPATH_OVERRIDE is not set, we'll have the normal behaviour + # with ant-found jars first and user CLASSPATH after + if [ -n "$CLASSPATH" ] ; then + # merge local and specified classpath + if [ -z "$LOCALCLASSPATH" ] ; then + LOCALCLASSPATH="$CLASSPATH" + elif [ -n "$CLASSPATH_OVERRIDE" ] ; then + LOCALCLASSPATH="$CLASSPATH:$LOCALCLASSPATH" + else + LOCALCLASSPATH="$LOCALCLASSPATH:$CLASSPATH" + fi + + # remove class path from launcher -lib option + CLASSPATH="" + fi +else + # not using rpm_mode; use launcher to determine classpaths + if [ -z "$LOCALCLASSPATH" ] ; then + LOCALCLASSPATH=$ANT_LIB/ant-launcher.jar + else + LOCALCLASSPATH=$ANT_LIB/ant-launcher.jar:$LOCALCLASSPATH + fi +fi + +if [ -n "$JAVA_HOME" ] ; then + # OSX hack to make Ant work with jikes + if $darwin ; then + OSXHACK="${JAVA_HOME}/../Classes" + if [ -d "${OSXHACK}" ] ; then + for i in "${OSXHACK}"/*.jar + do + JIKESPATH="$JIKESPATH:$i" + done + fi + fi +fi + +# Allow Jikes support (off by default) +if $usejikes; then + ANT_OPTS="$ANT_OPTS -Dbuild.compiler=jikes" +fi + +# For Cygwin, switch paths to appropriate format before running java +if $cygwin; then + if [ "$OS" = "Windows_NT" ] && cygpath -m .>/dev/null 2>/dev/null ; then + format=mixed + else + format=windows + fi + ANT_HOME=`cygpath --$format "$ANT_HOME"` + ANT_LIB=`cygpath --$format "$ANT_LIB"` + JAVA_HOME=`cygpath --$format "$JAVA_HOME"` + LOCALCLASSPATH=`cygpath --path --$format "$LOCALCLASSPATH"` + if [ -n "$CLASSPATH" ] ; then + CLASSPATH=`cygpath --path --$format "$CLASSPATH"` + fi + CYGHOME=`cygpath --$format "$HOME"` +fi + +# Show script help if requested +if $show_help ; then + echo $0 '[script options] [options] [target [target2 [target3] ..]]' + echo 'Script Options:' + echo ' --help, --h print this message and ant help' + echo ' --noconfig suppress sourcing of /etc/ant.conf,' + echo ' $HOME/.ant/ant.conf, and $HOME/.antrc' + echo ' configuration files' + echo ' --usejikes enable use of jikes by default, unless' + echo ' set explicitly in configuration files' + echo ' --execdebug print ant exec line generated by this' + echo ' launch script' + echo ' ' +fi +# add a second backslash to variables terminated by a backslash under cygwin +if $cygwin; then + case "$ANT_HOME" in + *\\ ) + ANT_HOME="$ANT_HOME\\" + ;; + esac + case "$CYGHOME" in + *\\ ) + CYGHOME="$CYGHOME\\" + ;; + esac + case "$JIKESPATH" in + *\\ ) + JIKESPATH="$JIKESPATH\\" + ;; + esac + case "$LOCALCLASSPATH" in + *\\ ) + LOCALCLASSPATH="$LOCALCLASSPATH\\" + ;; + esac + case "$CLASSPATH" in + *\\ ) + CLASSPATH="$CLASSPATH\\" + ;; + esac +fi +# Execute ant using eval/exec to preserve spaces in paths, +# java options, and ant args +ant_sys_opts= +if [ -n "$CYGHOME" ]; then + if [ -n "$JIKESPATH" ]; then + ant_sys_opts="-Djikes.class.path=\"$JIKESPATH\" -Dcygwin.user.home=\"$CYGHOME\"" + else + ant_sys_opts="-Dcygwin.user.home=\"$CYGHOME\"" + fi +else + if [ -n "$JIKESPATH" ]; then + ant_sys_opts="-Djikes.class.path=\"$JIKESPATH\"" + fi +fi +ant_exec_command="exec \"$JAVACMD\" $ANT_OPTS -classpath \"$LOCALCLASSPATH\" -Dant.home=\"$ANT_HOME\" -Dant.library.dir=\"$ANT_LIB\" $ant_sys_opts org.apache.tools.ant.launch.Launcher $ANT_ARGS -lib \"$CLASSPATH\" $ant_exec_args" +if $ant_exec_debug ; then + echo $ant_exec_command +fi +eval $ant_exec_command diff --git a/jasmin/jasmin-2.4/build.xml b/jasmin/jasmin-2.4/build.xml new file mode 100644 index 0000000..4fae2ae --- /dev/null +++ b/jasmin/jasmin-2.4/build.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jasmin/jasmin-2.4/changes.txt b/jasmin/jasmin-2.4/changes.txt new file mode 100644 index 0000000..4d16b64 --- /dev/null +++ b/jasmin/jasmin-2.4/changes.txt @@ -0,0 +1,114 @@ +Jasmin Revision History Jonathan Meyer + +15 Oct 2004 - Release 1.1 + + * Switched to Ant Build System + + * Moved java_cup and jas sources into src directory + + * Updated documentation to use style sheets + + * Changed docs to reflect using jar files rather than class files + + * Uploaded to SourceForge + + +----------------------------------------------------------------------------- + +11 Apr 97 - Release 1.06. + +11 Apr 97 + + * Fixed bug which prevented the source name from being written out + in the class file + + * Improved README file + +2 Mar 97 - Release 1.05. + +1 Mar 97 + + * Moved scripts into a bin directory. + + * Added support for Visual J++. + + Added vjasmin.bat, for running Jasmin using Visual J++. + + Converted JAS/Jasmin to use its own internal RuntimeConstants, so that + there is no longer any dependency on Sun's version (needed by J++). + + * Tidied API: + + Renamed "Jasmin" class "ClassFile" (sorry to those of you using the API + from 1.04). The ClassFile class is documented in the doc/api directory. + + * Mods for Java 1.1: + + Classes now set the ACC_SUPER bit in their access flags. + i2b/i2s/i2c are now synonyms for int2byte, int2short, int2char. + invokespecial is now a synonym for invokenonvirtual. + + * Mods to pick up documentation in book: + + "wide" is now a recognized instruction in Jasmin files - although the assembler + just ignores it! + + Added the optional parameter to tableswitch. + + * Fixed bug in .catch all + +10 Feb 96 - Release 1.04. + +8 Feb 97 + * Updated to use latest version of JAS. This fixes some bugs in the + earlier release (including handling of _w instructions) + + * Split several of the internal classes into smaller pieces. + + * Restructured internal sources so that Jasmin, Scanner and parser + no longer rely on static data structures. Now there is a public API + to Jasmin, for people that want to assemble classes using their own + data input/output streams. + +30 Oct 96 + + * Added support for more \ escapes in quoted strings. In + particular, you can now use \nnn to specify a character using + octal. + +2 Oct 96 - Release 1.03. + +1 Oct 96 + + * Added better support for interfaces: added the .interface + directive (an alternative to the .class directive), and also a + .implements directive. Updates guide.html to mention these new + features. + +24 Sept 96 + + * Fixed several problems with guide.html - thanks to feedback from + Shawn Silverman (umsilve1@cc.umanitoba.ca). + +23 Aug 96 + + * Tidied up documentation and implementation for wide instructions. + + Now ldc and ldc_w are used for single-word items, whereas + ldc2_w is used for two word items (previously, I had ldc_w as + a synonym for ldc2_w - oops). + +25 July 96 + + * Added documentation for .var directive. + + * Fixed line numbering produced by -g flag (I hope). + + * Improved error reporting slightly. + +24 July 96 + + * Added fix to scanner to handle Ctrl-M characters, + for DOS/NT Systems. (Thanks sbk!) + +18 July 96 - Release 1.0. diff --git a/jasmin/jasmin-2.4/docs/about.html b/jasmin/jasmin-2.4/docs/about.html new file mode 100644 index 0000000..f891a75 --- /dev/null +++ b/jasmin/jasmin-2.4/docs/about.html @@ -0,0 +1,182 @@ + + +About Jasmin + + + + +
+
+

+

+

ABOUT JASMIN
+Jonathan Meyer, July 1996 +

+
+ +

Introduction

+ +This document tries to answer some questions you might have +about Jasmin. In particular, several people have asked me what +Jasmin is, why they might use Jasmin, and why I wrote it in the +first place. I've tried to give some answers to these questions +below.

+ +

Jasmin Assembler

+ +Jasmin is a Java Assembler Interface. It takes ASCII descriptions for Java +classes, written in a simple assembler-like syntax using the Java Virtual +Machine instructions set. It converts them into binary Java class files +suitable for loading into a Java interpreter.

+ +To give you a flavor, here is the Jasmin assembly code for HelloWorld:

+ +

+    .class public HelloWorld
+    .super java/lang/Object
+
+    ;
+    ; standard initializer (calls java.lang.Object's initializer)
+    ;
+    .method public <init>()V
+       aload_0
+       invokenonvirtual java/lang/Object/<init>()V
+       return
+    .end method
+
+    ;
+    ; main() - prints out Hello World
+    ;
+    .method public static main([Ljava/lang/String;)V
+       .limit stack 2   ; up to two items can be pushed
+
+       ; push System.out onto the stack
+       getstatic java/lang/System/out Ljava/io/PrintStream;
+
+       ; push a string onto the stack
+       ldc "Hello World!"
+
+       ; call the PrintStream.println() method.
+       invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
+
+       ; done
+       return
+    .end method
+
+
+ +

+Jasmin was originally created as a companion to the book "Java Virtual Machine", +written by Jon Meyer and Troy Downing and published by O'Reilly Associates. The +book is now out of print. Jasmin survives as a SourceForge Open Source project. +

+ +

Motivation for Jasmin

+ +

+Jasmin was written because, at the time that we wrote the Java Virtual Machine +book for O'Reilly, Sun had not published an assembler format for the +Java virtual machine. +

+ +

+Generating a binary Java .class file is pretty fiddly. Its like +creating an a.out (or .exe) file by hand. Even using a Java package like +JAS (a Java API for creating class files, used internally by Jasmin and written by KB Sriram), you +need to know a lot about the philosophy of the Java Virtual +Machine before you can write something at the Virtual +Machine level and generate a Java class.

+ +We wanted something that made it very easy for a student or programmer +to explore the Java Virtual Machine, or write a new language +which targets the VM, without getting into the details of constant +pool indices, attribute tables, and so on.

+ +

+Creating a Java assembler seemed like a good solution. +

+ +

+Unfortunately, Sun has not seen the need to define a standard Java +assembler format, and has not released tools perform Java assembly. +

+ +

Sun does provide a javap program which can print the assembly code +in a class file. However, the javap output is inappropriate for +use as an assembler format. It is designed to be read by a person, +not to be parsed by an assembler, so it has a number of +omissions and drawbacks.

+ +

+Internally, Sun has a Java assembler tool. In hindsight, the syntax used by their internal tool is nicer than +the Jasmin syntax. However, to my knowledge, their tool is still not widely available, nor is it a formally +supported part of the Sun JDK. +

+ +

Update on Jasmin Today (2004)

+ +Since Jasmin was written, it has become the de-facto standard assembly format for Java. It is used in dozens of compiler classes throughout the world, and has +been ported and cloned multiple times. For better or worse, Jasmin remains the original Java assembler. +

+[As an interesting comparison, Microsoft .NET shipped out-of-box with an +assembler, a disassembler, a standard IL assembly format, and built-in libraries +for code-genning (generating classes on the fly). It would be great if Sun was +as comprehensive in their support of the JVM]. +

+ +

What can I do with Jasmin?

+ +To give you some ideas, below are some theoretical Jasmin users/uses.

+ +

Teachers

+ +If you are teaching a compilers course, you could have students +write a compiler which generates Jasmin assembly files, +and then assembles those files into Java class files. Then you +can integrate the advantages of the Virtual Machine (portability, +the verifier, an object model...) into your courseware.

+ +

Hobbyists

+ +Jasmin lets you poke around in Java at the VM level, so that +you can gain a real understanding of how Java works and +what the Virtual Machine is like.

+ +

System Implementors

+ +If you are implementing a Java runtime system, Jasmin is +an essential tool for generating test classes.

+ +

Advanced Programmers

+ +You could use Jasmin to write a critical class or method by +hand (e.g. if you think that Java isn't doing things +as well as it could).

+ +Alternatively, you could create a syntax extension to the +Java language which uses Jasmin (or JAS).

+ +

Language Implementors

+ +If you want to create an implementation of your +favorite programming language which targets the +Virtual Machine, Jasmin may be a simpler approach than +writing a Java class file generator. This is especially +true if your compiler is implemented in something other +than Java, since you can create Java class files easily +without having to get involved in the details of the +binary file format.

+ +

Security Wizards

+ +Sun's claim that the Java class verifier protects you from +hostile programs is a pretty strong one. Jasmin lets you create +'hostile' class files and see if a Java implementation is really as +secure as it should be.

+ +


Copyright (c) Jonathan Meyer, July 1996
+ +
+Jasmin Home | +Jon Meyer's Home + diff --git a/jasmin/jasmin-2.4/docs/guide.html b/jasmin/jasmin-2.4/docs/guide.html new file mode 100644 index 0000000..6984b3f --- /dev/null +++ b/jasmin/jasmin-2.4/docs/guide.html @@ -0,0 +1,689 @@ + + +Jasmin User Guide + + + + +
+
+

+

+

JASMIN USER GUIDE
+Jonathan Meyer, July 1996 +

+
+ +

About This Document

+ +This guide describes the rules and syntax used in Jasmin, and +how to run Jasmin. Note that this document doesn't +explain the Java Virtual Machine itself, or give syntax notes for +every instruction known to Jasmin. See the Java Virtual Machine specification +for more information on the JVM.

+ +

What is Jasmin?

+ +

+Jasmin is an assembler for the Java Virtual Machine. It takes +ASCII descriptions of Java classes, written in a simple +assembler-like syntax using the Java Virtual +Machine instruction set. It converts them into binary Java class files, +suitable for loading by a Java runtime system.

+

+

+Jasmin was originally created as a companion to the book "Java Virtual Machine", +written by Jon Meyer and Troy Downing and published by O'Reilly Associates. The +book is now out of print. Jasmin survives as a SourceForge Open Source project. +

+ +

Jasmin Design

+ +

+Jasmin is designed as a simple assembler. It has a clean easy-to-learn +syntax with few bells and whistles. Where possible, Jasmin adopts a +one-to-one mapping between its syntax and the conventions followed by Java class files. +For example, package names in Jasmin are delimited with the '/' character +(e.g. "java/lang/String") used by the class file format, instead +of the '.' character (java.lang.String) used in the Java language.

+ +

+The Jasmin assembler does little compile-time processing or +checking of the input code. For example, it doesn't check that +classes you reference actually exist, or that your type descriptors are +well formed. Jasmin also lacks many of the feautures +found in full macro assemblers. For example, it doesn't +inline mathematical expressions, perform variable +substitutions, or support macros.

+ +

+On the other hand, using Jasmin you can quickly try out nearly +all of the features of the Java Virtual Machine, including +methods, fields, subroutines, exception handlers, and so on. +The Jasmin syntax is also readable and compact.

+ +

Running Jasmin

+

+The jasmin.jar file is an executable JAR file that runs Jasmin. +For example:

+ +
    java -jar jasmin.jar myfile.j
+ +

assembles the file "myfile.j". Jasmin looks at the +.class directive contained in the file to +decide where to place the output class file. So if myfile.j starts +with:

+ +
+    .class mypackage/MyClass
+
+ +

then Jasmin will place the output class file "MyClass.class" in the +subdirectory "mypackage" of the current directory. It will create the +mypackage directory if it doesn't exist.

+ +

You can use the "-d" option to tell jasmin to place the output +in an alternative directory. For example,

+ +
    java -jar jasmin.jar -d /tmp myfile.j 
+ +

will place the output in /tmp/mypackage/MyClass.class.

+ +

Finally, you can use the "-g" option to tell Jasmin to include +line number information (used by debuggers) in the resulting +.class file. Jasmin will number the lines in the Jasmin source +file that JVM instructions appear on. Then, if an error occurs, +you can see what instruction in the Jasmin source caused the error. +Note that specifying "-g" causes any .line directives within the +Jasmin file to be ignored. +

+ +

Statements

+ +

Jasmin source files consists of a sequence of newline-separated statements. +There are three types of statement:

+ +
    +
  • directives +
  • instructions +
  • labels +
+ +

+Directives and instructions can take parameters. These parameters +are placed on the same line as the directive or instruction, +separated by spaces.

+ +

Directives

+ +

+Directive statements are used to give Jasmin meta-level information. +Directive statements consist of a directive name, and then zero or more +parameters separated by spaces, then a newline.

+ +

+All directive names start with a "." character. The directives in Jasmin are:

+ +
+    .catch .class .end .field .implements .interface .limit .line 
+    .method .source .super .throws .var
+
+ +

+Some example directive statements are:

+ +
+    .limit stack 10
+
+    .method public myMethod()V
+
+    .class Foo
+
+ +

+The parameters used by each directive are described in more detail +later in the document.

+ +

Instructions

+ +

+An instruction statement consists of an instruction name, zero or +more parameters separated by spaces, and a newline.

+ +

+Jasmin uses the standard mnemonics for JVM opcodes as instruction names. +For example, aload_1, bipush and iinc are all Jasmin instruction names.

+ +

+Here are some examples of instruction statements:

+ +
+     ldc    "Hello World"
+     iinc   1 -1
+     bipush 10
+
+ +

+

See Jasmin Instructions for more details on +the syntax of instructions in Jasmin.

+ + +

Labels

+ +

+

A Jasmin label statement consists of a name followed by a ':', and a newline. +For example:

+ +
+    Foo:
+
+    Label:
+
+ +

Label names cannot start with a numeric digit, and cannot contain +any of the special characters:

+ +
+   = : . " -
+
+ +

+You cannot use directive names or instruction names as labels. Other +than that, there are few restrictions on label names. +For example, you could use the label:

+ +
+   #_1:
+
+ +

+Labels can only be used within method definitions. The names are +local to that method.

+ +

The Jasmin Tokenizer

+ +

+Jasmin tokenizes its input stream, splitting the stream into tokens +by looking for whitespace characters (spaces, tabs and newlines). +The tokenizer looks for:

+ +
    +
  • directive names +
  • instruction names +
  • labels +
  • comments +
  • type descriptor names +
  • class names +
  • numbers and quoted strings +
  • etc. +
+ +

+The rules used by the tokenizer are described below:

+ +

Comments

+ +

+A comment is a token that starts with a ';' character, and +terminates with the newline character at the end of the line.

+ +

+Note that the semicolon must be preceded by a whitespace character (a space, tab, newline), i.e. +embedded semicolons are ignored. For example,

+ +
+   abc;def
+
+ +

+is treated as a single token "abc;def", and

+ +
+   Ljava/lang/String;
+
+ +

+is the token "Ljava/lang/String;", whereas

+ +
+   foo ; baz ding
+
+ +

+is the token "foo" followed by a comment "baz ding".

+ +

Numbers and Strings

+ +

+In Jasmin, only simple decimal and integer numeric formats are +recognized. Floats in scientific or exponent format are not yet +supported. Character codes and octal aren't currently supported either. This +means you can have:

+ +
+    1, 123, .25, 0.03, 0xA
+
+ +

+but not

+ +
+    1e-10, 'a', '\u123'
+
+ +

+Quoted strings are also very basic. The full range of +backslash escape sequences are not supported yet, although "\n" and "\t" +are.

+ +

Class Names

+ +

Class names in Jasmin should be written using the Java class file format +conventions, so java.lang.String becomes java/lang/String.

+ + +

Type Descriptors

+ +

+Type information is also written as they appear in class files (e.g. +the descriptor I speficies an integer, [Ljava/lang/Thread; is an +array of Threads, etc.).

+ +

Methods

+ +

+Method names are specified using a single token, e.g.

+ +
+     java/io/PrintStream/println(Ljava/lang/String;)V
+
+ +

+is the method called "println" in the class java.io.PrintStream, which +has the type descriptor "(Ljava/lang/String;)V" (i.e. it takes a String +and returns no result). In general, a method specification +is formed of three parts: the characters before the last '/' form the class +name. The characters between the last '/' and '(' are the method name. The +rest of the string is the type descriptor for the method.

+ +
+     foo/baz/Myclass/myMethod(Ljava/lang/String;)V
+     ---------------         ---------------------
+           |         --------         |
+           |            |             |
+         class        method       descriptor
+
+
+ +

+As another example, you would call the Java method:

+ +
+   class mypackage.MyClass {
+       int foo(Object a, int b[]) { ... }
+   }
+
+ +

+using:

+ +
+   invokevirtual mypackage/MyClass/foo(Ljava/lang/Object;[I)I
+
+ +

Fields

+ +

+Field names are specified in Jasmin using two tokens, one giving the name +and class of the field, the other giving its descriptor. For example:

+ +
+    getstatic mypackage/MyClass/my_font   Ljava/lang/Font;
+
+ +

+gets the value of the field called "my_font" in the class mypackage.MyClass. +The type of the field is "Ljava/lang/Font;" (i.e. a Font object).

+ +

FILES

+ +

+Jasmin files start by giving information on the class +being defined in the file - such as the name of the +class, the name of the source file that the class originated from, +the name of the superclass, etc.

+ +

+Typically, a Jasmin file starts with the three directives:

+ +
+    .source <source-file>
+    .class  <access-spec> <class-name>
+    .super  <class-name>
+
+ +

+For example, the file defining MyClass might start with the directives:

+ +
+    .source MyClass.j
+    .class  public MyClass
+    .super  java/lang/Object
+
+ +

.source directive

+ +

+The .source directive is optional. It specifies the +value of the "SourceFile" attribute for the class +file. (This is used by Java to print out debugging info +if something goes wrong in one of the methods in the class). +If you generated the Jasmin file automatically (e.g. as the result of +compiling a file written in another syntax) you should use the .source +directive to tell Java the name of the originating file. Note that +the source file name should not include any pathname. Use "foo.src" +but not "/home/user/foo.src".

+ +

+If no .source directive is given, the name of the Jasmin +file you are compiling is used instead as the SourceFile attribute +instead.

+ +

.class and .super directives

+ +

+The .class and .super directive tell the JVM the name of this +class and its superclass. These directives take parameters as +follows: +

+ +
+
<class-name>
+
is the full name of the class, including +any package names. For example foo/baz/MyClass.

+

+ +
<access-spec>
+
defines access permissions and other attributes for +the class. This is a list of zero or more of the following +keywords:

+

+ public, final, super, interface, abstract +
+
+ +

.interface directive

+ +

+Note that, instead of using the directive .class, +you can alternatively use the directive .interface. This has +the same syntax as the .class directive, but indicates that the Jasmin file +is defining a Java interface. e.g.

+ +
+    .interface public foo
+
+ +

.implements directive

+ +

+After .source, .class and .super, you can list the +interfaces that are implemented by the class you are defining, using +the .implements directive. The syntax of .implements is:

+ +
+    .implements <class-name>
+
+

+where <class-name> has the same format as was used by .class and .super. +For example:

+ +
+    .class foo
+    .super java/lang/Object
+    .implements Edible
+    .implements java/lang/Throwable
+
+ +

Field Definitions

+ +

+After the header information, the next section of the Jasmin file +is a list of field definitions.

+ +

+A field is defined using the .field directive:

+ +
+    .field <access-spec> <field-name> <descriptor> [ = <value> ]
+
+ +

+where:

+ +
+
<access-spec> +
is one of the keywords: +
+ public, private, protected, static, final, + volatile, transient +
+

+ +

<field-name> +
is the name of the field.

+ +

<descriptor> +
is its type descriptor.

+ +

<value> +
is an integer, a quoted string or a decimal number, giving the +initial value of the field (for final fields).

+ + +

+For example, the Java field definition:

+ +
+    public int foo;
+
+ +

+becomes

+ +
+    .field public foo I
+
+ +

+whereas the constant:

+ +
+    public static final float PI = 3.14;
+
+ +

+becomes

+ +
+    .field public static final PI F = 3.14
+
+ +

Method Definitions

+ +

+After listing the fields of the class, the rest of the Jasmin file lists +methods defined by the class.

+ +

+A method is defined using the basic form:

+ +
+    .method <access-spec> <method-spec>
+        <statements>
+    .end method
+
+ +

+where:

+ +
+
<access-spec> +
is one of the keywords: public, private, protected, static, final, +synchronized, native, abstract

+ +

<method-spec> +
is the name and type descriptor of the method.

+ +

<statements> +
is the code defining the body of the method.

+

+ +

+Method definitions cannot be nested. Also, Jasmin does not +insert an implicit 'return' instruction at the end of a method. It is +up to you to ensure that your methods return cleanly. So +the most basic Jasmin method is something like:

+ +
+   .method foo()V
+       return     ; must give a return statement
+   .end method
+
+ +

Method Directives

+ +

+The following directives can be used only within method definitions:

+ +
+
.limit stack <integer>

+

Sets the maximum size of the operand stack +required by the method. + +
.limit locals <integer>

+

Sets the number of local variables +required by the method. + +
.line <integer>

+

This is used to tag the subsequent +instruction(s) with a line number. Debuggers use this information, +together with the name of the source file (see .source above) +to show at what line in a method things went wrong. If you are +generating Jasmin files by compiling a source file, +this directive lets you indicate what line +numbers in the source file produced corrosponding Jasmin +instructions. For example: + +
+    .method foo()V
+    .line 5    
+        bipush 10    // these instructions generated from line 5
+        istore_2     // of the source file.
+    .line 6
+        ... 
+
+ +
.var <var-number> is  <name> <descriptor> from <label1> to <label2>

+

The .var directive is used to define the name, type descriptor and scope of +a local variable number. This information is used by debuggers +so that they can be more helpful when printing out the values of local +variables (rather than printing just a local variable number, the +debugger can actually print out the name of the variable). For example: + +
+    .method foo()V
+        .limit locals 1
+
+        ; declare variable 0 as an "int Count;"
+        ; whose scope is the code between Label1 and Label2
+        ;
+        .var 0 is Count I from Label1 to Label2
+
+    Label1:
+        bipush 10
+        istore_0
+    Label2:
+
+        return
+    .end method
+
+ +
.throws <classname>

+

Indicates that this method can throw +exceptions of the type indicated by <classname>. +e.g. +
+    .throws java/io/IOException
+
+ +This information isn't required by Java runtime systems, +but it is used by the Java compiler to check that methods +either catch exceptions they can cause, or declare +that they throw them. + +
.catch <classname> from <label1> to <label2> using <label3>

+

Appends an entry to the end of the exceptions table for the +method. The entry indicates that when an exception which is +an instance of <classname> or one of its subclasses is thrown +while executing the code between <label1> and <label2>, then +the runtime system should jump to <label3>. e.g.

+

+    .catch java/io/IOException from L1 to L2 using IO_Handler
+
+ +If classname is the keyword "all", then exceptions of any +class are caught by the handler.

+ +

+ +

Abstract Methods

+ +

+To declare an abstract method, write a method with no body. e.g.

+ +
+    .method abstract myAbstract()V
+    .end method
+
+ +

+note that abstract methods can have .throws directives, e.g.

+ +
+    .method abstract anotherAbstract()V
+        .throws java/io/IOException
+    .end method
+
+ +

Instructions

+ +

+JVM instructions are placed between the .method and +.end method directives. VM instructions can take zero or more +parameters, depending on the type of instruction used. Some example +instructions are shown below: +

+ +
+    iinc 1 -3    ; decrement local variable 1 by 3
+
+    bipush 10    ; push the integer 10 onto the stack
+
+    pop          ; remove the top item from the stack.
+
+
+ +

+See Jasmin Instructions for more details on the syntax +of instructions in Jasmin. +

+ +
Copyright (c) Jonathan Meyer, July 1996
+
+Jasmin Home | +Jon Meyer's Home + +
+ + diff --git a/jasmin/jasmin-2.4/docs/index.html b/jasmin/jasmin-2.4/docs/index.html new file mode 100644 index 0000000..58ed3ed --- /dev/null +++ b/jasmin/jasmin-2.4/docs/index.html @@ -0,0 +1,65 @@ + + +Jasmin Home Page + + + + +
+
+

+

+

JASMIN HOME PAGE
+Jonathan Meyer, Oct 2004 +

+
+ +

Introduction

+ +

+Jasmin is an assembler for the Java Virtual Machine. It takes +ASCII descriptions of Java classes, written in a simple +assembler-like syntax using the Java Virtual +Machine instruction set. It converts them into binary Java class files, +suitable for loading by a Java runtime system.

+

+ +

+Jasmin was originally created as a companion to the book "Java Virtual Machine", +written by Jon Meyer and Troy Downing and published by O'Reilly Associates. +Since then, it has become the de-facto standard assembly format for Java. It is used in dozens of compiler classes throughout the world, and has +been ported and cloned multiple times. For better or worse, Jasmin remains the oldest and the original Java assembler. +

+

+The O'Reilly JVM book is now out of print. Jasmin continues to survive as a SourceForge Open Source project. +

+ +

Documentation

+
+
+Jasmin Home Page +
this file (on SourceForge.net).

+ +

+Jasmin User Guide +
a brief user guide for using Jasmin.

+ +

Jasmin Instructions +
the syntax of JVM instructions in Jasmin.

+ +

+About Jasmin +
describes the background to Jasmin, who might find it interesting, etc. +Includes an example piece of Jasmin assembler to look at.

+ +

+ + +
Copyright (c) Jonathan Meyer, 2004
+
+Jasmin Home | +Jon Meyer's Home + +
+ + diff --git a/jasmin/jasmin-2.4/docs/instructions.html b/jasmin/jasmin-2.4/docs/instructions.html new file mode 100644 index 0000000..725af99 --- /dev/null +++ b/jasmin/jasmin-2.4/docs/instructions.html @@ -0,0 +1,505 @@ + + +Jasmin Instructions + + + + +
+
+

+

+

JASMIN INSTRUCTIONS
+Jonathan Meyer, July 1996 +

+
+ +

Introduction

+ +This document shows the syntax and the types of parameters required by +each Java VM instruction in Jasmin. It also shows brief illustrative +examples.

+ +See The Jasmin User Guide for a description +of other aspects of the Jasmin syntax.

+ +

Local variable instructions

+ +The following instructions use local variables:

+ +

+    ret <var-num>
+    aload <var-num>
+    astore <var-num>
+    dload <var-num>
+    dstore <var-num>
+    fload <var-num>
+    fstore <var-num>
+    iload <var-num>
+    istore <var-num>
+    lload <var-num>
+    lstore <var-num>
+
+ +for example:

+ +

+    aload 1    ; push local variable 1 onto the stack
+    ret 2      ; return to the address held in local variable 2
+
+ +

The bipush, sipush and iinc instructions

+ +The bipush and sipush instructions take an integer as a +parameter:

+ +

+    bipush <int>
+    sipush <int>
+
+ +for example:

+ +

+    bipush 100    ; push 100 onto the stack
+
+ +The iinc instruction takes two integer parameters:

+ +

+    iinc  <var-num> <amount>
+
+ +for example:

+ +

+    iinc 3 -10    ; subtract 10 from local variable 3
+
+ +

Branch instructions

+ +The following instructions take a label as a parameter: + +
+    goto  <label>
+    goto_w  <label>
+    if_acmpeq  <label>
+    if_acmpne  <label>
+    if_icmpeq  <label>
+    if_icmpge  <label>
+    if_icmpgt  <label>
+    if_icmple  <label>
+    if_icmplt  <label>
+    if_icmpne  <label>
+    ifeq  <label>
+    ifge  <label>
+    ifgt  <label>
+    ifle  <label>
+    iflt  <label>
+    ifne  <label>
+    ifnonnull  <label>
+    ifnull  <label>
+    jsr  <label>
+    jsr_w  <label>
+
+ +For example:

+ +

+
+    Label1:
+       goto Label1    ; jump to the code at Label1
+                      ; (an infinite loop!)
+
+
+ +

Class and object operations

+ +The following instructions take a class name +as a parameter: + +
+    anewarray  <class>
+    checkcast  <class>
+    instanceof <class>
+    new        <class>
+
+ +For example:

+ +

+    new java/lang/String   ; create a new String object
+
+ +

Method invokation

+ +The following instructions are used to invoke methods:

+ +

+    invokenonvirtual  <method-spec>
+    invokestatic      <method-spec>
+    invokevirtual     <method-spec>
+
+ +for example:

+ +

+
+    ; invokes java.io.PrintStream.println(String);
+
+    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
+
+
+ +A method specification is formed of three parts: the characters before the +last '/' form the class name. The characters between the last '/' and '(' are +the method name. The rest of the string is the descriptor.

+ +

+     foo/baz/Myclass/myMethod(Ljava/lang/String;)V
+     ---------------         ---------------------
+           |         --------         |
+           |            |             |
+         class        method       descriptor
+
+ + +A special case is invokeinterface, which takes a <method-spec> and +an integer indicating how many arguments the method takes:

+ +

+     invokeinterface <method-spec> <num-args>
+
+ +for example:

+ +

+     invokeinterface foo/Baz/myMethod(I)V 1
+
+ +

Field manipulation instructions

+ +The four instructions getfield, getstatic, putfield and +putstatic have the form:

+ +

+    getfield  <field-spec> <descriptor>
+    getstatic  <field-spec> <descriptor>
+    putfield  <field-spec> <descriptor>
+    putstatic  <field-spec> <descriptor>
+
+ +for example: + +
+    ; get java.lang.System.out, which is a PrintStream
+    getstatic java/lang/System/out Ljava/io/PrintStream;
+
+ +<field-spec> is composed of two parts, a classname and a fieldname. The +classname is all of the characters in the <field-spec> up to the last +'/' character, and the fieldname is the rest of the characters after the last +'/'. For example:

+ +

+      foo/baz/AnotherClass/anotherFunField
+      -- class name ------ --field name --
+
+ +<descriptor> is the Java type descriptor of the field. +For example:

+ +

+    Ljava/io/PrintStream;
+
+ + +

The newarray instruction

+ +The newarray instruction is followed by the type of the array,

+ +

+    newarray  <array-type>
+
+ +for example:

+ +

+    newarray int
+    newarray short
+    newarray float
+    etc.
+
+ +

The multianewarray instruction

+ +The multianewarray instruction takes two parameters, +the type descriptor for the array and the number of +dimensions to allocate:

+ +

+     multianewarray  <array-descriptor> <num-dimensions>
+
+ +for example:

+ +

+     multianewarray [[[I 2
+
+ +

The ldc and ldc_w instructions

+ +The ldc and ldc_w instructions are followed by a constant:

+ +

+     ldc  <constant>
+     ldc_w  <constant>
+
+ +<constant> is either an integer, a floating point number, or a +quoted string. For example:

+ +

+     ldc 1.2              ; push a float
+     ldc 10               ; push an int
+     ldc "Hello World"    ; push a String
+     ldc_w 3.141592654    ; push PI as a double
+
+ +

The lookupswitch instruction

+ +The lookupswitch instruction has the syntax:

+ +

+    <lookupswitch> ::=
+        lookupswitch
+            <int1> : <label1>
+            <int2> : <label2>
+            ...
+            default : <default-label>
+
+ +For example:

+ +

+    ; If the int on the stack is 3, jump to Label1.
+    ; If it is 5, jump to Label2.
+    ; Otherwise jump to DefaultLabel.
+
+    lookupswitch
+            3 : Label1
+            5 : Label2
+      default : DefaultLabel
+
+    Label1:
+       ... got 3
+
+    Label2:
+       ... got 5
+
+    DefaultLabel:
+       ... got something else
+
+ +

The tableswitch instruction

+ +The tableswitch instruction has the syntax:

+ +

+    <tableswitch> ::=
+        tableswitch <low>
+            <label1>
+            <label2>
+            ...
+            default : <default-label>
+
+ +For example:

+ +

+  ; If the int on the stack is 0, jump to Label1.
+  ; If it is 1, jump to Label2.
+  ; Otherwise jump to DefaultLabel.
+
+  tableswitch 0
+        Label1
+        Label2
+     default : DefaultLabel
+
+  Label1:
+     ... got 0
+
+  Label2:
+     ... got 1
+
+  DefaultLabel:
+     ... got something else
+
+ +

No parameter

+ +The following instructions (the majority) take no parameters:

+ +

+ aaload + aastore + aconst_null + aload_0 + aload_1 + aload_2 + aload_3 + areturn + arraylength + astore_0 + astore_1 + astore_2 + astore_3 + athrow + baload + bastore + breakpoint + caload + castore + d2f + d2i + d2l + dadd + daload + dastore + dcmpg + dcmpl + dconst_0 + dconst_1 + ddiv + dload_0 + dload_1 + dload_2 + dload_3 + dmul + dneg + drem + dreturn + dstore_0 + dstore_1 + dstore_2 + dstore_3 + dsub + dup + dup2 + dup2_x1 + dup2_x2 + dup_x1 + dup_x2 + f2d + f2i + f2l + fadd + faload + fastore + fcmpg + fcmpl + fconst_0 + fconst_1 + fconst_2 + fdiv + fload_0 + fload_1 + fload_2 + fload_3 + fmul + fneg + frem + freturn + fstore_0 + fstore_1 + fstore_2 + fstore_3 + fsub + i2d + i2f + i2l + iadd + iaload + iand + iastore + iconst_0 + iconst_1 + iconst_2 + iconst_3 + iconst_4 + iconst_5 + iconst_m1 + idiv + iload_0 + iload_1 + iload_2 + iload_3 + imul + ineg + int2byte + int2char + int2short + ior + irem + ireturn + ishl + ishr + istore_0 + istore_1 + istore_2 + istore_3 + isub + iushr + ixor + l2d + l2f + l2i + ladd + laload + land + lastore + lcmp + lconst_0 + lconst_1 + ldiv + lload_0 + lload_1 + lload_2 + lload_3 + lmul + lneg + lor + lrem + lreturn + lshl + lshr + lstore_0 + lstore_1 + lstore_2 + lstore_3 + lsub + lushr + lxor + monitorenter + monitorexit + nop + pop + pop2 + return + saload + sastore + swap +
+ +for example: + +
+    pop         ; remove the top item from the stack
+    iconst_1    ; push 1 onto the stack
+    swap        ; swap the top two items on the stack
+
+ +
Copyright (c) Jonathan Meyer, July 1996
+
+Jasmin Home | +Jon Meyer's Home diff --git a/jasmin/jasmin-2.4/docs/jasmin_icon.jpg b/jasmin/jasmin-2.4/docs/jasmin_icon.jpg new file mode 100644 index 0000000..ef8e772 Binary files /dev/null and b/jasmin/jasmin-2.4/docs/jasmin_icon.jpg differ diff --git a/jasmin/jasmin-2.4/docs/javavm.gif b/jasmin/jasmin-2.4/docs/javavm.gif new file mode 100644 index 0000000..fecebf0 Binary files /dev/null and b/jasmin/jasmin-2.4/docs/javavm.gif differ diff --git a/jasmin/jasmin-2.4/docs/style.css b/jasmin/jasmin-2.4/docs/style.css new file mode 100644 index 0000000..7f87f1e --- /dev/null +++ b/jasmin/jasmin-2.4/docs/style.css @@ -0,0 +1,16 @@ + +td { font-family: Verdana,Arial,Helvetica,sans-serif; color: #000000; font-size: 12px; line-height: 16px; } +td h1 { font-family: Tahoma; padding: 1px; padding-left: 4px; color: white; background-color: #303030; font-size: 20px; line-height: 24px; font-weight: bold; } +td h2{ font-family: Tahoma; color: #000000; font-size: 14px; line-height: 16px; font-weight: bold; } +td h3 { font-family: Tahoma; color: #000000; font-size: 12px; line-height: 16px; font-weight: bold; } + +.h1 { font-family: Times; color: #000000; font-size: 18px; line-height: 20px; font-weight: bold; } + +/* main text hyperlinks */ +a { color: #b11; TEXT-DECORATION: underline; } +a:visited {color: #b11} +a:hover {color: #f88} + +pre.code{ font-family: courier new; color: #202060; font-size: 12px; line-height: 14px;} +font.code{ font-family: courier new; color: #202060; font-size: 12px; line-height: 14px;} + diff --git a/jasmin/jasmin-2.4/docs/syntax.bnf b/jasmin/jasmin-2.4/docs/syntax.bnf new file mode 100644 index 0000000..d5cb2a4 --- /dev/null +++ b/jasmin/jasmin-2.4/docs/syntax.bnf @@ -0,0 +1,88 @@ +Jasmin Syntax Jonathan Meyer, April 1996 + +This file contains a simplified BNF version of the Jasmin syntax. + + jasmin_file ::= + '.class' [ ] + '.super' + [ ] + [ ] + + + ::= [ ... ] + + ::= + '.field' [ = ] + + ::= | | + + + ::= [ ... ] + + ::= + '.method' + [ ] + '.end' 'method' + + ::= [ ... ] + + ::= + + | + + | +