1
0
forked from GitHub/gf-core

completing for release

This commit is contained in:
aarne
2004-11-08 09:22:37 +00:00
parent 259e32d6e1
commit c27827a1da
8 changed files with 1453 additions and 1 deletions

View File

@@ -0,0 +1,15 @@
-- 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
data Err a = Ok a | Bad String
deriving (Read, Show, Eq)
instance Monad Err where
return = Ok
Ok a >>= f = f a
Bad s >>= f = Bad s

View File

@@ -25,6 +25,11 @@ TestImperC -- executable parser generated from ImperC.cf
runtime.class -- runtime binary generated from runtime.j
gft.tmp -- parse result generated by the compiler front end
jvm.tmp -- pseudo-JVM produced by GF linearization
TestImperC -- external parser generated by BNFC
TestImperC.hs -- the external parser Main module
ParImperC.hs -- the external parser parser module
LexImperC.hs -- the external parser lexer module
Required programs to use the compiler:
-------------------------------------

View File

@@ -0,0 +1,290 @@
{-# OPTIONS -cpp #-}
{-# LINE 3 "LexImperC.x" #-}
module LexImperC where
import ErrM
#if __GLASGOW_HASKELL__ >= 503
import Data.Array
import Data.Char (ord)
import Data.Array.Base (unsafeAt)
#else
import Array
import Char (ord)
#endif
alex_base :: Array Int Int
alex_base = listArray (0,10) [1,57,66,0,37,-28,36,46,154,362,51]
alex_table :: Array Int Int
alex_table = listArray (0,617) [0,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,2,2,2,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,6,-1,-1,-1,-1,-1,3,3,3,3,3,3,3,-1,10,10,10,10,10,10,10,10,10,10,-1,3,3,3,-1,-1,-1,2,2,2,2,2,3,7,5,4,2,2,2,2,2,3,0,0,0,0,0,0,0,0,2,0,0,-1,-1,-1,-1,-1,-1,2,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,-1,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,-1,9,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,9,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,9,9,9,9,9,9,9,9]
alex_check :: Array Int Int
alex_check = listArray (0,617) [-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,9,10,11,12,13,34,100,37,102,9,10,11,12,13,34,-1,-1,-1,-1,-1,-1,-1,-1,32,-1,-1,91,92,93,94,95,96,32,48,49,50,51,52,53,54,55,56,57,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,39,-1,-1,-1,-1,-1,-1,-1,-1,48,49,50,51,52,53,54,55,56,57,-1,-1,-1,-1,215,-1,-1,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,-1,-1,-1,247,95,-1,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,-1,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,39,248,249,250,251,252,253,254,255,48,49,50,51,52,53,54,55,56,57,-1,-1,-1,-1,-1,-1,-1,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,-1,-1,-1,-1,95,-1,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,-1,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,-1,248,249,250,251,252,253,254,255]
alex_deflt :: Array Int Int
alex_deflt = listArray (0,10) [8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
alex_accept = listArray (0::Int,10) [[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_1))],[],[],[],[],[(AlexAcc (alex_action_2))],[(AlexAcc (alex_action_2))],[(AlexAcc (alex_action_3))]]
{-# LINE 31 "LexImperC.x" #-}
tok f p s = f p s
data Tok =
TS String -- reserved words
| 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
eitherResIdent :: (String -> Tok) -> String -> Tok
eitherResIdent tv s = if isResWord s then (TS s) else (tv s) where
isResWord s = isInTree s $
B "int" (B "float" (B "else" N N) (B "if" N N)) (B "return" (B "printf" N N) (B "while" N N))
data BTree = N | B String BTree BTree deriving (Show)
isInTree :: String -> BTree -> Bool
isInTree x tree = case tree of
N -> False
B a left right
| x < a -> isInTree x left
| x > a -> isInTree x right
| x == a -> True
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, _, _) -> fail $ show pos ++ ": lexical error"
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_1 = tok (\p s -> PT p (TS s))
alex_action_2 = tok (\p s -> PT p (eitherResIdent TV s))
alex_action_3 = tok (\p s -> PT p (TI s))
{-# LINE 1 "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 22 "GenericTemplate.hs" #-}
{-# LINE 66 "GenericTemplate.hs" #-}
alexIndexShortOffAddr arr off = arr ! off
-- -----------------------------------------------------------------------------
-- Main lexing routines
data AlexReturn a
= AlexEOF
| AlexError !AlexInput
| AlexSkip !AlexInput !Int
| AlexToken !AlexInput !Int a
-- alexScan :: AlexInput -> StartCode -> Maybe (AlexInput,Int,act)
alexScan input (sc)
= alexScanUser undefined input (sc)
alexScanUser user input (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
case s of
(-1) -> (last_acc, input)
_ -> alex_scan_tkn' user orig_input len input s last_acc
alex_scan_tkn' user orig_input len input s last_acc =
let
new_acc = check_accs (alex_accept `unsafeAt` (s))
in
new_acc `seq`
case alexGetChar input of
Nothing -> (new_acc, input)
Just (c, new_input) ->
let
base = alexIndexShortOffAddr alex_base s
(ord_c) = ord c
offset = (base + ord_c)
check = alexIndexShortOffAddr alex_check offset
new_s = if (offset >= (0)) && (check == ord_c)
then alexIndexShortOffAddr alex_table offset
else alexIndexShortOffAddr alex_deflt s
in
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 (len)
check_accs (AlexAccSkip : _) = AlexLastSkip input (len)
check_accs (AlexAccPred a pred : rest)
| pred user orig_input (len) input
= AlexLastAcc a input (len)
check_accs (AlexAccSkipPred pred : rest)
| pred user orig_input (len) input
= AlexLastSkip input (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 (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

View File

@@ -0,0 +1,947 @@
{-# OPTIONS -fglasgow-exts -cpp #-}
-- parser produced by Happy Version 1.13
module ParImperC where
import Trees
import LexImperC
import ErrM
import Array
#if __GLASGOW_HASKELL__ >= 503
import GHC.Exts
#else
import GlaExts
#endif
newtype HappyAbsSyn t6 t7 = HappyAbsSyn (() -> ())
happyIn6 :: t6 -> (HappyAbsSyn t6 t7)
happyIn6 x = unsafeCoerce# x
{-# INLINE happyIn6 #-}
happyOut6 :: (HappyAbsSyn t6 t7) -> t6
happyOut6 x = unsafeCoerce# x
{-# INLINE happyOut6 #-}
happyIn7 :: t7 -> (HappyAbsSyn t6 t7)
happyIn7 x = unsafeCoerce# x
{-# INLINE happyIn7 #-}
happyOut7 :: (HappyAbsSyn t6 t7) -> t7
happyOut7 x = unsafeCoerce# x
{-# INLINE happyOut7 #-}
happyIn8 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn8 x = unsafeCoerce# x
{-# INLINE happyIn8 #-}
happyOut8 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut8 x = unsafeCoerce# x
{-# INLINE happyOut8 #-}
happyIn9 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn9 x = unsafeCoerce# x
{-# INLINE happyIn9 #-}
happyOut9 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut9 x = unsafeCoerce# x
{-# INLINE happyOut9 #-}
happyIn10 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn10 x = unsafeCoerce# x
{-# INLINE happyIn10 #-}
happyOut10 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut10 x = unsafeCoerce# x
{-# INLINE happyOut10 #-}
happyIn11 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn11 x = unsafeCoerce# x
{-# INLINE happyIn11 #-}
happyOut11 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut11 x = unsafeCoerce# x
{-# INLINE happyOut11 #-}
happyIn12 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn12 x = unsafeCoerce# x
{-# INLINE happyIn12 #-}
happyOut12 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut12 x = unsafeCoerce# x
{-# INLINE happyOut12 #-}
happyIn13 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn13 x = unsafeCoerce# x
{-# INLINE happyIn13 #-}
happyOut13 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut13 x = unsafeCoerce# x
{-# INLINE happyOut13 #-}
happyIn14 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn14 x = unsafeCoerce# x
{-# INLINE happyIn14 #-}
happyOut14 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut14 x = unsafeCoerce# x
{-# INLINE happyOut14 #-}
happyIn15 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn15 x = unsafeCoerce# x
{-# INLINE happyIn15 #-}
happyOut15 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut15 x = unsafeCoerce# x
{-# INLINE happyOut15 #-}
happyIn16 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn16 x = unsafeCoerce# x
{-# INLINE happyIn16 #-}
happyOut16 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut16 x = unsafeCoerce# x
{-# INLINE happyOut16 #-}
happyIn17 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn17 x = unsafeCoerce# x
{-# INLINE happyIn17 #-}
happyOut17 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut17 x = unsafeCoerce# x
{-# INLINE happyOut17 #-}
happyIn18 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn18 x = unsafeCoerce# x
{-# INLINE happyIn18 #-}
happyOut18 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut18 x = unsafeCoerce# x
{-# INLINE happyOut18 #-}
happyIn19 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn19 x = unsafeCoerce# x
{-# INLINE happyIn19 #-}
happyOut19 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut19 x = unsafeCoerce# x
{-# INLINE happyOut19 #-}
happyIn20 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn20 x = unsafeCoerce# x
{-# INLINE happyIn20 #-}
happyOut20 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut20 x = unsafeCoerce# x
{-# INLINE happyOut20 #-}
happyIn21 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn21 x = unsafeCoerce# x
{-# INLINE happyIn21 #-}
happyOut21 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut21 x = unsafeCoerce# x
{-# INLINE happyOut21 #-}
happyIn22 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn22 x = unsafeCoerce# x
{-# INLINE happyIn22 #-}
happyOut22 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut22 x = unsafeCoerce# x
{-# INLINE happyOut22 #-}
happyIn23 :: (CFTree) -> (HappyAbsSyn t6 t7)
happyIn23 x = unsafeCoerce# x
{-# INLINE happyIn23 #-}
happyOut23 :: (HappyAbsSyn t6 t7) -> (CFTree)
happyOut23 x = unsafeCoerce# x
{-# INLINE happyOut23 #-}
happyInTok :: Token -> (HappyAbsSyn t6 t7)
happyInTok x = unsafeCoerce# x
{-# INLINE happyInTok #-}
happyOutTok :: (HappyAbsSyn t6 t7) -> Token
happyOutTok x = unsafeCoerce# x
{-# INLINE happyOutTok #-}
happyActOffsets :: HappyAddr
happyActOffsets = HappyA# "\xf8\xff\xfc\xff\x05\x00\xcc\x00\x00\x00\xde\x00\xd5\x00\xc8\x00\x00\x00\xc4\x00\xd1\x00\x00\x00\x05\x00\x00\x00\xda\x00\xc2\x00\xc6\x00\x00\x00\xfc\xff\x00\x00\xd9\x00\x00\x00\xd8\x00\x03\x00\xd7\x00\xc1\x00\xbd\x00\xd4\x00\x05\x00\xd0\x00\x00\x00\x2c\x00\x05\x00\xcb\x00\xcf\x00\x05\x00\xcd\x00\x05\x00\x05\x00\x05\x00\x05\x00\xb4\x00\x01\x00\xc3\x00\x89\x00\x00\x00\x00\x00\x7d\x00\xfb\xff\x7d\x00\x00\x00\x00\x00\xc5\x00\xfc\xff\xfc\xff\x87\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x11\x00\x6c\x00\x76\x00\x6b\x00\xfc\xff\x05\x00\xfc\xff\x00\x00\x00\x00\xfc\xff\x00\x00\x05\x00\x00\x00\x00\x00\x63\x00\x6a\x00\xfc\xff\xfc\xff\x61\x00\x59\x00\xf8\xff\xfc\xff\x64\x00\x00\x00\x60\x00\xfc\xff\xfc\xff\xfc\xff\x5a\x00\x00\x00\x52\x00\x00\x00\x48\x00\xf8\xff\x00\x00\x00\x00\x00\x00\xf8\xff\x00\x00\x29\x00\x00\x00"#
happyGotoOffsets :: HappyAddr
happyGotoOffsets = HappyA# "\x49\x00\x7a\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x1d\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x0c\x00\x9b\x00\x00\x00\x00\x00\x94\x00\x00\x00\x36\x00\xc7\x00\xbe\x00\xc0\x00\x14\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x0b\x00\x00\x00\x00\x00\x62\x00\x8d\x00\x5c\x00\x00\x00\x00\x00\x56\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x4a\x00\x00\x00\x00\x00\x15\x00\x32\x00\x00\x00\x00\x00\x00\x00\x44\x00\x3e\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00"#
happyDefActions :: HappyAddr
happyDefActions = HappyA# "\xd4\xff\xe9\xff\x00\x00\x00\x00\xfc\xff\xed\xff\xee\xff\x00\x00\xfa\xff\xf9\xff\xf7\xff\xf4\xff\x00\x00\xfb\xff\x00\x00\x00\x00\x00\x00\xe2\xff\xe9\xff\xdf\xff\x00\x00\xde\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xff\x00\x00\xf0\xff\xef\xff\xf5\xff\xf8\xff\xf6\xff\xf3\xff\xf2\xff\x00\x00\xe9\xff\xe9\xff\x00\x00\x00\x00\xe3\xff\xe1\xff\xe0\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xff\x00\x00\xe9\xff\xeb\xff\xea\xff\xe9\xff\xf1\xff\x00\x00\xd8\xff\xec\xff\x00\x00\x00\x00\xe9\xff\xe9\xff\x00\x00\xda\xff\x00\x00\xe9\xff\x00\x00\xe4\xff\x00\x00\xe9\xff\xe9\xff\xe9\xff\x00\x00\xd9\xff\x00\x00\xdb\xff\x00\x00\xd4\xff\xe7\xff\xe8\xff\xd2\xff\xd4\xff\xd3\xff\xdc\xff"#
happyCheck :: HappyAddr
happyCheck = HappyA# "\xff\xff\x05\x00\x01\x00\x02\x00\x01\x00\x0a\x00\x01\x00\x04\x00\x10\x00\x0e\x00\x12\x00\x00\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x02\x00\x08\x00\x01\x00\x0a\x00\x16\x00\x17\x00\x16\x00\x17\x00\x16\x00\x17\x00\x00\x00\x09\x00\x00\x00\x0b\x00\x10\x00\x0d\x00\x12\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x0f\x00\x08\x00\x09\x00\x00\x00\x01\x00\x00\x00\x07\x00\x0f\x00\x09\x00\x06\x00\x0b\x00\x00\x00\x07\x00\x0e\x00\x09\x00\x19\x00\x0b\x00\x00\x00\x07\x00\x09\x00\x09\x00\x0b\x00\x0b\x00\x00\x00\x07\x00\x04\x00\x09\x00\x11\x00\x0b\x00\x00\x00\x07\x00\x09\x00\x09\x00\x0b\x00\x0b\x00\x00\x00\x07\x00\x06\x00\x09\x00\x11\x00\x0b\x00\x00\x00\x07\x00\x04\x00\x09\x00\x07\x00\x0b\x00\x00\x00\x07\x00\x04\x00\x09\x00\x05\x00\x0b\x00\x00\x00\x07\x00\x06\x00\x09\x00\x02\x00\x0b\x00\x00\x00\x07\x00\x05\x00\x09\x00\x0f\x00\x0b\x00\x00\x00\x07\x00\x07\x00\x09\x00\x02\x00\x0b\x00\x00\x00\x07\x00\x09\x00\x09\x00\x0b\x00\x0b\x00\x0d\x00\x07\x00\x16\x00\x09\x00\x09\x00\x0b\x00\x0b\x00\x0c\x00\x02\x00\x02\x00\x0d\x00\x02\x00\x11\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x00\x00\x01\x00\x00\x00\x01\x00\x04\x00\x05\x00\x06\x00\x05\x00\x06\x00\x00\x00\x01\x00\x04\x00\x07\x00\x17\x00\x05\x00\x06\x00\x0a\x00\x02\x00\x0c\x00\x06\x00\x0e\x00\x04\x00\x04\x00\x01\x00\x19\x00\x16\x00\x01\x00\x01\x00\x01\x00\x19\x00\x16\x00\x03\x00\x0d\x00\x01\x00\x0b\x00\x19\x00\x16\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"#
happyTable :: HappyAddr
happyTable = HappyA# "\x00\x00\x13\x00\x0d\x00\x2e\x00\x0d\x00\x27\x00\x0d\x00\x1f\x00\x14\x00\x29\x00\x16\x00\x51\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x05\x00\x42\x00\x38\x00\x2e\x00\x39\x00\x05\x00\x0e\x00\x05\x00\x0e\x00\x05\x00\x0e\x00\x1b\x00\x3f\x00\x22\x00\x11\x00\x14\x00\x5d\x00\x16\x00\x05\x00\x06\x00\x2b\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x2b\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0e\x00\x4a\x00\x3b\x00\x3c\x00\x05\x00\x06\x00\x0e\x00\x5b\x00\x2c\x00\x10\x00\x32\x00\x11\x00\x0e\x00\x60\x00\x5c\x00\x10\x00\xdc\xff\x11\x00\x0e\x00\x61\x00\x19\x00\x10\x00\x11\x00\x11\x00\x0e\x00\x58\x00\x64\x00\x10\x00\x62\x00\x11\x00\x0e\x00\x54\x00\x19\x00\x10\x00\x11\x00\x11\x00\x0e\x00\x55\x00\x5f\x00\x10\x00\x1a\x00\x11\x00\x0e\x00\x4b\x00\x60\x00\x10\x00\x53\x00\x11\x00\x0e\x00\x4c\x00\x5a\x00\x10\x00\x54\x00\x11\x00\x0e\x00\x4e\x00\x5b\x00\x10\x00\x57\x00\x11\x00\x0e\x00\x45\x00\x50\x00\x10\x00\x58\x00\x11\x00\x0e\x00\x46\x00\x44\x00\x10\x00\x51\x00\x11\x00\x0e\x00\x21\x00\x3f\x00\x10\x00\x11\x00\x11\x00\x40\x00\x0f\x00\x05\x00\x10\x00\x19\x00\x11\x00\x11\x00\x64\x00\x43\x00\x45\x00\x26\x00\x49\x00\x65\x00\x05\x00\x06\x00\x4d\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x34\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x37\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x3d\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x1d\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x24\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\x05\x00\x06\x00\x30\x00\x0a\x00\x0b\x00\x2f\x00\x0b\x00\x05\x00\x06\x00\x48\x00\x4a\x00\x0e\x00\x31\x00\x0b\x00\x27\x00\x34\x00\x28\x00\x37\x00\x29\x00\x36\x00\x3d\x00\x3f\x00\xff\xff\x05\x00\x1d\x00\x20\x00\x21\x00\xff\xff\x05\x00\x24\x00\x26\x00\x2b\x00\x2a\x00\xff\xff\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 = array (3, 45) [
(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)
]
happy_n_terms = 26 :: Int
happy_n_nonterms = 18 :: Int
happyReduce_3 = happySpecReduce_1 0# happyReduction_3
happyReduction_3 happy_x_1
= case happyOutTok happy_x_1 of { (PT _ (TV happy_var_1)) ->
happyIn6
(mkAtTree (AV (Ident happy_var_1))
)}
happyReduce_4 = happySpecReduce_1 1# happyReduction_4
happyReduction_4 happy_x_1
= case happyOutTok happy_x_1 of { (PT _ (TI happy_var_1)) ->
happyIn7
(mkAtTree (AI ((read happy_var_1) :: Integer))
)}
happyReduce_5 = happySpecReduce_1 2# happyReduction_5
happyReduction_5 happy_x_1
= case happyOut9 happy_x_1 of { happy_var_1 ->
happyIn8
(happy_var_1
)}
happyReduce_6 = happySpecReduce_1 3# happyReduction_6
happyReduction_6 happy_x_1
= case happyOut10 happy_x_1 of { happy_var_1 ->
happyIn9
(happy_var_1
)}
happyReduce_7 = happySpecReduce_3 3# happyReduction_7
happyReduction_7 happy_x_3
happy_x_2
happy_x_1
= case happyOut10 happy_x_1 of { happy_var_1 ->
case happyOut10 happy_x_3 of { happy_var_3 ->
happyIn9
(mkFunTree "ELt" [([],[]),([],[0]),([],[1])] [ happy_var_1 , happy_var_3 ]
)}}
happyReduce_8 = happySpecReduce_1 4# happyReduction_8
happyReduction_8 happy_x_1
= case happyOut11 happy_x_1 of { happy_var_1 ->
happyIn10
(happy_var_1
)}
happyReduce_9 = happySpecReduce_3 4# happyReduction_9
happyReduction_9 happy_x_3
happy_x_2
happy_x_1
= case happyOut10 happy_x_1 of { happy_var_1 ->
case happyOut11 happy_x_3 of { happy_var_3 ->
happyIn10
(mkFunTree "EAdd" [([],[]),([],[0]),([],[1])] [ happy_var_1 , happy_var_3 ]
)}}
happyReduce_10 = happySpecReduce_3 4# happyReduction_10
happyReduction_10 happy_x_3
happy_x_2
happy_x_1
= case happyOut10 happy_x_1 of { happy_var_1 ->
case happyOut11 happy_x_3 of { happy_var_3 ->
happyIn10
(mkFunTree "ESub" [([],[]),([],[0]),([],[1])] [ happy_var_1 , happy_var_3 ]
)}}
happyReduce_11 = happySpecReduce_1 5# happyReduction_11
happyReduction_11 happy_x_1
= case happyOut12 happy_x_1 of { happy_var_1 ->
happyIn11
(happy_var_1
)}
happyReduce_12 = happySpecReduce_3 5# 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 ->
happyIn11
(mkFunTree "EMul" [([],[]),([],[0]),([],[1])] [ happy_var_1 , happy_var_3 ]
)}}
happyReduce_13 = happySpecReduce_3 6# happyReduction_13
happyReduction_13 happy_x_3
happy_x_2
happy_x_1
= case happyOut8 happy_x_2 of { happy_var_2 ->
happyIn12
(happy_var_2
)}
happyReduce_14 = happyReduce 4# 6# happyReduction_14
happyReduction_14 (happy_x_4 `HappyStk`
happy_x_3 `HappyStk`
happy_x_2 `HappyStk`
happy_x_1 `HappyStk`
happyRest)
= case happyOut6 happy_x_1 of { happy_var_1 ->
case happyOut21 happy_x_3 of { happy_var_3 ->
happyIn12
(mkFunTree "EApp" [([],[]),([],[]),([],[0]),([],[1])] [ happy_var_1 , happy_var_3 ]
) `HappyStk` happyRest}}
happyReduce_15 = happySpecReduce_3 6# happyReduction_15
happyReduction_15 happy_x_3
happy_x_2
happy_x_1
= case happyOut6 happy_x_1 of { happy_var_1 ->
happyIn12
(mkFunTree "EAppNil" [([],[]),([],[0])] [ happy_var_1 ]
)}
happyReduce_16 = happySpecReduce_3 6# happyReduction_16
happyReduction_16 happy_x_3
happy_x_2
happy_x_1
= case happyOut7 happy_x_1 of { happy_var_1 ->
case happyOut7 happy_x_3 of { happy_var_3 ->
happyIn12
(mkFunTree "EFloat" [([],[0]),([],[1])] [ happy_var_1 , happy_var_3 ]
)}}
happyReduce_17 = happySpecReduce_1 6# happyReduction_17
happyReduction_17 happy_x_1
= case happyOut7 happy_x_1 of { happy_var_1 ->
happyIn12
(mkFunTree "EInt" [([],[0])] [ happy_var_1 ]
)}
happyReduce_18 = happySpecReduce_1 6# happyReduction_18
happyReduction_18 happy_x_1
= case happyOut6 happy_x_1 of { happy_var_1 ->
happyIn12
(mkFunTree "EVar" [([],[]),([],[0])] [ happy_var_1 ]
)}
happyReduce_19 = happyReduce 5# 7# happyReduction_19
happyReduction_19 (happy_x_5 `HappyStk`
happy_x_4 `HappyStk`
happy_x_3 `HappyStk`
happy_x_2 `HappyStk`
happy_x_1 `HappyStk`
happyRest)
= case happyOut6 happy_x_1 of { happy_var_1 ->
case happyOut8 happy_x_3 of { happy_var_3 ->
case happyOut13 happy_x_5 of { happy_var_5 ->
happyIn13
(mkFunTree "Assign" [([],[]),([],[0]),([],[1]),([],[2])] [ happy_var_1 , happy_var_3 , happy_var_5 ]
) `HappyStk` happyRest}}}
happyReduce_20 = happyReduce 4# 7# happyReduction_20
happyReduction_20 (happy_x_4 `HappyStk`
happy_x_3 `HappyStk`
happy_x_2 `HappyStk`
happy_x_1 `HappyStk`
happyRest)
= case happyOut13 happy_x_2 of { happy_var_2 ->
case happyOut13 happy_x_4 of { happy_var_4 ->
happyIn13
(mkFunTree "Block" [([],[0]),([],[1])] [ happy_var_2 , happy_var_4 ]
) `HappyStk` happyRest}}
happyReduce_21 = happyReduce 4# 7# happyReduction_21
happyReduction_21 (happy_x_4 `HappyStk`
happy_x_3 `HappyStk`
happy_x_2 `HappyStk`
happy_x_1 `HappyStk`
happyRest)
= case happyOut15 happy_x_1 of { happy_var_1 ->
case happyOut6 happy_x_2 of { happy_var_2 ->
case happyOut13 happy_x_4 of { happy_var_4 ->
happyIn13
(mkFunTree "Decl" [([],[0]),([[1]],[2])] [ happy_var_1 , happy_var_2 , happy_var_4 ]
) `HappyStk` happyRest}}}
happyReduce_22 = happySpecReduce_0 7# happyReduction_22
happyReduction_22 = happyIn13
(mkFunTree "End" [] [ ]
)
happyReduce_23 = happyReduce 8# 7# happyReduction_23
happyReduction_23 (happy_x_8 `HappyStk`
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 happyOut8 happy_x_3 of { happy_var_3 ->
case happyOut13 happy_x_5 of { happy_var_5 ->
case happyOut13 happy_x_7 of { happy_var_7 ->
case happyOut13 happy_x_8 of { happy_var_8 ->
happyIn13
(mkFunTree "IfElse" [([],[0]),([],[1]),([],[2]),([],[3])] [ happy_var_3 , happy_var_5 , happy_var_7 , happy_var_8 ]
) `HappyStk` happyRest}}}}
happyReduce_24 = happyReduce 8# 7# happyReduction_24
happyReduction_24 (happy_x_8 `HappyStk`
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 happyOut14 happy_x_3 of { happy_var_3 ->
case happyOut8 happy_x_5 of { happy_var_5 ->
case happyOut13 happy_x_8 of { happy_var_8 ->
happyIn13
(mkFunTree "Printf" [([],[0]),([],[1]),([],[2])] [ happy_var_3 , happy_var_5 , happy_var_8 ]
) `HappyStk` happyRest}}}
happyReduce_25 = happySpecReduce_3 7# happyReduction_25
happyReduction_25 happy_x_3
happy_x_2
happy_x_1
= case happyOut8 happy_x_2 of { happy_var_2 ->
happyIn13
(mkFunTree "Return" [([],[]),([],[0])] [ happy_var_2 ]
)}
happyReduce_26 = happySpecReduce_2 7# happyReduction_26
happyReduction_26 happy_x_2
happy_x_1
= happyIn13
(mkFunTree "Returnv" [] [ ]
)
happyReduce_27 = happyReduce 6# 7# happyReduction_27
happyReduction_27 (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 happyOut8 happy_x_3 of { happy_var_3 ->
case happyOut13 happy_x_5 of { happy_var_5 ->
case happyOut13 happy_x_6 of { happy_var_6 ->
happyIn13
(mkFunTree "While" [([],[0]),([],[1]),([],[2])] [ happy_var_3 , happy_var_5 , happy_var_6 ]
) `HappyStk` happyRest}}}
happyReduce_28 = happySpecReduce_1 8# happyReduction_28
happyReduction_28 happy_x_1
= case happyOut16 happy_x_1 of { happy_var_1 ->
happyIn14
(mkFunTree "TNum" [([],[0])] [ happy_var_1 ]
)}
happyReduce_29 = happySpecReduce_1 9# happyReduction_29
happyReduction_29 happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
happyIn15
(mkFunTree "TNum" [([],[0])] [ happy_var_1 ]
)}
happyReduce_30 = happySpecReduce_1 10# happyReduction_30
happyReduction_30 happy_x_1
= happyIn16
(mkFunTree "TFloat" [] [ ]
)
happyReduce_31 = happySpecReduce_1 10# happyReduction_31
happyReduction_31 happy_x_1
= happyIn16
(mkFunTree "TInt" [] [ ]
)
happyReduce_32 = happySpecReduce_1 11# happyReduction_32
happyReduction_32 happy_x_1
= happyIn17
(mkFunTree "TFloat" [] [ ]
)
happyReduce_33 = happySpecReduce_1 11# happyReduction_33
happyReduction_33 happy_x_1
= happyIn17
(mkFunTree "TInt" [] [ ]
)
happyReduce_34 = happySpecReduce_1 12# happyReduction_34
happyReduction_34 happy_x_1
= case happyOut23 happy_x_1 of { happy_var_1 ->
happyIn18
(mkFunTree "RecCons" [([],[]),([],[]),([[]],[]),([],[0])] [ happy_var_1 ]
)}
happyReduce_35 = happySpecReduce_1 12# happyReduction_35
happyReduction_35 happy_x_1
= case happyOut23 happy_x_1 of { happy_var_1 ->
happyIn18
(mkFunTree "RecOne" [([],[]),([[]],[]),([],[0])] [ happy_var_1 ]
)}
happyReduce_36 = happyReduce 4# 13# happyReduction_36
happyReduction_36 (happy_x_4 `HappyStk`
happy_x_3 `HappyStk`
happy_x_2 `HappyStk`
happy_x_1 `HappyStk`
happyRest)
= case happyOut15 happy_x_1 of { happy_var_1 ->
case happyOut6 happy_x_2 of { happy_var_2 ->
case happyOut19 happy_x_4 of { happy_var_4 ->
happyIn19
(mkFunTree "RecCons" [([],[0]),([],[]),([[1]],[2]),([],[])] [ happy_var_1 , happy_var_2 , happy_var_4 ]
) `HappyStk` happyRest}}}
happyReduce_37 = happySpecReduce_2 13# happyReduction_37
happyReduction_37 happy_x_2
happy_x_1
= case happyOut15 happy_x_1 of { happy_var_1 ->
case happyOut6 happy_x_2 of { happy_var_2 ->
happyIn19
(mkFunTree "RecOne" [([],[0]),([[1]],[]),([],[])] [ happy_var_1 , happy_var_2 ]
)}}
happyReduce_38 = happySpecReduce_1 14# happyReduction_38
happyReduction_38 happy_x_1
= case happyOut13 happy_x_1 of { happy_var_1 ->
happyIn20
(mkFunTree "RecOne" [([],[]),([[]],[0]),([],[])] [ happy_var_1 ]
)}
happyReduce_39 = happySpecReduce_3 15# happyReduction_39
happyReduction_39 happy_x_3
happy_x_2
happy_x_1
= case happyOut8 happy_x_1 of { happy_var_1 ->
case happyOut21 happy_x_3 of { happy_var_3 ->
happyIn21
(mkFunTree "ConsExp" [([],[]),([],[]),([],[0]),([],[1])] [ happy_var_1 , happy_var_3 ]
)}}
happyReduce_40 = happySpecReduce_1 15# happyReduction_40
happyReduction_40 happy_x_1
= case happyOut8 happy_x_1 of { happy_var_1 ->
happyIn21
(mkFunTree "OneExp" [([],[]),([],[0])] [ happy_var_1 ]
)}
happyReduce_41 = happySpecReduce_2 16# happyReduction_41
happyReduction_41 happy_x_2
happy_x_1
= case happyOut15 happy_x_1 of { happy_var_1 ->
case happyOut22 happy_x_2 of { happy_var_2 ->
happyIn22
(mkFunTree "ConsTyp" [([],[0]),([],[1])] [ happy_var_1 , happy_var_2 ]
)}}
happyReduce_42 = happySpecReduce_0 16# happyReduction_42
happyReduction_42 = happyIn22
(mkFunTree "NilTyp" [] [ ]
)
happyReduce_43 = happySpecReduce_0 17# happyReduction_43
happyReduction_43 = happyIn23
(mkFunTree "Empty" [] [ ]
)
happyReduce_44 = happyReduce 10# 17# happyReduction_44
happyReduction_44 (happy_x_10 `HappyStk`
happy_x_9 `HappyStk`
happy_x_8 `HappyStk`
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 happyOut15 happy_x_1 of { happy_var_1 ->
case happyOut6 happy_x_2 of { happy_var_2 ->
case happyOut19 happy_x_4 of { happy_var_4 ->
case happyOut20 happy_x_7 of { happy_var_7 ->
case happyOut18 happy_x_10 of { happy_var_10 ->
happyIn23
(mkFunTree "Funct" [([],[]),([],[0]),([[1]],[2,3,4])] [ happy_var_1 , happy_var_2 , happy_var_4 , happy_var_7 , happy_var_10 ]
) `HappyStk` happyRest}}}}}
happyReduce_45 = happyReduce 9# 17# happyReduction_45
happyReduction_45 (happy_x_9 `HappyStk`
happy_x_8 `HappyStk`
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 happyOut15 happy_x_1 of { happy_var_1 ->
case happyOut6 happy_x_2 of { happy_var_2 ->
case happyOut13 happy_x_6 of { happy_var_6 ->
case happyOut23 happy_x_9 of { happy_var_9 ->
happyIn23
(mkFunTree "FunctNil" [([],[0]),([],[2]),([[1]],[3])] [ happy_var_1 , happy_var_2 , happy_var_6 , happy_var_9 ]
) `HappyStk` happyRest}}}}
happyNewToken action sts stk [] =
happyDoAction 25# (error "reading EOF!") 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 "\"%f\"") -> cont 8#;
PT _ (TS "\"%d\"") -> cont 9#;
PT _ (TS "+") -> cont 10#;
PT _ (TS ".") -> cont 11#;
PT _ (TS "<") -> cont 12#;
PT _ (TS "*") -> cont 13#;
PT _ (TS "-") -> cont 14#;
PT _ (TS "else") -> cont 15#;
PT _ (TS "float") -> cont 16#;
PT _ (TS "if") -> cont 17#;
PT _ (TS "int") -> cont 18#;
PT _ (TS "printf") -> cont 19#;
PT _ (TS "return") -> cont 20#;
PT _ (TS "while") -> cont 21#;
PT _ (TV happy_dollar_dollar) -> cont 22#;
PT _ (TI happy_dollar_dollar) -> cont 23#;
_ -> cont 24#;
_ -> happyError 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 tks -> (returnM) a
pProgram tks = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut23 x))
pStm tks = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut13 x))
pExp tks = happyThen (happyParse 2# 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 ++ if null ts then [] else (" before " ++ unwords (map prToken (take 4 ts)))
myLexer = tokens
{-# LINE 1 "GenericTemplate.hs" #-}
-- $Id: ParImperC.hs,v 1.1 2004/11/08 10:22:38 aarne Exp $
{-# LINE 27 "GenericTemplate.hs" #-}
data Happy_IntList = HappyCons Int# Happy_IntList
infixr 9 `HappyStk`
data HappyStk a = HappyStk a (HappyStk a)
-----------------------------------------------------------------------------
-- starting the parse
happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
-----------------------------------------------------------------------------
-- Accepting the parse
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 <# (0# :: Int#)) -> {- nothing -}
(happyReduceArr ! rule) i tk st
where rule = (I# ((negateInt# ((n +# (1# :: Int#))))))
n -> {- nothing -}
happyShift new_state i tk st
where new_state = (n -# (1# :: Int#))
where off = indexShortOffAddr happyActOffsets st
off_i = (off +# i)
check = if (off_i >=# (0# :: Int#))
then (indexShortOffAddr happyCheck off_i ==# i)
else False
action | check = indexShortOffAddr happyTable off_i
| otherwise = indexShortOffAddr happyDefActions st
indexShortOffAddr (HappyA# arr) off =
#if __GLASGOW_HASKELL__ > 500
narrow16Int# i
#elif __GLASGOW_HASKELL__ == 500
intToInt16# i
#else
(i `iShiftL#` 16#) `iShiftRA#` 16#
#endif
where
#if __GLASGOW_HASKELL__ >= 503
i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
#else
i = word2Int# ((high `shiftL#` 8#) `or#` low)
#endif
high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
low = int2Word# (ord# (indexCharOffAddr# arr off'))
off' = off *# 2#
data HappyAddr = HappyA# Addr#
-----------------------------------------------------------------------------
-- HappyState data type (not arrays)
{-# LINE 165 "GenericTemplate.hs" #-}
-----------------------------------------------------------------------------
-- Shifting a token
happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
let i = (case unsafeCoerce# x of { (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 -# (1# :: 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) (\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
happyDrop 0# l = l
happyDrop n (HappyCons (_) (t)) = happyDrop (n -# (1# :: Int#)) t
happyDropStk 0# l = l
happyDropStk n (x `HappyStk` xs) = happyDropStk (n -# (1#::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 +# 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
{- 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 ( (unsafeCoerce# (I# (i))) `HappyStk` stk)
-- Internal happy errors:
notHappyAtAll = error "Internal Happy error\n"
-----------------------------------------------------------------------------
-- Hack to get the typechecker to accept our action functions
happyTcHack :: 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.

View File

@@ -0,0 +1,90 @@
module Profile (postParse) where
import Trees
import ErrM
import Monad
import List (nub)
-- restoring parse trees for discontinuous constituents, bindings, etc. AR 25/1/2001
-- revised 8/4/2002 for the new profile structure
postParse :: CFTree -> Err Exp
postParse tree = do
iterm <- tree2term tree
return $ term2trm iterm
-- an intermediate data structure
data ITerm = ITerm (Atom, BindVs) [ITerm] | IMeta deriving (Eq,Show)
type BindVs = [[Ident]]
-- the job is done in two passes:
-- (1) tree2term: restore constituent order from Profile
-- (2) term2trm: restore Bindings from Binds
tree2term :: CFTree -> Err ITerm
tree2term (CFTree (cff@(CFFun (fun,pro)), trees)) = case fun of
AM -> return IMeta
_ -> do
args <- mapM mkArg pro
binds <- mapM mkBinds pro
return $ ITerm (fun, binds) args
where
mkArg (_,arg) = case arg of
[x] -> do -- one occurrence
trx <- trees !? x
tree2term trx
[] -> return IMeta -- suppression
_ -> do -- reduplication
trees' <- mapM (trees !?) arg
xs1 <- mapM tree2term trees'
xs2 <- checkArity xs1
unif xs2
checkArity xs = if length (nub [length xx | ITerm _ xx <- xs']) > 1
then Bad "arity error"
else return xs'
where xs' = [t | t@(ITerm _ _) <- xs]
unif xs = case [t | t@(ITerm _ _) <- xs] of
[] -> return $ IMeta
(ITerm fp@(f,_) xx : ts) -> do
let hs = [h | ITerm (h,_) _ <- ts, h /= f]
testErr (null hs) -- if fails, hs must be nonempty
("unification expects " ++ prt f ++ " but found " ++ prt (head hs))
xx' <- mapM unifArg [0 .. length xx - 1]
return $ ITerm fp xx'
where
unifArg i = unif [zz !! i | ITerm _ zz <- xs]
mkBinds (xss,_) = mapM mkBind xss
mkBind xs = do
ts <- mapM (trees !?) xs
let vs = [x | CFTree (CFFun (AV x,_),[]) <- ts]
testErr (length ts == length vs) "non-variable in bound position"
case vs of
[x] -> return x
[] -> return $ Ident "h_" ---- uBoundVar
y:ys -> do
testErr (all (==y) ys) ("fail to unify bindings of " ++ prt y)
return y
term2trm :: ITerm -> Exp
term2trm IMeta = EAtom AM
term2trm (ITerm (fun, binds) terms) =
let bterms = zip binds terms
in mkAppAtom fun [mkAbsR xs (term2trm t) | (xs,t) <- bterms]
--- these are deprecated
where
mkAbsR c e = foldr EAbs e c
mkAppAtom a = mkApp (EAtom a)
mkApp = foldl EApp
-- !! with the error monad
(!?) :: [a] -> Int -> Err a
xs !? i = foldr (const . return) (Bad "too few elements in list") $ drop i xs
testErr :: Bool -> String -> Err ()
testErr cond msg = if cond then return () else Bad msg

View File

@@ -0,0 +1,21 @@
C compiler written in GF.
Usage:
./gfcc Foo.c
produces the Jasmin file Foo.j
Compile the compiler:
make
If you change the file ImperC.gf, you have to have BNFC 2.2, Happy,
and Alex, and use
make compiler
See FILES to find out what files and tools you need.
(AR 23/9/2004 -- 8/11)

View File

@@ -0,0 +1,78 @@
module Trees where
data Exp =
EApp Exp Exp
| EAbs Ident Exp
| EAtom Atom
deriving (Eq,Ord,Show)
newtype CFTree = CFTree (CFFun,[CFTree]) deriving (Eq, Show)
type CFCat = Ident
newtype Ident = Ident String deriving (Eq, Ord, Show)
-- to build trees: the Atom contains a GF function, Cn | Meta | Vr | Literal
newtype CFFun = CFFun (Atom, Profile) deriving (Eq,Ord,Show)
type Profile = [([[Int]],[Int])]
data Atom =
AC Ident
| AV Ident
| AM
| AS String
| AI Integer
deriving (Eq,Ord,Show)
-- printing
class Prt a where
prt :: a -> String
instance Prt Exp where
prt e = case e of
EApp f a -> unwords [prt f, prt1 a]
EAbs x a -> "\\" ++ prt x ++ " -> " ++ prt a
EAtom a -> prt a
where
prt1 e = case e of
EAtom _ -> prt e
_ -> "(" ++ prt e ++ ")"
instance Prt Atom where
prt a = case a of
AC x -> prt x
AV x -> prt x
AM -> "?"
AS s -> show s ----
AI i -> show i
instance Prt Ident where
prt (Ident x) = x
-- printing trees
prCFTree :: CFTree -> String
prCFTree (CFTree (fun, trees)) = prCFFun fun ++ prs trees where
prs [] = ""
prs ts = " " ++ unwords (map ps ts)
ps t@(CFTree (_,[])) = prCFTree t
ps t = "(" ++ prCFTree t ++ ")"
prCFFun :: CFFun -> String
prCFFun = prCFFun' True ---- False -- print profiles for debug
prCFFun' :: Bool -> CFFun -> String
prCFFun' profs (CFFun (t, p)) = prt t ++ pp p where
pp p = if (not profs || normal p) then "" else "_" ++ concat (map show p)
normal p = and [x==y && null b | ((b,x),y) <- zip p (map (:[]) [0..])]
prCFCat :: CFCat -> String
prCFCat c = prt c
mkFunTree :: String -> Profile -> [CFTree] -> CFTree
mkFunTree f p ts = CFTree (CFFun (AC (Ident f),p), ts)
mkAtTree :: Atom -> CFTree
mkAtTree a = CFTree (CFFun (a,[]), [])

View File

@@ -1,7 +1,7 @@
GF=gf
SRC=../
all: compiler
all: parser gfcm
compiler:
echo "pm | wf Imper.gfcm ;; pg -lang=ImperC -printer=plbnf | wf ImperC.tmp" | $(GF) $(SRC)ImperC.gf $(SRC)ImperJVM.gf
@@ -11,3 +11,9 @@ compiler:
make -f Makefile
rm *.tmp
jasmin runtime.j
parser:
ghc --make TestImperC.hs -o TestImperC
gfcm:
echo "pm | wf Imper.gfcm" | $(GF) $(SRC)ImperC.gf $(SRC)ImperJVM.gf