update, parser kan expressies op binaire operatoren na, beginnetje gemaakt voor prese...
authorMart Lubbers <mart@martlubbers.net>
Fri, 26 Feb 2016 19:37:24 +0000 (20:37 +0100)
committerMart Lubbers <mart@martlubbers.net>
Fri, 26 Feb 2016 19:37:24 +0000 (20:37 +0100)
19 files changed:
README.md [deleted file]
deliverables/.gitignore [new file with mode: 0644]
deliverables/p1/Makefile [new file with mode: 0644]
deliverables/p1/p1.pdf [new file with mode: 0644]
deliverables/p1/p1.tex [new file with mode: 0644]
deliverables/p1/pre.tex [new file with mode: 0644]
parse.dcl [deleted file]
parse.icl [deleted file]
src/.gitignore [moved from .gitignore with 100% similarity]
src/Makefile [moved from Makefile with 100% similarity]
src/example.spl [moved from example.spl with 100% similarity]
src/lex.dcl [moved from lex.dcl with 96% similarity]
src/lex.icl [moved from lex.icl with 59% similarity]
src/main.icl [moved from main.icl with 54% similarity]
src/main.prj [moved from main.prj with 90% similarity]
src/parse.dcl [new file with mode: 0644]
src/parse.icl [new file with mode: 0644]
src/yard.dcl [moved from yard.dcl with 85% similarity]
src/yard.icl [moved from yard.icl with 69% similarity]

diff --git a/README.md b/README.md
deleted file mode 100644 (file)
index b75222a..0000000
--- a/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# cc1516
-
-- Bouwen met `cpm make`
diff --git a/deliverables/.gitignore b/deliverables/.gitignore
new file mode 100644 (file)
index 0000000..1c934b1
--- /dev/null
@@ -0,0 +1,7 @@
+*.aux
+*.fmt
+*.log
+*.nav
+*.out
+*.snm
+*.toc
diff --git a/deliverables/p1/Makefile b/deliverables/p1/Makefile
new file mode 100644 (file)
index 0000000..dc5100d
--- /dev/null
@@ -0,0 +1,17 @@
+LATEX:=pdflatex
+DOCUMENT:=p1
+
+.PHONY: all clean
+.SECONDARY: $(DOCUMENT).fmt
+
+all: $(DOCUMENT).pdf
+
+%.pdf: %.tex %.fmt
+       $(LATEX) $(basename $@)
+       $(LATEX) $(basename $@)
+
+%.fmt: pre.tex
+       $(LATEX) -ini -jobname="$(basename $@)" "&$(LATEX) $<\dump"
+
+clean:
+       $(RM) -v $(addprefix $(DOCUMENT).,aux fmt log nav out snm toc)
diff --git a/deliverables/p1/p1.pdf b/deliverables/p1/p1.pdf
new file mode 100644 (file)
index 0000000..10b2596
Binary files /dev/null and b/deliverables/p1/p1.pdf differ
diff --git a/deliverables/p1/p1.tex b/deliverables/p1/p1.tex
new file mode 100644 (file)
index 0000000..7aff91d
--- /dev/null
@@ -0,0 +1,4 @@
+%&p1
+\begin{document}
+\frame{\titlepage}
+\end{document}
diff --git a/deliverables/p1/pre.tex b/deliverables/p1/pre.tex
new file mode 100644 (file)
index 0000000..06184f2
--- /dev/null
@@ -0,0 +1,19 @@
+\documentclass{beamer}
+
+\AtBeginSection[]{%
+       \begin{frame}
+               \frametitle{Table of Contents}
+               \tableofcontents[currentsection]
+       \end{frame}
+}
+
+\title[P1]{Lexical Analysis and Parsing}
+%\subtitle{}
+\author[P. Jager, M. Lubbers]{Pim Jager\inst{1}\and Mart Lubbers\inst{1}}
+\institute[Radboud University]{%
+       \inst{1}%
+       Computer Science: Software Science\\
+       Radboud University
+}
+\subject{Parser}
+\date{\today}
diff --git a/parse.dcl b/parse.dcl
deleted file mode 100644 (file)
index 785dfbc..0000000
--- a/parse.dcl
+++ /dev/null
@@ -1,10 +0,0 @@
-definition module parse
-
-from Data.Either import :: Either
-
-from lex import :: LexerOutput, :: Token, :: TokenValue
-
-:: ParserOutput :== Either String AST
-:: AST = If | While //stub
-
-parse :: LexerOutput -> ParserOutput
diff --git a/parse.icl b/parse.icl
deleted file mode 100644 (file)
index 5551f20..0000000
--- a/parse.icl
+++ /dev/null
@@ -1,11 +0,0 @@
-implementation module parse
-
-import StdString
-import Data.Either
-
-import yard
-import lex
-
-parse :: LexerOutput -> ParserOutput
-parse (Left e) = Left ("Lexer error: " +++ e)
-parse (Right r) = Left "Parser not yet implemented"
similarity index 100%
rename from .gitignore
rename to src/.gitignore
similarity index 100%
rename from Makefile
rename to src/Makefile
similarity index 100%
rename from example.spl
rename to src/example.spl
similarity index 96%
rename from lex.dcl
rename to src/lex.dcl
index a887374..0b064b4 100644 (file)
--- a/lex.dcl
@@ -29,6 +29,7 @@ from Data.Either import :: Either
        | AmpersandsToken   // &&
        | PipesToken        // ||
     | ArrowToken        // ->
        | AmpersandsToken   // &&
        | PipesToken        // ||
     | ArrowToken        // ->
