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)