mirror of
https://github.com/macocianradu/RosettaHaskellCompiler.git
synced 2026-03-18 13:00:08 +00:00
70 lines
1.8 KiB
Haskell
70 lines
1.8 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Parser.Function where
|
|
|
|
import Parser.Expression
|
|
import Parser.Type
|
|
import Model.Function
|
|
import Model.Type
|
|
import Text.Megaparsec
|
|
import Text.Megaparsec.Char
|
|
import Parser.General
|
|
|
|
functionParser :: Parser Function
|
|
functionParser =
|
|
do
|
|
_ <- string "func"
|
|
_ <- spaceConsumer
|
|
fName <- pascalNameParser
|
|
_ <- char ':'
|
|
_ <- spaceConsumer
|
|
fDescription <- descriptionParser
|
|
fInput <- inputAttributesParser
|
|
fOutput <- outputAttributeParser
|
|
fAssignments <- many assignmentParser
|
|
_ <- spaceConsumer
|
|
return (MakeFunction fName (Just fDescription) fInput fOutput fAssignments)
|
|
|
|
assignmentParser :: Parser (Expression, Expression)
|
|
assignmentParser =
|
|
do
|
|
_ <- string "assign-output"
|
|
_ <- spaceConsumer
|
|
name <- expressionParser
|
|
_ <- spaceConsumer
|
|
_ <- char ':'
|
|
_ <- spaceConsumer
|
|
expr <- expressionParser
|
|
_ <- spaceConsumer
|
|
return (name, expr)
|
|
|
|
inputAttributesParser :: Parser [TypeAttribute]
|
|
inputAttributesParser =
|
|
do
|
|
_ <- string "inputs:"
|
|
_ <- spaceConsumer
|
|
inputs <- many $ try attributeParser
|
|
_ <- spaceConsumer
|
|
return inputs
|
|
|
|
outputAttributeParser :: Parser TypeAttribute
|
|
outputAttributeParser =
|
|
do
|
|
_ <- string "output:"
|
|
_ <- spaceConsumer
|
|
outputs <- attributeParser
|
|
_ <- spaceConsumer
|
|
return outputs
|
|
|
|
attributeParser :: Parser TypeAttribute
|
|
attributeParser =
|
|
do
|
|
nam <- camelNameParser
|
|
_ <- spaceConsumer
|
|
typ <- pascalNameParser <|> camelNameParser
|
|
_ <- spaceConsumer
|
|
crd <- cardinalityParser
|
|
_ <- spaceConsumer
|
|
desc <- optional descriptionParser
|
|
return $ MakeTypeAttribute nam typ crd desc
|
|
|