+       | EmptyListToken        // []
        //One character tokens
        | BraceOpenToken    // (
        | BraceCloseToken   // )
        //One character tokens
        | BraceOpenToken    // (
        | BraceCloseToken   // )
@@ -54,4 +55,6 @@ from Data.Either import :: Either
 
 :: LexerOutput :== Either String [Token]
 
 
 :: LexerOutput :== Either String [Token]
 
+(===) :: TokenValue Token -> Bool
+
 lexer :: [Char] -> LexerOutput
 lexer :: [Char] -> LexerOutput
similarity index 59%
rename from lex.icl
rename to src/lex.icl
index de200df..b6e56d5 100644 (file)
--- a/lex.icl
@@ -59,6 +59,7 @@ lex ['>':'=':xs] = ret GreaterEqToken xs
 lex ['=':'=':xs] = ret EqualsToken xs
 lex ['&':'&':xs] = ret AmpersandsToken xs
 lex ['|':'|':xs] = ret PipesToken xs
 lex ['=':'=':xs] = ret EqualsToken xs
 lex ['&':'&':xs] = ret AmpersandsToken xs
 lex ['|':'|':xs] = ret PipesToken xs
+lex ['[':']':xs] = ret EmptyListToken xs
 lex ['-':'>':xs] = ret ArrowToken xs
 lex ['\'':x:'\'':xs] = ret (CharToken x) xs
 lex ['\'':'\\':x:'\'':xs] = case get x EscapeMap of
 lex ['-':'>':xs] = ret ArrowToken xs
 lex ['\'':x:'\'':xs] = ret (CharToken x) xs
 lex ['\'':'\\':x:'\'':xs] = case get x EscapeMap of
@@ -67,7 +68,7 @@ lex ['\'':'\\':x:'\'':xs] = case get x EscapeMap of
 lex ['-':t=:[x:xs]]
 | isDigit x = let (n, r) = span isDigit t in
        ret (NumberToken (toInt $ toString ['-':n])) r
 lex ['-':t=:[x:xs]]
 | isDigit x = let (n, r) = span isDigit t in
        ret (NumberToken (toInt $ toString ['-':n])) r
-| otherwise = ret DashToken  xs
+| otherwise = ret DashToken 
 lex t=:[x:xs] = case get x SingleCharTokens of
        (Just tok) = ret tok xs
        Nothing
 lex t=:[x:xs] = case get x SingleCharTokens of
        (Just tok) = ret tok xs
        Nothing
@@ -78,3 +79,49 @@ lex t=:[x:xs] = case get x SingleCharTokens of
        | isAlpha x = let (v, r) = span isIdent t in ret (IdentToken v) r
                with isIdent c = isAlphanum c || c == '_'
        | otherwise = err ("Unexpected character: " +++ toString x)
        | isAlpha x = let (v, r) = span isIdent t in ret (IdentToken v) r
                with isIdent c = isAlphanum c || c == '_'
        | otherwise = err ("Unexpected character: " +++ toString x)
