diff --git a/src/Juvix/Compiler/Concrete/Data/Highlight.hs b/src/Juvix/Compiler/Concrete/Data/Highlight.hs index 93597cb22a..1248eb0b7f 100644 --- a/src/Juvix/Compiler/Concrete/Data/Highlight.hs +++ b/src/Juvix/Compiler/Concrete/Data/Highlight.hs @@ -69,6 +69,7 @@ goFaceParsedItem i = WithLoc (i ^. parsedLoc) (PropertyFace f) ParsedTagLiteralInt -> FaceNumber ParsedTagLiteralString -> FaceString ParsedTagComment -> FaceComment + ParsedTagDelimiter -> FaceDelimiter goFaceName :: AName -> Maybe (WithLoc PropertyFace) goFaceName n = do diff --git a/src/Juvix/Compiler/Concrete/Data/Highlight/Properties.hs b/src/Juvix/Compiler/Concrete/Data/Highlight/Properties.hs index f19265d556..a85a3e0c16 100644 --- a/src/Juvix/Compiler/Concrete/Data/Highlight/Properties.hs +++ b/src/Juvix/Compiler/Concrete/Data/Highlight/Properties.hs @@ -27,6 +27,7 @@ data Face | FaceFunction | FaceModule | FaceAxiom + | FaceDelimiter | FaceKeyword | FaceString | FaceNumber @@ -40,6 +41,7 @@ faceSymbolStr = \case FaceConstructor -> Str.constructor FaceModule -> Str.module_ FaceKeyword -> Str.keyword + FaceDelimiter -> Str.delimiter FaceFunction -> Str.function FaceNumber -> Str.number FaceComment -> Str.comment diff --git a/src/Juvix/Compiler/Concrete/Data/Highlight/RenderEmacs.hs b/src/Juvix/Compiler/Concrete/Data/Highlight/RenderEmacs.hs index dab111b8eb..4b9582569a 100644 --- a/src/Juvix/Compiler/Concrete/Data/Highlight/RenderEmacs.hs +++ b/src/Juvix/Compiler/Concrete/Data/Highlight/RenderEmacs.hs @@ -23,7 +23,7 @@ fromCodeAnn = \case f <- nameKindFace k return (EPropertyFace (PropertyFace f)) AnnKeyword -> Just (EPropertyFace (PropertyFace FaceKeyword)) - AnnDelimiter -> Just (EPropertyFace (PropertyFace FaceKeyword)) + AnnDelimiter -> Just (EPropertyFace (PropertyFace FaceDelimiter)) AnnComment -> Just (EPropertyFace (PropertyFace FaceComment)) AnnLiteralString -> Just (EPropertyFace (PropertyFace FaceString)) AnnLiteralInteger -> Just (EPropertyFace (PropertyFace FaceNumber)) diff --git a/src/Juvix/Compiler/Concrete/Data/ParsedInfoTableBuilder.hs b/src/Juvix/Compiler/Concrete/Data/ParsedInfoTableBuilder.hs index 2844f5a354..39deca89a5 100644 --- a/src/Juvix/Compiler/Concrete/Data/ParsedInfoTableBuilder.hs +++ b/src/Juvix/Compiler/Concrete/Data/ParsedInfoTableBuilder.hs @@ -1,6 +1,7 @@ module Juvix.Compiler.Concrete.Data.ParsedInfoTableBuilder ( InfoTableBuilder, registerLiteral, + registerDelimiter, registerKeyword, registerJudocText, registerComment, @@ -38,6 +39,14 @@ registerKeyword r = _parsedTag = ParsedTagKeyword } +registerDelimiter :: Member InfoTableBuilder r => Interval -> Sem r () +registerDelimiter i = + registerItem + ParsedItem + { _parsedLoc = i, + _parsedTag = ParsedTagDelimiter + } + registerJudocText :: Member InfoTableBuilder r => Interval -> Sem r () registerJudocText i = registerItem diff --git a/src/Juvix/Compiler/Concrete/Data/ParsedItem.hs b/src/Juvix/Compiler/Concrete/Data/ParsedItem.hs index 5e97bd5fb8..140e3e99fb 100644 --- a/src/Juvix/Compiler/Concrete/Data/ParsedItem.hs +++ b/src/Juvix/Compiler/Concrete/Data/ParsedItem.hs @@ -13,6 +13,7 @@ data ParsedItemTag | ParsedTagLiteralInt | ParsedTagLiteralString | ParsedTagComment + | ParsedTagDelimiter deriving stock (Eq, Show, Generic) makeLenses ''ParsedItem diff --git a/src/Juvix/Compiler/Concrete/Translation/FromSource.hs b/src/Juvix/Compiler/Concrete/Translation/FromSource.hs index ab40c33643..4cb01beb74 100644 --- a/src/Juvix/Compiler/Concrete/Translation/FromSource.hs +++ b/src/Juvix/Compiler/Concrete/Translation/FromSource.hs @@ -96,7 +96,7 @@ top :: (Member InfoTableBuilder r) => ParsecS r a -> ParsecS r a -top p = space >> p <* (optional (kw kwSemicolon) >> P.eof) +top p = space >> p <* (optional semicolon >> P.eof) topModuleDef :: (Members '[Error ParserError, Files, PathResolver, InfoTableBuilder, JudocStash, NameIdGen] r) => @@ -143,7 +143,7 @@ mkTopModulePath :: NonEmpty Symbol -> TopModulePath mkTopModulePath l = TopModulePath (NonEmpty.init l) (NonEmpty.last l) symbolList :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r (NonEmpty Symbol) -symbolList = braces (P.sepBy1 symbol (kw kwSemicolon)) +symbolList = braces (P.sepBy1 symbol semicolon) topModulePath :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r TopModulePath topModulePath = mkTopModulePath <$> dottedSymbol @@ -192,7 +192,7 @@ stashJudoc = do P.try (judocStart >> judocExampleStart) _exampleId <- P.lift freshNameId (_exampleExpression, _exampleLoc) <- interval parseExpressionAtoms - kw kwSemicolon + semicolon space return (JudocExample (Example {..})) @@ -380,7 +380,7 @@ letClause = either LetTypeSig LetFunClause <$> auxTypeSigFunClause letBlock :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r (LetBlock 'Parsed) letBlock = do _letKw <- kw kwLet - _letClauses <- P.sepEndBy1 letClause (kw kwSemicolon) + _letClauses <- P.sepEndBy1 letClause semicolon kw kwIn _letExpression <- parseExpressionAtoms return LetBlock {..} @@ -625,15 +625,15 @@ moduleDef = P.label "" $ do _moduleDoc <- getJudoc _modulePath <- pmodulePath _moduleParameters <- many inductiveParams - kw kwSemicolon - _moduleBody <- P.sepEndBy statement (kw kwSemicolon) + semicolon + _moduleBody <- P.sepEndBy statement semicolon _moduleKwEnd <- endModule return Module {..} where endModule :: ParsecS r (ModuleEndType t) endModule = case sing :: SModuleIsTop t of SModuleLocal -> kw kwEnd - SModuleTop -> void (optional (kw kwEnd >> kw kwSemicolon)) + SModuleTop -> void (optional (kw kwEnd >> semicolon)) -- | An ExpressionAtom which is a valid expression on its own. atomicExpression :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r (ExpressionAtoms 'Parsed) diff --git a/src/Juvix/Compiler/Concrete/Translation/FromSource/Lexer.hs b/src/Juvix/Compiler/Concrete/Translation/FromSource/Lexer.hs index 0f0bfcc6ce..20638da560 100644 --- a/src/Juvix/Compiler/Concrete/Translation/FromSource/Lexer.hs +++ b/src/Juvix/Compiler/Concrete/Translation/FromSource/Lexer.hs @@ -93,20 +93,30 @@ dot = P.char '.' dottedIdentifier :: (Members '[InfoTableBuilder] r) => ParsecS r (NonEmpty (Text, Interval)) dottedIdentifier = lexeme $ P.sepBy1 bareIdentifier dot +delim :: (Members '[InfoTableBuilder] r) => Text -> ParsecS r () +delim sym = lexeme $ delim' sym >>= P.lift . registerDelimiter + lbrace :: (Members '[InfoTableBuilder] r) => ParsecS r () -lbrace = symbol "{" +lbrace = delim "{" rbrace :: (Members '[InfoTableBuilder] r) => ParsecS r () -rbrace = symbol "}" +rbrace = delim "}" lparen :: (Members '[InfoTableBuilder] r) => ParsecS r () -lparen = symbol "(" +lparen = delim "(" rparen :: (Members '[InfoTableBuilder] r) => ParsecS r () -rparen = symbol ")" +rparen = delim ")" + +-- TODO Consider using this instead of kw kwPipe +pipe :: (Members '[InfoTableBuilder] r) => ParsecS r () +pipe = delim "|" + +semicolon :: (Members '[InfoTableBuilder] r) => ParsecS r () +semicolon = delim ";" parens :: (Members '[InfoTableBuilder] r) => ParsecS r a -> ParsecS r a parens = between lparen rparen braces :: (Members '[InfoTableBuilder] r) => ParsecS r a -> ParsecS r a -braces = between (symbol "{") (symbol "}") +braces = between lbrace rbrace diff --git a/src/Juvix/Data/CodeAnn.hs b/src/Juvix/Data/CodeAnn.hs index e4bb68b93c..119beca95c 100644 --- a/src/Juvix/Data/CodeAnn.hs +++ b/src/Juvix/Data/CodeAnn.hs @@ -94,7 +94,7 @@ kwColonColon :: Doc Ann kwColonColon = keyword (Str.colon <> Str.colon) kwPipe :: Doc Ann -kwPipe = keyword Str.pipe +kwPipe = delimiter Str.pipe kwHole :: Doc Ann kwHole = keyword Str.underscore diff --git a/src/Juvix/Extra/Strings.hs b/src/Juvix/Extra/Strings.hs index 009a5982b0..1a1590bb0f 100644 --- a/src/Juvix/Extra/Strings.hs +++ b/src/Juvix/Extra/Strings.hs @@ -227,6 +227,9 @@ any = "Any" questionMark :: (IsString s) => s questionMark = "?" +delimiter :: (IsString s) => s +delimiter = "delimiter" + keyword :: (IsString s) => s keyword = "keyword" diff --git a/src/Juvix/Parser/Lexer.hs b/src/Juvix/Parser/Lexer.hs index d4fb08ad71..8b8e74a2e8 100644 --- a/src/Juvix/Parser/Lexer.hs +++ b/src/Juvix/Parser/Lexer.hs @@ -74,6 +74,10 @@ number' int mn mx = do string' :: ParsecS r Text string' = pack <$> (char '"' >> manyTill L.charLiteral (char '"')) +-- | The caller is responsible of consuming space after it. +delim' :: Text -> ParsecS r Interval +delim' d = P.label (unpack d) . fmap snd . interval $ chunk d + -- | The caller is responsible of consuming space after it. kw' :: Keyword -> ParsecS r KeywordRef kw' k@Keyword {..} = P.label (unpack _keywordAscii) (reserved <|> normal)