language-oberon 0.1.1 → 0.2
raw patch · 6 files changed
+61/−63 lines, 6 filesdep ~grammatical-parsersdep ~rank2classesPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: grammatical-parsers, rank2classes
API changes (from Hackage documentation)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Case Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Case Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.CaseLabels Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.CaseLabels Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Declaration Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Declaration Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Designator Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Designator Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Element Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Element Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Expression Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Expression Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.FPSection Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.FPSection Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.FieldList Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.FieldList Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.FormalParameters Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.FormalParameters Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Module Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Module Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.ProcedureBody Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.ProcedureBody Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.ProcedureHeading Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.ProcedureHeading Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Statement Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Statement Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Type Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.Type Text.Grampa.Class.Ambiguous)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.WithAlternative Data.Functor.Identity.Identity)
- Language.Oberon.AST: instance Data.Data.Data (Language.Oberon.AST.WithAlternative Text.Grampa.Class.Ambiguous)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f))) => Data.Data.Data (Language.Oberon.AST.CaseLabels f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f))) => Data.Data.Data (Language.Oberon.AST.Designator f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f))) => Data.Data.Data (Language.Oberon.AST.Element f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f))) => Data.Data.Data (Language.Oberon.AST.Expression f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f))) => Data.Data.Data (Language.Oberon.AST.FPSection f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f))) => Data.Data.Data (Language.Oberon.AST.FieldList f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f))) => Data.Data.Data (Language.Oberon.AST.FormalParameters f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f))) => Data.Data.Data (Language.Oberon.AST.ProcedureHeading f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f))) => Data.Data.Data (Language.Oberon.AST.Type f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f)), Data.Data.Data (f (Language.Oberon.AST.Statement f))) => Data.Data.Data (Language.Oberon.AST.Declaration f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f)), Data.Data.Data (f (Language.Oberon.AST.Statement f))) => Data.Data.Data (Language.Oberon.AST.Module f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Expression f)), Data.Data.Data (f (Language.Oberon.AST.Statement f))) => Data.Data.Data (Language.Oberon.AST.ProcedureBody f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Statement f))) => Data.Data.Data (Language.Oberon.AST.Case f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Statement f))) => Data.Data.Data (Language.Oberon.AST.Statement f)
+ Language.Oberon.AST: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data (f (Language.Oberon.AST.Designator f)), Data.Data.Data (f (Language.Oberon.AST.Statement f))) => Data.Data.Data (Language.Oberon.AST.WithAlternative f)
+ Language.Oberon.Resolver: AmbiguousDesignator :: [Designator Identity] -> Error
+ Language.Oberon.Resolver: AmbiguousExpression :: [Expression Identity] -> Error
+ Language.Oberon.Resolver: AmbiguousParses :: Error
+ Language.Oberon.Resolver: AmbiguousStatement :: [Statement Identity] -> Error
+ Language.Oberon.Resolver: ClashingImports :: Error
+ Language.Oberon.Resolver: InvalidDesignator :: (NonEmpty Error) -> Error
+ Language.Oberon.Resolver: InvalidExpression :: (NonEmpty Error) -> Error
+ Language.Oberon.Resolver: InvalidStatement :: (NonEmpty Error) -> Error
+ Language.Oberon.Resolver: NotAProcedure :: QualIdent -> Error
+ Language.Oberon.Resolver: NotARecord :: QualIdent -> Error
+ Language.Oberon.Resolver: NotAType :: QualIdent -> Error
+ Language.Oberon.Resolver: NotATypeDesignator :: (Designator Ambiguous) -> Error
+ Language.Oberon.Resolver: NotAValue :: QualIdent -> Error
+ Language.Oberon.Resolver: NotWriteable :: QualIdent -> Error
+ Language.Oberon.Resolver: UnknownImport :: QualIdent -> Error
+ Language.Oberon.Resolver: UnknownLocal :: Ident -> Error
+ Language.Oberon.Resolver: UnknownModule :: Ident -> Error
+ Language.Oberon.Resolver: UnparseableModule :: ParseFailure -> Error
Files
- app/Parse.hs +13/−10
- language-oberon.cabal +3/−3
- src/Language/Oberon.hs +3/−3
- src/Language/Oberon/AST.hs +19/−31
- src/Language/Oberon/Grammar.hs +18/−14
- src/Language/Oberon/Resolver.hs +5/−2
app/Parse.hs view
@@ -15,7 +15,7 @@ import Data.Either.Validation (Validation(..), validationToEither) import Data.Functor.Identity (Identity) import Data.Functor.Compose (getCompose)-import Data.List.NonEmpty (NonEmpty)+import Data.List.NonEmpty (NonEmpty((:|))) import qualified Data.Map.Lazy as Map import Data.Maybe (fromMaybe) import Data.Monoid ((<>))@@ -23,7 +23,7 @@ import Data.Text.IO (getLine, readFile, getContents) import Data.Typeable (Typeable) import Options.Applicative-import Text.Grampa (Ambiguous, Grammar, ParseResults, parseComplete)+import Text.Grampa (Ambiguous, Grammar, ParseResults, parseComplete, showFailure) import qualified Text.Grampa.ContextFree.LeftRecursive as LeftRecursive import ReprTree import System.FilePath (FilePath, takeDirectory)@@ -84,7 +84,7 @@ of ModuleWithImportsMode -> \source-> parseAndResolveModule optsOberon2 (fromMaybe (takeDirectory file) optsInclude) source- >>= succeed optsOutput+ >>= succeed optsOutput source ModuleMode -> go (Resolver.resolveModule predefined mempty) Grammar.module_prod chosenGrammar file DefinitionMode -> go (Resolver.resolveModule predefined mempty) Grammar.module_prod@@ -114,15 +114,18 @@ -> String -> Text -> IO () go resolve production grammar filename contents = case getCompose (production $ parseComplete grammar contents)- of Right [x] -> succeed optsOutput (resolve x)+ of Right [x] -> succeed optsOutput contents (resolve x) Right l -> putStrLn ("Ambiguous: " ++ show optsIndex ++ "/" ++ show (length l) ++ " parses")- >> succeed optsOutput (resolve $ l !! optsIndex)- Left err -> error (show err)+ >> succeed optsOutput contents (resolve $ l !! optsIndex)+ Left err -> putStrLn (showFailure contents err 3) -succeed out x = case out- of Pretty width -> either print (putDocW width . pretty) (validationToEither x)- Tree -> either print (putStrLn . reprTreeString) (validationToEither x)- Plain -> print x+succeed out contents x = either reportFailure showSuccess (validationToEither x)+ where reportFailure (Resolver.UnparseableModule err :| []) = putStrLn (showFailure contents err 3)+ reportFailure errs = print errs+ showSuccess = case out+ of Pretty width -> putDocW width . pretty+ Tree -> putStrLn . reprTreeString+ Plain -> print instance Pretty (Module Ambiguous) where pretty _ = error "Disambiguate before pretty-printing"
language-oberon.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: language-oberon-version: 0.1.1+version: 0.2 synopsis: Parser and pretty-printer for the Oberon programming language description: The library and the executable support both the original Oberon and the Oberon-2 programming language, as described@@ -36,7 +36,7 @@ Language.Oberon.Pretty, Language.Oberon.Resolver build-depends: base >= 4.7 && < 5, text < 1.3, containers >= 0.5 && < 1.0, filepath < 1.5, directory < 1.4, parsers >= 0.12.7 && < 0.13, prettyprinter >= 1 && < 1.3, either == 5.*,- rank2classes < 1.1, grammatical-parsers == 0.3.*+ rank2classes < 1.2, grammatical-parsers >= 0.3.1 && < 0.4 default-language: Haskell2010 executable parse@@ -45,7 +45,7 @@ other-extensions: RankNTypes, RecordWildCards, ScopedTypeVariables, FlexibleInstances, DeriveDataTypeable build-depends: base >= 4.7 && < 5, text < 1.3, either == 5.*, containers >= 0.5 && < 1.0, repr-tree-syb < 0.2, filepath < 1.5, prettyprinter >= 1 && < 1.3,- rank2classes < 1.1, grammatical-parsers == 0.3.*, language-oberon,+ rank2classes < 1.2, grammatical-parsers >= 0.3.1 && < 0.4, language-oberon, optparse-applicative default-language: Haskell2010
src/Language/Oberon.hs view
@@ -9,7 +9,7 @@ import Data.Either.Validation (Validation(..)) import Data.Functor.Identity (Identity) import Data.Functor.Compose (getCompose)-import Data.List.NonEmpty (NonEmpty)+import Data.List.NonEmpty (NonEmpty((:|))) import qualified Data.Map.Lazy as Map import Data.Map.Lazy (Map) import Data.Monoid ((<>))@@ -61,13 +61,13 @@ parseAndResolveModule :: Bool -> FilePath -> Text -> IO (Validation (NonEmpty Resolver.Error) (Module Identity)) parseAndResolveModule oberon2 path source = case parseModule oberon2 source- of Left err -> error (show err)+ of Left err -> return (Failure $ Resolver.UnparseableModule err :| []) Right [rootModule@(Module moduleName imports _ _ _)] -> do importedModules <- parseImportsOf oberon2 path (Map.singleton moduleName rootModule) let resolvedImportMap = Resolver.resolveModule predefinedScope resolvedImportMap <$> importedModules predefinedScope = if oberon2 then Resolver.predefined2 else Resolver.predefined return $ Resolver.resolveModule predefinedScope resolvedImportMap rootModule- Right _ -> error "Ambiguous parsings"+ Right _ -> return (Failure $ Resolver.AmbiguousParses :| []) -- | Parse the module file at the given path, assuming all its imports are in the same directory. parseAndResolveModuleFile :: Bool -> FilePath -> IO (Validation (NonEmpty Resolver.Error) (Module Identity))
src/Language/Oberon/AST.hs view
@@ -4,7 +4,7 @@ module Language.Oberon.AST where -import Data.Data (Data)+import Data.Data (Data, Typeable) import Data.Functor.Identity (Identity) import Data.List.NonEmpty import Data.Text@@ -12,8 +12,8 @@ data Module f = Module Ident [Import] [Declaration f] (Maybe (StatementSequence f)) Ident -deriving instance Data (Module Identity)-deriving instance Data (Module Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f)), Data (f (Statement f))) =>+ Data (Module f) deriving instance (Show (f (Designator f)), Show (f (Expression f)), Show (f (Statement f))) => Show (Module f) type Ident = Text@@ -26,8 +26,8 @@ | ProcedureDeclaration (ProcedureHeading f) (ProcedureBody f) Ident | ForwardDeclaration IdentDef (Maybe (FormalParameters f)) -deriving instance Data (Declaration Identity)-deriving instance Data (Declaration Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f)), Data (f (Statement f))) =>+ Data (Declaration f) deriving instance (Show (f (Designator f)), Show (f (Expression f)), Show (f (Statement f))) => Show (Declaration f) data IdentDef = IdentDef Ident AccessMode@@ -60,8 +60,7 @@ | FunctionCall (AmbDesignator f) (ActualParameters f) | Not (Expression f) -deriving instance Data (Expression Identity)-deriving instance Data (Expression Ambiguous)+deriving instance (Typeable f, Data (f (Designator f))) => Data (Expression f) deriving instance Show (f (Designator f)) => Show (Expression f) data RelOp = Equal | Unequal | Less | LessOrEqual | Greater | GreaterOrEqual | In | Is@@ -70,8 +69,7 @@ data Element f = Element (Expression f) | Range (Expression f) (Expression f) -deriving instance Data (Element Identity)-deriving instance Data (Element Ambiguous)+deriving instance (Typeable f, Data (f (Designator f))) => Data (Element f) deriving instance Show (f (Designator f)) => Show (Element f) type AmbDesignator f = f (Designator f)@@ -82,8 +80,7 @@ | TypeGuard (Designator f) QualIdent | Dereference (Designator f) -deriving instance Data (Designator Identity)-deriving instance Data (Designator Ambiguous)+deriving instance (Typeable f, Data (f (Designator f))) => Data (Designator f) deriving instance Show (f (Designator f)) => Show (Designator f) type ActualParameters f = [Expression f]@@ -94,8 +91,7 @@ | PointerType (Type f) | ProcedureType (Maybe (FormalParameters f)) -deriving instance Data (Type Identity)-deriving instance Data (Type Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f))) => Data (Type f) deriving instance (Show (f (Designator f)), Show (f (Expression f))) => Show (Type f) data QualIdent = QualIdent Ident Ident @@ -109,8 +105,7 @@ data FieldList f = FieldList IdentList (Type f) | EmptyFieldList -deriving instance Data (FieldList Identity)-deriving instance Data (FieldList Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f))) => Data (FieldList f) deriving instance (Show (f (Designator f)), Show (f (Expression f))) => Show (FieldList f) type IdentList = NonEmpty IdentDef@@ -119,22 +114,19 @@ data FormalParameters f = FormalParameters [FPSection f] (Maybe QualIdent) data FPSection f = FPSection Bool (NonEmpty Ident) (Type f) -deriving instance Data (ProcedureHeading Identity)-deriving instance Data (ProcedureHeading Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f))) => Data (ProcedureHeading f) deriving instance (Show (f (Designator f)), Show (f (Expression f))) => Show (ProcedureHeading f) -deriving instance Data (FormalParameters Identity)-deriving instance Data (FormalParameters Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f))) => Data (FormalParameters f) deriving instance (Show (f (Designator f)), Show (f (Expression f))) => Show (FormalParameters f) -deriving instance Data (FPSection Identity)-deriving instance Data (FPSection Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f))) => Data (FPSection f) deriving instance (Show (f (Designator f)), Show (f (Expression f))) => Show (FPSection f) data ProcedureBody f = ProcedureBody [Declaration f] (Maybe (StatementSequence f)) -deriving instance Data (ProcedureBody Identity)-deriving instance Data (ProcedureBody Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Expression f)), Data (f (Statement f))) =>+ Data (ProcedureBody f) deriving instance (Show (f (Designator f)), Show (f (Expression f)), Show (f (Statement f))) => Show (ProcedureBody f) type StatementSequence f = NonEmpty (f (Statement f))@@ -152,8 +144,7 @@ | Exit | Return (Maybe (Expression f)) -deriving instance Data (Statement Identity)-deriving instance Data (Statement Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Statement f))) => Data (Statement f) deriving instance (Show (f (Designator f)), Show (f (Statement f))) => Show (Statement f) data WithAlternative f = WithAlternative QualIdent QualIdent (StatementSequence f)@@ -164,14 +155,11 @@ data CaseLabels f = SingleLabel (ConstExpression f) | LabelRange (ConstExpression f) (ConstExpression f) -deriving instance Data (WithAlternative Identity)-deriving instance Data (WithAlternative Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Statement f))) => Data (WithAlternative f) deriving instance (Show (f (Designator f)), Show (f (Statement f))) => Show (WithAlternative f) -deriving instance Data (Case Identity)-deriving instance Data (Case Ambiguous)+deriving instance (Typeable f, Data (f (Designator f)), Data (f (Statement f))) => Data (Case f) deriving instance (Show (f (Designator f)), Show (f (Statement f))) => Show (Case f) -deriving instance Data (CaseLabels Identity)-deriving instance Data (CaseLabels Ambiguous)+deriving instance (Typeable f, Data (f (Designator f))) => Data (CaseLabels f) deriving instance Show (f (Designator f)) => Show (CaseLabels f)
src/Language/Oberon/Grammar.hs view
@@ -15,7 +15,7 @@ import Data.Text (Text, unpack) import Text.Grampa import Text.Grampa.ContextFree.LeftRecursive (Parser)-import Text.Parser.Combinators (sepBy, sepBy1, sepByNonEmpty)+import Text.Parser.Combinators (sepBy, sepBy1, sepByNonEmpty, try) import Text.Parser.Token (braces, brackets, parens) import qualified Rank2@@ -100,10 +100,10 @@ instance Lexical (OberonGrammar f) where type LexicalConstraint p (OberonGrammar f) s = (s ~ Text, p ~ Parser)- lexicalComment = string "(*"- *> skipMany (lexicalComment- <|> notFollowedBy (string "*)") <* anyToken <* takeCharsWhile isCommentChar)- <* string "*)"+ lexicalComment = try (string "(*"+ *> skipMany (lexicalComment+ <|> notFollowedBy (string "*)") <* anyToken <* takeCharsWhile isCommentChar)+ <* string "*)") where isCommentChar c = c /= '*' && c /= '(' lexicalWhiteSpace = takeCharsWhile isSpace *> skipMany (lexicalComment *> takeCharsWhile isSpace) isIdentifierStartChar = isLetter@@ -139,6 +139,8 @@ grammar2 g@OberonGrammar{..} = g1{ identdef = IdentDef <$> ident <*> (Exported <$ delimiter "*" <|> ReadOnly <$ delimiter "-" <|> pure PrivateOnly),+ + string_prod = string_prod1 <|> lexicalToken (char '\'' *> takeWhile (/= "'") <* char '\''), procedureHeading = ProcedureHeading <$ keyword "PROCEDURE" <*> optional (parens ((,,) <$> (True <$ keyword "VAR" <|> pure False)@@ -152,7 +154,7 @@ <*> statementSequence <* keyword "END", withStatement = With <$ keyword "WITH" <*> sepByNonEmpty withAlternative (delimiter "|") <*> optional (keyword "ELSE" *> statementSequence) <* keyword "END"}- where g1@OberonGrammar{statement= statement1} = grammar g+ where g1@OberonGrammar{statement= statement1, string_prod= string_prod1} = grammar g withAlternative = WithAlternative <$> qualident <* delimiter ":" <*> qualident <* keyword "DO" <*> statementSequence @@ -169,11 +171,13 @@ <|> keyword "TYPE" *> many (typeDeclaration <* delimiter ";") <|> keyword "VAR" *> many (variableDeclaration <* delimiter ";")) <> many (procedureDeclaration <* delimiter ";"- <|> forwardDeclaration <* delimiter ";"),+ <|> forwardDeclaration <* delimiter ";")+ <?> "declarations", constantDeclaration = ConstantDeclaration <$> identdef <* delimiter "=" <*> ambiguous constExpression, identdef = IdentDef <$> ident <*> (Exported <$ delimiter "*" <|> pure PrivateOnly), constExpression = expression,- expression = simpleExpression <**> (pure id <|> (flip . Relation) <$> relation <*> simpleExpression),+ expression = simpleExpression <**> (pure id <|> (flip . Relation) <$> relation <*> simpleExpression)+ <?> "expression", simpleExpression = (Positive <$ operator "+" <|> Negative <$ operator "-" <|> pure id) <*> (term <**> (appEndo <$> concatMany (Endo <$> (flip . applyBinOp <$> addOperator <*> term)))), term = factor <**> (appEndo <$> concatMany (Endo <$> (flip . applyBinOp <$> mulOperator <*> factor))),@@ -195,8 +199,7 @@ charConstant = lexicalToken (empty -- CharConstant <$ char '"' <*> anyChar <* char '"' <|> CharCode . fst . head . readHex . unpack <$> (digit <> takeCharsWhile isHexDigit <* string "X")),- string_prod = lexicalToken (char '"' *> takeWhile (/= "\"") <* char '"'- <|> char '\'' *> takeWhile (/= "'") <* char '\''), -- Oberon2+ string_prod = lexicalToken (char '"' *> takeWhile (/= "\"") <* char '"'), set = Set <$> braces (sepBy element (delimiter ",")), element = Element <$> expression <|> Range <$> expression <* delimiter ".." <*> expression,@@ -228,7 +231,7 @@ <*> fieldListSequence <* keyword "END", baseType = qualident, fieldListSequence = sepByNonEmpty fieldList (delimiter ";"),- fieldList = FieldList <$> identList <* delimiter ":" <*> type_prod+ fieldList = (FieldList <$> identList <* delimiter ":" <*> type_prod <?> "record field declarations") <|> pure EmptyFieldList, identList = sepByNonEmpty identdef (delimiter ","), pointerType = PointerType <$ keyword "POINTER" <* keyword "TO" <*> type_prod,@@ -253,7 +256,8 @@ <|> whileStatement <|> repeatStatement <|> loopStatement <|> withStatement <|> Exit <$ keyword "EXIT" <|> Return <$ keyword "RETURN" <*> optional expression- <|> pure EmptyStatement,+ <|> pure EmptyStatement+ <?> "statement", assignment = Assignment <$> ambiguous designator <* delimiter ":=" <*> expression, procedureCall = ProcedureCall <$> ambiguous designator <*> optional actualParameters, ifStatement = If <$ keyword "IF"@@ -281,8 +285,8 @@ delimiter, operator :: Text -> Parser (OberonGrammar f) Text Text -delimiter s = lexicalToken (string s)-operator = delimiter+delimiter s = lexicalToken (string s) <?> ("delimiter " <> show s)+operator s = lexicalToken (string s) <?> ("operator " <> show s) reservedWords :: [Text] reservedWords = ["ARRAY", "IMPORT", "RETURN",
src/Language/Oberon/Resolver.hs view
@@ -4,7 +4,8 @@ -- expression @foo(bar)@ may be a call to function @foo@ with a parameter @bar@, or it may be type guard on variable -- @foo@ casting it to type @bar@. -module Language.Oberon.Resolver (Error, Predefined, predefined, predefined2, resolveModule, resolveModules) where+module Language.Oberon.Resolver (Error(..),+ Predefined, predefined, predefined2, resolveModule, resolveModules) where import Control.Applicative (Alternative) import Control.Monad ((>=>))@@ -19,7 +20,7 @@ import qualified Data.Map.Lazy as Map import Data.Semigroup (Semigroup(..), sconcat) -import Text.Grampa (Ambiguous(..))+import Text.Grampa (Ambiguous(..), ParseFailure) import Language.Oberon.AST @@ -32,6 +33,7 @@ data Error = UnknownModule Ident | UnknownLocal Ident | UnknownImport QualIdent+ | AmbiguousParses | AmbiguousDesignator [Designator Identity] | AmbiguousExpression [Expression Identity] | AmbiguousStatement [Statement Identity]@@ -45,6 +47,7 @@ | NotAValue QualIdent | NotWriteable QualIdent | ClashingImports+ | UnparseableModule ParseFailure deriving (Show) type Scope = Predefined