+
+
+(===) :: TokenValue Token -> Bool
+(===) (IdentToken _) (_, IdentToken _) = True
+(===) (NumberToken _) (_, NumberToken _) = True
+(===) (CharToken _) (_, CharToken _) = True
+(===) (VarToken) (_, VarToken) = True
+(===) (ReturnToken) (_, ReturnToken) = True
+(===) (IfToken) (_, IfToken) = True
+(===) (ElseToken) (_, ElseToken) = True
+(===) (WhileToken) (_, WhileToken) = True
+(===) (TrueToken) (_, TrueToken) = True
+(===) (FalseToken) (_, FalseToken) = True
+(===) (VoidToken) (_, VoidToken) = True
+(===) (IntTypeToken) (_, IntTypeToken) = True
+(===) (CharTypeToken) (_, CharTypeToken) = True
+(===) (BoolTypeToken) (_, BoolTypeToken) = True
+(===) (DoubleColonToken) (_, DoubleColonToken) = True
+(===) (NotEqualToken) (_, NotEqualToken) = True
+(===) (LesserEqToken) (_, LesserEqToken) = True
+(===) (GreaterEqToken) (_, GreaterEqToken) = True
+(===) (EqualsToken) (_, EqualsToken) = True
+(===) (AmpersandsToken) (_, AmpersandsToken) = True
+(===) (PipesToken) (_, PipesToken) = True
+(===) (ArrowToken) (_, ArrowToken) = True
+(===) (EmptyListToken) (_, EmptyListToken) = True
+(===) (BraceOpenToken) (_, BraceOpenToken) = True
+(===) (BraceCloseToken) (_, BraceCloseToken) = True
+(===) (CBraceOpenToken) (_, CBraceOpenToken) = True
+(===) (CBraceCloseToken) (_, CBraceCloseToken) = True
+(===) (SquareOpenToken) (_, SquareOpenToken) = True
+(===) (SquareCloseToken) (_, SquareCloseToken) = True
+(===) (CommaToken) (_, CommaToken) = True
+(===) (ColonToken) (_, ColonToken) = True
+(===) (SColonToken) (_, SColonToken) = True
+(===) (DotToken) (_, DotToken) = True
+(===) (PlusToken) (_, PlusToken) = True
+(===) (DashToken) (_, DashToken) = True
+(===) (StarToken) (_, StarToken) = True
+(===) (SlashToken) (_, SlashToken) = True
+(===) (PercentToken) (_, PercentToken) = True
+(===) (AssignmentToken) (_, AssignmentToken) = True
+(===) (LesserToken) (_, LesserToken) = True
+(===) (BiggerToken) (_, BiggerToken) = True
+(===) (ExclamationToken) (_, ExclamationToken) = True
+(===) _ _ = False
similarity index 54%
rename from main.icl
rename to src/main.icl
index ef5566a..9bc8d20 100644 (file)
--- a/main.icl
@@ -6,21 +6,12 @@ import StdBool
 import parse
 import lex
 
 import parse
 import lex
 
-//Start :: *World -> (ParserOutput, *World)
-Start = ""
-//Start w
-//# (out, w) = stdio w
-//# (toparse, out) = readEntireFile out
-//# (_, w) = fclose out w
-//= (lexer toparse, w)
-/*
-Start :: *World -> (ParserOutput, *World)
+Start :: *World -> (LexerOutput, ParserOutput, *World)
 Start w
 # (out, w) = stdio w
 # (toparse, out) = readEntireFile out
 # (_, w) = fclose out w
 Start w
 # (out, w) = stdio w
 # (toparse, out) = readEntireFile out
 # (_, w) = fclose out w
-= (parse (lexer toparse), w)
-*/
+= (lexer toparse, parse (lexer toparse), w)
 
 readEntireFile :: *File -> *([Char], *File)
 readEntireFile f
 
 readEntireFile :: *File -> *([Char], *File)
 readEntireFile f
similarity index 90%
rename from main.prj
rename to src/main.prj
index 1880ded..870e822 100644 (file)
--- a/main.prj
@@ -31,7 +31,6 @@ Global
        Link
                LinkMethod:     Static
                GenerateRelocations:    False
        Link
                LinkMethod:     Static
                GenerateRelocations:    False
-               GenerateSymbolTable:    False
                GenerateLinkMap:        False
                LinkResources:  False
                ResourceSource: 
                GenerateLinkMap:        False
                LinkResources:  False
                ResourceSource: 
