Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keywords refactor #1566

Merged
merged 6 commits into from
Oct 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/Juvix/Compiler/Asm/Keywords.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
module Juvix.Compiler.Asm.Keywords
( module Juvix.Compiler.Asm.Keywords,
module Juvix.Data.Keyword,
module Juvix.Data.Keyword.All,
)
where

import Juvix.Data.Keyword
import Juvix.Data.Keyword.All
( kwArg,
kwColon,
kwDollar,
kwFalse,
kwFun,
kwInductive,
kwRightArrow,
kwSemicolon,
kwStar,
kwTmp,
kwTrue,
kwUnit,
kwVoid,
)
import Juvix.Prelude

allKeywordStrings :: HashSet Text
allKeywordStrings = keywordsStrings allKeywords

allKeywords :: [Keyword]
allKeywords =
[ kwFun,
kwInductive,
kwColon,
kwSemicolon,
kwStar,
kwRightArrow,
kwTrue,
kwFalse,
kwArg,
kwTmp
]
44 changes: 22 additions & 22 deletions src/Juvix/Compiler/Asm/Translation/FromSource.hs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ statementFunction ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
ParsecS r ()
statementFunction = do
kwFun
kw kwFun
off <- P.getOffset
(txt, i) <- identifierL
idt <- lift $ getIdent txt
Expand All @@ -119,7 +119,7 @@ statementFunction = do
_functionType = mkTypeFun argtys (fromMaybe TyDynamic mrty)
}
lift $ registerFunction fi0
mcode <- (kwSemicolon $> Nothing) <|> optional (braces parseCode)
mcode <- (kw kwSemicolon $> Nothing) <|> optional (braces parseCode)
let fi = fi0 {_functionCode = fromMaybe [] mcode}
case idt of
Just (IdentFwd _) -> do
Expand All @@ -141,7 +141,7 @@ statementInductive ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
ParsecS r ()
statementInductive = do
kwInductive
kw kwInductive
off <- P.getOffset
(txt, i) <- identifierL
idt <- lift $ getIdent txt
Expand All @@ -157,7 +157,7 @@ statementInductive = do
_inductiveConstructors = []
}
lift $ registerInductive ii
ctrs <- braces $ P.sepEndBy (constrDecl sym) kwSemicolon
ctrs <- braces $ P.sepEndBy (constrDecl sym) (kw kwSemicolon)
lift $ registerInductive ii {_inductiveConstructors = ctrs}

functionArguments ::
Expand Down Expand Up @@ -199,7 +199,7 @@ typeAnnotation ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
ParsecS r Type
typeAnnotation = do
kwColon
kw kwColon
parseType

parseType ::
Expand All @@ -219,7 +219,7 @@ typeFun' ::
NonEmpty Type ->
ParsecS r Type
typeFun' tyargs = do
kwArrow
kw kwRightArrow
TyFun . TypeFun tyargs <$> parseType

typeArguments ::
Expand All @@ -230,8 +230,8 @@ typeArguments = do
<|> (typeDynamic <&> NonEmpty.singleton)
<|> (typeNamed <&> NonEmpty.singleton)

typeDynamic :: ParsecS r Type
typeDynamic = kwStar $> TyDynamic
typeDynamic :: Members '[Reader ParserParams] r => ParsecS r Type
typeDynamic = kw kwStar $> TyDynamic

typeNamed ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
Expand All @@ -253,7 +253,7 @@ typeNamed = do
parseCode ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
ParsecS r Code
parseCode = P.sepEndBy command kwSemicolon
parseCode = P.sepEndBy command (kw kwSemicolon)

command ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
Expand Down Expand Up @@ -337,10 +337,10 @@ integerValue = do
(i, _) <- integer
return $ ConstInt i

boolValue :: ParsecS r Value
boolValue :: Members '[Reader ParserParams] r => ParsecS r Value
boolValue =
(kwTrue $> ConstBool True)
<|> (kwFalse $> ConstBool False)
(kw kwTrue $> ConstBool True)
<|> (kw kwFalse $> ConstBool False)

stringValue ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
Expand All @@ -349,11 +349,11 @@ stringValue = do
(s, _) <- string
return $ ConstString s

unitValue :: ParsecS r Value
unitValue = kwUnit $> ConstUnit
unitValue :: Members '[Reader ParserParams] r => ParsecS r Value
unitValue = kw kwUnit $> ConstUnit

voidValue :: ParsecS r Value
voidValue = kwVoid $> ConstVoid
voidValue :: Members '[Reader ParserParams] r => ParsecS r Value
voidValue = kw kwVoid $> ConstVoid

memValue ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
Expand All @@ -367,22 +367,22 @@ directRef ::
ParsecS r DirectRef
directRef = stackRef <|> argRef <|> tempRef

stackRef :: ParsecS r DirectRef
stackRef = kwDollar $> StackRef
stackRef :: Members '[Reader ParserParams] r => ParsecS r DirectRef
stackRef = kw kwDollar $> StackRef

argRef ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
ParsecS r DirectRef
argRef = do
kwArg
kw kwArg
(off, _) <- brackets integer
return $ ArgRef (fromInteger off)

tempRef ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
ParsecS r DirectRef
tempRef = do
kwTmp
kw kwTmp
(off, _) <- brackets integer
return $ TempRef (fromInteger off)

Expand Down Expand Up @@ -462,7 +462,7 @@ instrCall = do
parseCallType ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
ParsecS r CallType
parseCallType = (kwDollar $> CallClosure) <|> (CallFun <$> funSymbol)
parseCallType = (kw kwDollar $> CallClosure) <|> (CallFun <$> funSymbol)

