diff --git a/Interpreter.hs b/Interpreter.hs index 06709a9be2df7843c658db127f6c1fe9187266ee..d23a45bc0fb3441152edb9936cfa06d4e2e71f79 100644 --- a/Interpreter.hs +++ b/Interpreter.hs @@ -33,7 +33,13 @@ evalFinal :: Expr -> Expr -- whnf set to ready set evalFinal = evalFull [] showFinal :: Expr -> IO () -showFinal = notImplemented +showFinal = (print2DList.sort2DListLex.setTo2DList) + +setTo2DList :: Expr -> [[String]] +setTo2DList = notImplemented + +sort2DListLex = id -- TODO change this +print2DList = notImplemented -------------------------------------------- loadInputFile :: SymbolName -> IO Expr @@ -43,12 +49,13 @@ loadInputFile name = do return output where - toRecord stringList = Record $ map ((String).stripLeadingAndTrailingWhitespace) stringList + toRecord stringList = Record $ map ((String).stripWhitespace) stringList -stripLeadingAndTrailingWhitespace = stripTrailingWhitespace.dropWhile (==' ') +stripWhitespace = stripTrailingWhitespace.dropWhile (==' ') stripTrailingWhitespace (' ':xs) = let remainder = stripTrailingWhitespace xs in if null remainder then [] else ' ':remainder stripTrailingWhitespace (x:xs) = x : stripTrailingWhitespace xs stripTrailingWhitespace [] = [] + diff --git a/Lexer.x b/Lexer.x index cda82e05675af5491a715508deefed11895e7f57..000d86cd66118c0bb0c107ce3c6aa817bc3fef4e 100644 --- a/Lexer.x +++ b/Lexer.x @@ -5,32 +5,34 @@ module Lexer where %wrapper "basic" $digit = 0-9 $alpha = [a-zA-Z] +$lower = [a-z] +$upper = [A-Z] tokens :- - $white+ ; - "--".* ; - Filter {\s -> TokenFilter } - SetName {\s -> TokenSetName s } - Func {\s -> TokenFunc } - Nat {\s -> TokenNat (read s) } - VarName {\s -> TokenVarName s } - Record {\s -> TokenRecord } - true {\s -> TokenTrue } - false {\s -> TokenFalse } - String {\s -> TokenString s } - '[' {\s -> TokenLeftSqBracket } - ']' {\s -> TokenRightSqBracket } - "->" {\s -> TokenArrow } - "==" {\s -> TokenisEqual } - "/=" {\s -> TokenisNotEqual } - '(' {\s -> TokenLeftBracket } - ')' {\s -> TokenRightBracket } - ';' {\s -> TokenApp } - '\\' {\s -> TokenLambda } - ',' {\s -> TokenComma } - '.' {\s -> TokenFullstop } - in {\s -> TokenInSet } - out {\s -> TokenOutSet } + $white+ ; + "--".* ; + filter {\s -> TokenFilter } + $upper[$alpha]* {\s -> TokenSetName s } + Func {\s -> TokenFunc } + $digit+ {\s -> TokenNat (read s) } + $lower [$lower $digit \_ \']* {\s -> TokenVarName s } + Record {\s -> TokenRecord } + true {\s -> TokenTrue } + false {\s -> TokenFalse } + $[$alpha $digit]* {\s -> TokenString s } + '[' {\s -> TokenLeftSqBracket } + ']' {\s -> TokenRightSqBracket } + "->" {\s -> TokenArrow } + "==" {\s -> TokenisEqual } + "/=" {\s -> TokenisNotEqual } + '(' {\s -> TokenLeftBracket } + ')' {\s -> TokenRightBracket } + ';' {\s -> TokenApp } + '\\' {\s -> TokenLambda } + ',' {\s -> TokenComma } + '.' {\s -> TokenFullstop } + in {\s -> TokenInSet } + out {\s -> TokenOutSet } { --token type: data Token = diff --git a/Parser.y b/Parser.y index c6c3ce4a349f25fe075d46c898f327b890dc10db..e994c6b94d2171f02b3340ce54f8db0a071d359e 100644 --- a/Parser.y +++ b/Parser.y @@ -1,30 +1,74 @@ +{ +module Parser where +import Lexer +} +%name parseCalc +%tokentype {Token} +%error {parseError} -Prog : .in SetNames .out SetFuncCalls {($2, $4)} +%token + filter { TokenFilter } + in { TokenInSet } + out { TokenOutSet } + Setname { TokenSetName $$ } + function { TokenFunc } + nat { TokenNat $$ } + var { TokenVarName $$ } + Record { TokenRecord } + true { TokenTrue } + false { TokenFalse } + string { TokenString s } + '[' { TokenLeftSqBracket } + ']' { TokenRightSqBracket } + "->" { TokenArrow } + "==" { TokenisEqual } + "/=" { TokenisNotEqual } + '(' { TokenLeftBracket } + ')' { TokenRightBracket } + ';' { TokenSemiCo } + '\\' { TokenLambda } + ',' { TokenComma } + '.' { TokenFullstop } -SetNames : SetName {[$1]} - | SetNames, SetName - -VarNames : VarName - | VarName',' VarNames +%right "->" +%left "/=" "==" ';' +%% + + +Prog : '.' in SetNames '.' out SetFuncCall {($3,$6)} + +SetNames : Setname {[$1]} + | SetNames ',' setName { } + + +VarNames : var {Var $1} + | var ',' VarNames {Var $1 $3} SetSetFuncCalls : SetFuncCall {[SetFuncCall]} - | SetFuncCall; SetFuncCalls {SetFuncCall:SetFuncCalls} + | SetFuncCall; SetFuncCalls {SetFuncCall:SetFuncCalls} SetFuncCall : filter '['SetName']' '('Func')' {FuncCall (PredefFunc Filter) [$3] [$6]} ---filter[A](\r -> r[2] /= "") + Func : \'('VarNames')' -> Expr {FuncDef [] $3 $6} ---\(r) -> r[1] == "hello" +Exp : '.' in var '.' out Exp {Prog $3 $6} + | filter '[' Setname ']' Exp {Filter $3 $5} + | '(' '\\' + Expr : Expr == Expr {FuncCall (PredefFunc IsEqual) [] [$1, $3]} - | Expr'['Nat']' {FuncCall (PredefFunc RecordIndex) [] [$3]} - | String {String $1} - | VarName {Var $1} - | Record {$1} - | true {Boolean True} - | false {Boolean False} + | Expr'['Nat']' {FuncCall (PredefFunc RecordIndex) [] [$3]} + | String {String $1} + | VarName {Var $1} + | Record {$1} + | true {Boolean True} + | false {Boolean False} Record : '['Exprs']' {Record $2} Exprs : Expr {[$1]} - | Expr','Exprs {$1:$2} + | Expr','Exprs {$1:$2} + +{ + +} diff --git a/Print2DListLex.hs b/Print2DListLex.hs new file mode 100644 index 0000000000000000000000000000000000000000..1572773ae35d8d665dc7e80d53ce56a35a88b4e6 --- /dev/null +++ b/Print2DListLex.hs @@ -0,0 +1,13 @@ +import Data.List +import Data.Char +import Data.Sequence + +-- | Function print2DListLex +-- 1. takes in a list of records +-- 2. prints them in lexicographical order +print2DListLex :: [[String]] -> IO() +print2DListLex (record:records) = sortBy () records + +-- | rearran +rearrange :: [[String]] -> [[String]] +rearrange records \ No newline at end of file diff --git a/ReadCSV.hs b/ReadCSV.hs index 53231accd75e40cdad1b0ad94a0ca3b9b46485c4..ba3486a07ecca1db0d18ae5051d94ea7fceaaacd 100644 --- a/ReadCSV.hs +++ b/ReadCSV.hs @@ -9,7 +9,6 @@ readCSV fname = do readCSVString :: String -> [[String]] readCSVString whole = [splitElem ',' line | line <- splitElem '\n' whole] - splitElem :: Eq a => a -> [a] -> [[a]] splitElem elem = split (/=elem)