@@ -422,7 +421,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Control.Applicative
                        Fusion: False
        Module
                Name:   Control.Applicative
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -436,7 +435,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Control.Monad
                        Fusion: False
        Module
                Name:   Control.Monad
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -450,7 +449,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Either
                        Fusion: False
        Module
                Name:   Data.Either
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -464,7 +463,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Foldable
                        Fusion: False
        Module
                Name:   Data.Foldable
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -478,7 +477,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Func
                        Fusion: False
        Module
                Name:   Data.Func
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -492,7 +491,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Functor
                        Fusion: False
        Module
                Name:   Data.Functor
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -506,7 +505,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.List
                        Fusion: False
        Module
                Name:   Data.List
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -520,7 +519,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Map
                        Fusion: False
        Module
                Name:   Data.Map
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -534,7 +533,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Maybe
                        Fusion: False
        Module
                Name:   Data.Maybe
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -548,7 +547,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Monoid
                        Fusion: False
        Module
                Name:   Data.Monoid
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -562,7 +561,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Set
                        Fusion: False
        Module
                Name:   Data.Set
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -576,7 +575,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Traversable
                        Fusion: False
        Module
                Name:   Data.Traversable
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -590,7 +589,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Data.Void
                        Fusion: False
        Module
                Name:   Data.Void
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -604,7 +603,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   System.IO
                        Fusion: False
        Module
                Name:   System.IO
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -618,7 +617,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Text
                        Fusion: False
        Module
                Name:   Text
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -632,7 +631,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Text.JSON
                        Fusion: False
        Module
                Name:   Text.JSON
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
@@ -646,7 +645,7 @@ OtherModules
                        Fusion: False
        Module
                Name:   Text.PPrint
                        Fusion: False
        Module
                Name:   Text.PPrint
-               Dir:    {Application}/lib/iTasks-SDK/Dependencies/clean-platform/src/libraries/OS-Independent
+               Dir:    {Application}/lib/iTasks-SDK/Dependencies/Platform/OS-Independent
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
                Compiler
                        NeverMemoryProfile:     False
                        NeverTimeProfile:       False
