Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
I
ICFP contest 2024
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Nathaniel Mattsson
ICFP contest 2024
Commits
95e4cd3c
Commit
95e4cd3c
authored
8 months ago
by
Hugo Hörnquist
Browse files
Options
Downloads
Patches
Plain Diff
Add parser.
parent
1c58af77
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
.gitignore
+1
-0
1 addition, 0 deletions
.gitignore
main.hs
+132
-0
132 additions, 0 deletions
main.hs
with
133 additions
and
0 deletions
.gitignore
0 → 100644
+
1
−
0
View file @
95e4cd3c
main
This diff is collapsed.
Click to expand it.
main.hs
0 → 100644
+
132
−
0
View file @
95e4cd3c
import
Text.ParserCombinators.Parsec
import
Text.Parsec
import
Data.Char
(
ord
,
chr
)
data
Expression
=
Negate
Expression
|
Not
Expression
|
StringToInt
Expression
|
IntToString
Expression
|
Add
Expression
Expression
|
Sub
Expression
Expression
|
Mul
Expression
Expression
|
Div
Expression
Expression
|
Mod
Expression
Expression
|
Gt
Expression
Expression
|
Lt
Expression
Expression
|
Eq
Expression
Expression
|
Or
Expression
Expression
|
And
Expression
Expression
|
Concat
Expression
Expression
|
Take
Expression
Expression
|
Drop
Expression
Expression
|
Apply
Expression
Expression
|
If
Expression
Expression
Expression
|
Lambda
Integer
Expression
|
Variable
Integer
|
Boolean
Bool
|
Number
Integer
|
Str
String
deriving
(
Show
)
parseBool
::
GenParser
Char
()
Expression
parseBool
=
(
char
'T'
>>
(
return
$
Boolean
True
))
<|>
(
char
'F'
>>
(
return
$
Boolean
False
))
decodeInteger
::
String
->
Integer
decodeInteger
str
=
foldl
((
+
)
.
(
*
94
))
0
[
toInteger
$
ord
c
-
33
|
c
<-
str
]
parseInteger
::
GenParser
Char
()
Expression
parseInteger
=
do
char
'I'
Number
.
decodeInteger
<$>
many
(
oneOf
[
chr
33
..
chr
126
])
alphabet
=
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!
\"
#$%&'()*+,-./:;<=>?@[
\\
]^_`|~
\n
"
decodeString
::
String
->
String
decodeString
msg
=
[
alphabet
!!
(
ord
c
-
33
)
|
c
<-
msg
]
parseString
::
GenParser
Char
()
Expression
parseString
=
do
char
'S'
s
<-
many
(
oneOf
[
chr
33
..
chr
126
])
return
.
Str
$
decodeString
s
parseUnary
::
GenParser
Char
()
Expression
parseUnary
=
do
char
'U'
c
<-
oneOf
"-!#$"
operand
<-
ws
>>
parseExpression
case
c
of
'-'
->
return
$
Negate
operand
'!'
->
return
$
Not
operand
'#'
->
return
$
StringToInt
operand
'$'
->
return
$
IntToString
operand
parseBinary
::
GenParser
Char
()
Expression
parseBinary
=
do
char
'B'
operation
<-
oneOf
"+-*/%<>=|&.TD$"
op1
<-
ws
>>
parseExpression
op2
<-
ws
>>
parseExpression
case
operation
of
'+'
->
return
$
Add
op1
op2
'-'
->
return
$
Sub
op1
op2
'*'
->
return
$
Mul
op1
op2
'/'
->
return
$
Div
op1
op2
'%'
->
return
$
Mod
op1
op2
'<'
->
return
$
Lt
op1
op2
'>'
->
return
$
Gt
op1
op2
'='
->
return
$
Eq
op1
op2
'|'
->
return
$
Or
op1
op2
'&'
->
return
$
And
op1
op2
'.'
->
return
$
Concat
op1
op2
'T'
->
return
$
Take
op1
op2
'D'
->
return
$
Drop
op1
op2
'$'
->
return
$
Apply
op1
op2
parseIf
::
GenParser
Char
()
Expression
parseIf
=
do
char
'?'
op
<-
ws
>>
parseExpression
e1
<-
ws
>>
parseExpression
e2
<-
ws
>>
parseExpression
return
$
If
op
e1
e2
parseLambda
::
GenParser
Char
()
Expression
parseLambda
=
do
char
'L'
arg
<-
decodeInteger
<$>
many
(
oneOf
[
chr
33
..
chr
126
])
expr
<-
ws
>>
parseExpression
return
$
Lambda
arg
expr
parseVariable
::
GenParser
Char
()
Expression
parseVariable
=
do
char
'v'
arg
<-
decodeInteger
<$>
many
(
oneOf
[
chr
33
..
chr
126
])
return
$
Variable
arg
ws
=
many
space
parseExpression
=
parseBool
<|>
parseInteger
<|>
parseString
<|>
parseUnary
<|>
parseBinary
<|>
parseIf
<|>
parseLambda
<|>
parseVariable
<?>
"Expression"
parseExpression'
=
do
res
<-
parseExpression
ws
return
res
main
=
do
msg
<-
getContents
let
result
=
parse
(
many
parseExpression'
)
""
msg
-- let result = parse (many $ ws >> parseExpression) "" msg
print
result
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment