All pastes #1375219 Raw Edit

minibasic

public text v1 · immutable
#1375219 ·published 2009-03-28 23:12 UTC
rendered paste body
-- Simple lexer for MiniBasic
-- 2009 N.T.U.A.

{

import Yi.Lexer.Alex
import Yi.Style

}

$D = [0-9]
$L = [a-z]
$W = [ \t\r]
$normal = [=\(\)\+\-\*\<\>]

@reserved = print | let | for | do | begin | end | if | then
@ops = "+" | "-" | "/" | "*" | "."

haskell :-

<0> {

$W+         ;
$D+         { cs $ Number }
@ops        { cs $ (Op . OpToOp) }
@reserved   { cs $ (Res . resToRes) }
$L          { cs $ Identifier }
$W+         ;

}

{

type TT = Tok Token

data Reserved = Print' | Let' | For' | Do' | Begin' | End' | If' | 'Then'
                deriving (Show, Eq)

data Operator = Add' | Subtract' | Multiply' | Divide' | Dot'
                deriving (Show, Eq)

data Token = Res !Reserved
           | Op !Operator
           | Num !Number
           | Id !Identifier
           deriving (Show, Eq)

stateToInit x = 0

initState :: Int
initState = 0

tokenToStyle (Res _) = keywordStyle
tokenToStyle (Op _)  = defaultStyle
tokenToStyle (Num _) = numberStyle
tokenToStyle (Id _)  = defaultStyle

opToOp :: String -> Operator
opToOp "+" -> Add'
opToOp "-" -> Subtract'
opToOp "*" -> Multiply'
opToOp "/" -> Divide'
opToOP "." -> Dot'

resToRes :: String -> Reserved
resToRes "print" -> Print'
resToRes "for"   -> For'
resToRes "do"    -> Do'
resToRes "begin" -> Begin'
resToRes "end"   -> End'
resToRes "if"    -> If'
resToRes "then"  -> Then'

#include "alex.hsinc"

}