diff --git a/src/parse.dcl b/src/parse.dcl
new file mode 100644 (file)
index 0000000..3f42eda
--- /dev/null
@@ -0,0 +1,40 @@
+definition module parse
+
+from Data.Either import :: Either
+from Data.Maybe import :: Maybe
+
+import lex
+
+:: ParserOutput :== Either String AST
+
+:: AST = AST [VarDecl] [FunDecl]
+:: VarDecl = VarDecl String Type Expr
+:: Type 
+       = TupleType Type Type
+       | ListType Type
+       | IdType String
+       | IntType 
+       | BoolType
+       | CharType
+       | VarType
+
+:: Expr 
+       = VarExpr String (Maybe FieldSelector)
+       | Op2Expr Expr Op2 Expr //TODO, iets met associativiteit wat niet weet hoe
+       | Op1Expr Op1 Expr
+       | IntExpr Int
+       | CharExpr Char
+       | BoolExpr Bool
+       | EmptyListExpr
+       | TupleExpr Expr Expr
+
+:: FieldSelector = FieldHd | FieldTl | FieldFst | FieldSnd
+:: Op1 = UnNegation | UnMinus
+:: Op2 = BiPlus | BiMinus | BiTimes | BiDivide | BiMod | BiEquals | BiLesser |
+       BiGreater | BiLesserEq | BiGreaterEq | BiUnEqual | BiAnd | BiOr | BiCons
+
+//TODO
+
+:: FunDecl = Stub
+
+parse :: LexerOutput -> ParserOutput
diff --git a/src/parse.icl b/src/parse.icl
new file mode 100644 (file)
index 0000000..fdcb9e3
--- /dev/null
@@ -0,0 +1,88 @@
+implementation module parse
+
+import StdString
+import StdTuple
+import StdList
+from StdFunc import const
+import Data.Either
+import Control.Monad
+import Control.Applicative
+import Data.Func
+
+import yard
+import lex
+
+parse :: LexerOutput -> ParserOutput
+parse (Left e) = Left $ toString $ LexError e
+parse (Right r) = case runParser parseProgram r of
+       (Right p, _) = Right p
+       (Left e, _) = Left $ toString e
+
+parseProgram :: Parser Token AST
+parseProgram = parseVar >>= \t.pure $ AST [t] []
+
+parseVar :: Parser Token VarDecl
+parseVar = parseType 
+       >>= \t->parseIdent <* satTok AssignmentToken
+       >>= \i->parseExpr <* satTok SColonToken
+       >>= \e->pure $ VarDecl i t e
+
+parseType :: Parser Token Type
+parseType = 
+       trans1 IntTypeToken IntType <|>
+       trans1 VarToken VarType <|>
+       trans1 CharTypeToken CharType <|>
+       trans1 BoolTypeToken BoolType <|>
+       (satTok SquareOpenToken *> parseType <* satTok SquareCloseToken 
+               >>= \t.pure $ ListType t) <|>
+       (satTok BraceOpenToken *> parseType <* satTok CommaToken 
+               >>= \t1->parseType <* satTok BraceCloseToken 
+               >>= \t2->pure $ TupleType t1 t2) <|>
+       (parseIdent >>= \e.pure $ IdType e) <|>
+       empty
+
+parseExpr :: Parser Token Expr
+parseExpr = 
+       (satTok BraceOpenToken *> parseExpr <* satTok BraceCloseToken) <|>
+       (satTok BraceOpenToken *> parseExpr <* satTok CommaToken 
+               >>= \e1->parseExpr <* satTok BraceCloseToken 
+               >>= \e2->pure $ TupleExpr e1 e2) <|>
+       trans1 EmptyListToken EmptyListExpr <|>
+       trans2 TrueToken (const $ BoolExpr True) <|>
+       trans2 FalseToken (const $ BoolExpr True) <|>
+       trans2 (NumberToken zero) (\(NumberToken i)->IntExpr i) <|>
+       trans2 (CharToken zero) (\(CharToken c)->CharExpr c) <|>
+       (parseOp1 >>= \o->parseExpr >>= \e.pure $ Op1Expr o e) <|>
+       (parseIdent >>= \i. parseFieldSelector >>= \f.pure $ VarExpr i f)
+
+parseOp1 :: Parser Token Op1
+parseOp1 = trans1 DashToken UnMinus <|> 
+       trans1 ExclamationToken UnNegation
+
+parseOp2 :: Parser Token Op2
+parseOp2 = trans1 StarToken BiTimes <|> trans1 SlashToken BiDivide <|>
+       trans1 PercentToken BiMod <|> trans1 EqualsToken BiEquals <|>
+       trans1 LesserToken BiLesser <|> trans1 BiggerToken BiGreater <|>
+       trans1 LesserEqToken BiLesserEq <|> trans1 PlusToken BiPlus <|>
+       trans1 GreaterEqToken BiGreaterEq <|> trans1 DashToken BiMinus <|>
+       trans1 NotEqualToken BiUnEqual <|> trans1 AmpersandsToken BiAnd <|>
+       trans1 PipesToken BiOr <|> trans1 ColonToken BiCons
+
+parseFieldSelector :: Parser Token (Maybe FieldSelector)
+parseFieldSelector = optional (satTok DotToken *> (
+       (parseIdent >>= (\i.if (i == "hd") (pure FieldHd) empty)) <|>
+       (parseIdent >>= \i.if (i == "tl") (pure FieldTl) empty) <|>
+       (parseIdent >>= \i.if (i == "fst") (pure FieldFst) empty) <|>
+       (parseIdent >>= \i.if (i == "snd") (pure FieldSnd) empty)))
+
+trans2 :: TokenValue (TokenValue -> a) -> Parser Token a
+trans2 t f = satTok t >>= \(_, r).pure (f r)
+
+trans1 :: TokenValue a -> Parser Token a
+trans1 t r = trans2 t $ const r
+
+satTok :: TokenValue -> Parser Token Token
+satTok t = satisfy ((===) t)
+
+parseIdent :: Parser Token String
+parseIdent = trans2 (IdentToken []) (\(IdentToken e).toString e)
similarity index 85%
rename from yard.dcl
rename to src/yard.dcl
index a1bb2a3..76b6c17 100644 (file)
--- a/yard.dcl
@@ -1,21 +1,23 @@
 definition module yard
 
 definition module yard
 
