41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
-- | This module defines the syntax of the Karel language.
 | 
						|
module KarelSyntax where
 | 
						|
 | 
						|
 | 
						|
-- | A Karel program is a list of macro definitions and a statement to
 | 
						|
--   use as the body of the "main" function.
 | 
						|
type Prog = (Defs,Stmt)
 | 
						|
 | 
						|
-- | A macro name.
 | 
						|
type Macro = String
 | 
						|
 | 
						|
-- | A list of macro definitions.
 | 
						|
type Defs = [(Macro,Stmt)]
 | 
						|
 | 
						|
-- | Cardinal directions.
 | 
						|
data Card = North | South | East  | West  deriving (Eq,Show)
 | 
						|
 | 
						|
-- | Directions relative to the current facing.
 | 
						|
data Dir  = Front | Back  | Right | Left  deriving (Eq,Show)
 | 
						|
 | 
						|
-- | Environment queries.
 | 
						|
data Test = Not    Test   -- boolean negation
 | 
						|
          | Facing Card   -- am I facing the given cardinal direction?
 | 
						|
          | Clear  Dir    -- can I move in the given relative direction?
 | 
						|
          | Beeper        -- is there a beeper here?
 | 
						|
          | Empty         -- is my beeper bag empty?
 | 
						|
  deriving (Eq,Show)
 | 
						|
 | 
						|
-- | Statements.
 | 
						|
data Stmt = Shutdown                 -- end the program
 | 
						|
          | Move                     -- move forward
 | 
						|
          | PickBeeper               -- take a beeper
 | 
						|
          | PutBeeper                -- leave a beeper
 | 
						|
          | Turn    Dir              -- rotate in place
 | 
						|
          | Call    Macro            -- invoke a macro
 | 
						|
          | Iterate Int  Stmt        -- fixed repetition loop
 | 
						|
          | If      Test Stmt Stmt   -- conditional branch
 | 
						|
          | While   Test Stmt        -- conditional loop
 | 
						|
          | Block   [Stmt]           -- statement block
 | 
						|
  deriving (Eq,Show)
 |