Skip to content

Commit 9e9537e

Browse files
committed
Feat(Parser): lambdas with parameter list
1 parent da20903 commit 9e9537e

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

syntax/Lexer.x

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ tokens :-
1414
$white+ ;
1515
"--".* ;
1616
"->" { \pos _ -> TokenArrow pos }
17-
"<|" { \pos _ -> TokenApply pos }
1817
"!=" { \pos _ -> TokenNotEqual pos }
1918
"=" { \pos _ -> TokenEqual pos }
2019
"<" { \pos _ -> TokenLessThan pos }
@@ -40,7 +39,6 @@ tokens :-
4039
{
4140
data Token
4241
= TokenArrow AlexPosn
43-
| TokenApply AlexPosn
4442
| TokenNotEqual AlexPosn
4543
| TokenEqual AlexPosn
4644
| TokenLessThan AlexPosn
@@ -68,7 +66,6 @@ lex = alexScanTokens
6866

6967
tokenPosn :: Token -> String
7068
tokenPosn (TokenArrow pos ) = showPosn pos
71-
tokenPosn (TokenApply pos ) = showPosn pos
7269
tokenPosn (TokenNotEqual pos ) = showPosn pos
7370
tokenPosn (TokenEqual pos ) = showPosn pos
7471
tokenPosn (TokenLessThan pos ) = showPosn pos

syntax/Parser.y

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ import Lexer
2727
'*' { TokenMultiply pos }
2828
'/' { TokenDivide pos }
2929

30-
'<|' { TokenApply pos }
31-
3230
'->' { TokenArrow pos }
3331

3432
':=' { TokenAssign pos }
@@ -44,38 +42,42 @@ import Lexer
4442
%left '++'
4543
%left '+' '-'
4644
%left '*' '/'
47-
%left '<|'
4845

4946
%%
5047

5148
Expr :: { Coma }
52-
Expr : Expr '=' Expr1 { Equal $1 $3 }
53-
| Expr '!=' Expr1 { NotEqual $1 $3 }
54-
| Expr '<' Expr1 { Less $1 $3 }
55-
| Expr '<=' Expr1 { LessEqual $1 $3 }
56-
| Expr '>' Expr1 { Greater $1 $3 }
57-
| Expr '>=' Expr1 { GreaterEqual $1 $3 }
58-
| Expr '++' Expr1 { Append $1 $3 }
59-
| Expr '+' Expr1 { Add $1 $3 }
60-
| Expr '-' Expr1 { Subtract $1 $3 }
61-
| Expr '*' Expr1 { Multiply $1 $3 }
62-
| Expr '/' Expr1 { Divide $1 $3 }
63-
| Expr1 { $1 }
49+
Expr : Expr '=' Expr1 { Equal $1 $3 }
50+
| Expr '!=' Expr1 { NotEqual $1 $3 }
51+
| Expr '<' Expr1 { Less $1 $3 }
52+
| Expr '<=' Expr1 { LessEqual $1 $3 }
53+
| Expr '>' Expr1 { Greater $1 $3 }
54+
| Expr '>=' Expr1 { GreaterEqual $1 $3 }
55+
| Expr '++' Expr1 { Append $1 $3 }
56+
| Expr '+' Expr1 { Add $1 $3 }
57+
| Expr '-' Expr1 { Subtract $1 $3 }
58+
| Expr '*' Expr1 { Multiply $1 $3 }
59+
| Expr '/' Expr1 { Divide $1 $3 }
60+
| Expr1 { $1 }
6461

6562
Expr1 :: { Coma }
66-
Expr1 : Expr1 Literal { Call $1 $2 }
67-
| Literal { $1 }
63+
Expr1 : Expr1 Literal { Call $1 $2 }
64+
| Literal { $1 }
6865

6966
Literal :: { Coma }
70-
Literal : integer { IntAtom $1 }
71-
| string { StrAtom $1}
72-
| ident { Ident $1 }
73-
| '(' Expr ')' { $2 }
74-
| '[' List ']' { List $2 }
67+
Literal : integer { IntAtom $1 }
68+
| string { StrAtom $1}
69+
| ident { Ident $1 }
70+
| '(' Expr ')' { $2 }
71+
| '[' List ']' { List $2 }
72+
| '(' Params '->' Expr ')' { Lambda (reverse $2) $4 }
7573

7674
List :: { [Coma] }
77-
List : {- empty -} { [] }
78-
| Literal List { $1 : $2 }
75+
List : {- empty -} { [] }
76+
| Literal List { $1 : $2 }
77+
78+
Params :: { [String] }
79+
Params : ident { [$1] }
80+
| Params '->' ident { $3 : $1 }
7981

8082
{
8183
parseError :: [Token] -> a
@@ -89,6 +91,7 @@ data Coma
8991
| StrAtom String
9092
| Ident String
9193
| List [Coma]
94+
| Lambda [String] Coma
9295
| Equal Coma Coma
9396
| NotEqual Coma Coma
9497
| Less Coma Coma

0 commit comments

Comments
 (0)