+from StdString import class toString
 from Data.Either import :: Either
 from StdClass import class Eq
 from Data.Functor import class Functor
 from Control.Monad import class Monad
 from Control.Applicative import class Applicative, class Alternative
 
 from Data.Either import :: Either
 from StdClass import class Eq
 from Data.Functor import class Functor
 from Control.Monad import class Monad
 from Control.Applicative import class Applicative, class Alternative
 
-:: Error = ParseException
+:: Error = ParseError | LexError String
 :: Parser a b = Parser ([a] -> (Either Error b, [a]))
 
 :: Parser a b = Parser ([a] -> (Either Error b, [a]))
 
-runParser :: (Parser a b) [a] -> (Either Error b, [a])
-
 instance Functor (Parser a)
 instance Applicative (Parser a) 
 instance Monad (Parser a)
 instance Alternative (Parser a)
 
 instance Functor (Parser a)
 instance Applicative (Parser a) 
 instance Monad (Parser a)
 instance Alternative (Parser a)
 
+instance toString Error
+
+runParser :: (Parser a b) [a] -> (Either Error b, [a])
 fail :: Parser a b
 top :: Parser a a
 satisfy :: (a -> Bool) -> Parser a a
 fail :: Parser a b
 top :: Parser a a
 satisfy :: (a -> Bool) -> Parser a a
similarity index 69%
rename from yard.icl
rename to src/yard.icl
index 1443325..2f3c90a 100644 (file)
--- a/yard.icl
@@ -2,36 +2,34 @@ implementation module yard
 
 import StdTuple
 import StdClass
 
 import StdTuple
 import StdClass
+import StdString
 import Data.Functor
 import Data.Either
 import Control.Monad
 import Control.Applicative
 from Data.Func import $
 
 import Data.Functor
 import Data.Either
 import Control.Monad
 import Control.Applicative
 from Data.Func import $
 
+instance toString Error where
+       toString ParseError = "General parse error"
+       toString (LexError e) = "Lexer error: " +++ e
+
 runParser :: (Parser a b) [a] -> (Either Error b, [a])
 runParser (Parser f) i = f i
 
 instance Functor (Parser a) where
 runParser :: (Parser a b) [a] -> (Either Error b, [a])
 runParser (Parser f) i = f i
 
 instance Functor (Parser a) where
-    //fmap f m = liftM f m
-    fmap g p = Parser \i -> case runParser p i of
-        (Right r, rest) = (Right $ g r, rest)
-        (Left e, rest)  = (Left e, rest)
+    fmap f m = liftM f m
 
 instance Applicative (Parser a) where
     pure a      = Parser \i -> (Right a, i)
 
 instance Applicative (Parser a) where
     pure a      = Parser \i -> (Right a, i)
-    //(<*>) sf p  = ap sf p
-    (<*>) pf p  = Parser \i -> case runParser pf i of
-        (Right f, rest) = runParser (fmap f p) rest
-        (Left e, rest)   = (Left e, rest)
+    (<*>) sf p  = ap sf p
 
 instance Monad (Parser a) where
     bind p f    = Parser \i -> case runParser p i of
         (Right r, rest) = runParser (f r) rest
         (Left e, rest)  = (Left e, rest)
 
 
 instance Monad (Parser a) where
     bind p f    = Parser \i -> case runParser p i of
         (Right r, rest) = runParser (f r) rest
         (Left e, rest)  = (Left e, rest)
 
-//some, many, optional and l
 instance Alternative (Parser a) where
 instance Alternative (Parser a) where
-    empty       = Parser \i -> (Left ParseException, i)
+    empty       = Parser \i -> (Left ParseError, i)
     (<|>) p1 p2 = Parser \i -> case runParser p1 i of
         (Right r, rest) = (Right r, rest)
         (Left _, rest)  = runParser p2 i
     (<|>) p1 p2 = Parser \i -> case runParser p1 i of
         (Right r, rest) = (Right r, rest)
         (Left _, rest)  = runParser p2 i
@@ -41,7 +39,7 @@ fail = empty
 
 top :: Parser a a
 top = Parser \i -> case i of
 
 top :: Parser a a
 top = Parser \i -> case i of
-    []      = (Left ParseException, [])
+    []      = (Left ParseError, [])
     [x:xs]  = (Right x, xs)
 
 satisfy :: (a -> Bool) -> Parser a a
     [x:xs]  = (Right x, xs)
 
 satisfy :: (a -> Bool) -> Parser a a