instrCallClosures ::
Members '[Reader ParserParams, InfoTableBuilder] r =>
Expand Down Expand Up @@ -495,7 +495,7 @@ caseBranch ::
ParsecS r CaseBranch
caseBranch = do
tag <- P.try constrTag
kwColon
kw kwColon
CaseBranch tag <$> branchCode

defaultBranch ::
Expand Down
65 changes: 5 additions & 60 deletions src/Juvix/Compiler/Asm/Translation/FromSource/Lexer.hs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
module Juvix.Compiler.Asm.Translation.FromSource.Lexer
( module Juvix.Compiler.Asm.Translation.FromSource.Lexer,
module Juvix.Parser.Lexer,
module Juvix.Compiler.Asm.Keywords,
)
where

import Juvix.Extra.Strings qualified as Str
import Juvix.Compiler.Asm.Keywords
import Juvix.Parser.Lexer
import Juvix.Prelude
import Text.Megaparsec as P hiding (sepBy1, sepEndBy1, some)
Expand Down Expand Up @@ -34,11 +35,8 @@ number = number' integer
string :: Member (Reader ParserParams) r => ParsecS r (Text, Interval)
string = lexemeInterval string'

keyword :: Text -> ParsecS r ()
keyword = keyword' space

keywordSymbol :: Text -> ParsecS r ()
keywordSymbol = keywordSymbol' space
kw :: Members '[Reader ParserParams] r => Keyword -> ParsecS r ()
kw k = void $ lexeme $ kw' k

identifier :: ParsecS r Text
identifier = lexeme bareIdentifier
Expand All @@ -47,25 +45,11 @@ identifierL :: Member (Reader ParserParams) r => ParsecS r (Text, Interval)
identifierL = lexemeInterval bareIdentifier

bareIdentifier :: ParsecS r Text
bareIdentifier = rawIdentifier' (`elem` specialSymbols) allKeywords
bareIdentifier = rawIdentifier' (`elem` specialSymbols) allKeywordStrings

specialSymbols :: [Char]
specialSymbols = ":"

allKeywords :: [ParsecS r ()]
allKeywords =
[ kwFun,
kwInductive,
kwColon,
kwSemicolon,
kwStar,
kwArrow,
kwTrue,
kwFalse,
kwArg,
kwTmp
]

dot :: ParsecS r ()
dot = symbol "."

Expand Down Expand Up @@ -98,42 +82,3 @@ braces = between (symbol "{") (symbol "}")

brackets :: ParsecS r a -> ParsecS r a
brackets = between (symbol "[") (symbol "]")

kwFun :: ParsecS r ()
kwFun = keyword Str.fun_

kwInductive :: ParsecS r ()
kwInductive = keyword Str.inductive

kwColon :: ParsecS r ()
kwColon = keyword Str.colon

kwSemicolon :: ParsecS r ()
kwSemicolon = keyword Str.semicolon

kwStar :: ParsecS r ()
kwStar = keyword Str.mul

kwDollar :: ParsecS r ()
kwDollar = keyword Str.dollar

kwArrow :: ParsecS r ()
kwArrow = keyword Str.toAscii <|> keyword Str.toUnicode

kwTrue :: ParsecS r ()
kwTrue = keyword Str.true_

kwFalse :: ParsecS r ()
kwFalse = keyword Str.false_

kwUnit :: ParsecS r ()
kwUnit = keyword Str.unit

kwVoid :: ParsecS r ()
kwVoid = keyword Str.void

kwArg :: ParsecS r ()
kwArg = keyword Str.arg_

kwTmp :: ParsecS r ()
kwTmp = keyword Str.tmp_
85 changes: 85 additions & 0 deletions src/Juvix/Compiler/Concrete/Keywords.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
module Juvix.Compiler.Concrete.Keywords
( module Juvix.Compiler.Concrete.Keywords,
module Juvix.Data.Keyword,
module Juvix.Data.Keyword.All,
)
where

import Juvix.Data.Keyword
import Juvix.Data.Keyword.All
( -- reserved

-- extra
cBackend,
ghc,
kwAssign,
kwAxiom,
kwBuiltin,
kwColon,
kwColonOmega,
kwColonOne,
kwColonZero,
kwCompile,
kwEnd,
kwForeign,
kwHiding,
kwHole,
kwImport,
kwIn,
kwInductive,
kwInfix,
kwInfixl,
kwInfixr,
kwLambda,
kwLet,
kwMapsTo,
kwModule,
kwOpen,
kwPositive,
kwPostfix,
kwPublic,
kwRightArrow,
kwSemicolon,
kwTerminating,
kwType,
kwUsing,
kwWhere,
kwWildcard,
)
import Juvix.Prelude

allKeywordStrings :: HashSet Text
allKeywordStrings = keywordsStrings allKeywords

allKeywords :: [Keyword]
allKeywords =
[ kwAssign,
kwAxiom,
kwColon,
kwColonOmega,
kwColonOne,
kwColonZero,
kwCompile,
kwEnd,
kwForeign,
kwHiding,
kwHole,
kwImport,
kwIn,
kwInductive,
kwInfix,
kwInfixl,
kwInfixr,
kwLambda,
kwLet,
kwModule,
kwOpen,
kwPostfix,
kwPublic,
kwRightArrow,
kwSemicolon,
kwType,
kwUsing,
kwWhere,
kwWildcard
]
Loading