language-lua 0.1.7 → 0.2.0
raw patch · 5 files changed
+529/−310 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Language.Lua.Parser: instance Eq PrimaryExp
- Language.Lua.Parser: instance Eq SuffixExp
- Language.Lua.Parser: instance Eq SuffixedExp
- Language.Lua.Parser: instance Show PrimaryExp
- Language.Lua.Parser: instance Show SuffixExp
- Language.Lua.Parser: instance Show SuffixedExp
- Language.Lua.PrettyPrinter: instance LPretty Binop
- Language.Lua.PrettyPrinter: instance LPretty Block
- Language.Lua.PrettyPrinter: instance LPretty Exp
- Language.Lua.PrettyPrinter: instance LPretty FunArg
- Language.Lua.PrettyPrinter: instance LPretty FunBody
- Language.Lua.PrettyPrinter: instance LPretty FunCall
- Language.Lua.PrettyPrinter: instance LPretty FunDef
- Language.Lua.PrettyPrinter: instance LPretty FunName
- Language.Lua.PrettyPrinter: instance LPretty PrefixExp
- Language.Lua.PrettyPrinter: instance LPretty Stat
- Language.Lua.PrettyPrinter: instance LPretty Table
- Language.Lua.PrettyPrinter: instance LPretty TableField
- Language.Lua.PrettyPrinter: instance LPretty Unop
- Language.Lua.PrettyPrinter: instance LPretty Var
- Language.Lua.Types: instance Eq Binop
- Language.Lua.Types: instance Eq Block
- Language.Lua.Types: instance Eq Exp
- Language.Lua.Types: instance Eq FunArg
- Language.Lua.Types: instance Eq FunBody
- Language.Lua.Types: instance Eq FunCall
- Language.Lua.Types: instance Eq FunDef
- Language.Lua.Types: instance Eq FunName
- Language.Lua.Types: instance Eq PrefixExp
- Language.Lua.Types: instance Eq Stat
- Language.Lua.Types: instance Eq Table
- Language.Lua.Types: instance Eq TableField
- Language.Lua.Types: instance Eq Unop
- Language.Lua.Types: instance Eq Var
- Language.Lua.Types: instance Show Binop
- Language.Lua.Types: instance Show Block
- Language.Lua.Types: instance Show Exp
- Language.Lua.Types: instance Show FunArg
- Language.Lua.Types: instance Show FunBody
- Language.Lua.Types: instance Show FunCall
- Language.Lua.Types: instance Show FunDef
- Language.Lua.Types: instance Show FunName
- Language.Lua.Types: instance Show PrefixExp
- Language.Lua.Types: instance Show Stat
- Language.Lua.Types: instance Show Table
- Language.Lua.Types: instance Show TableField
- Language.Lua.Types: instance Show Unop
- Language.Lua.Types: instance Show Var
- Language.Lua.Types: type Name = String
+ Language.Lua.Parser: instance Eq a => Eq (PrimaryExp a)
+ Language.Lua.Parser: instance Eq a => Eq (SuffixExp a)
+ Language.Lua.Parser: instance Eq a => Eq (SuffixedExp a)
+ Language.Lua.Parser: instance Show a => Show (PrimaryExp a)
+ Language.Lua.Parser: instance Show a => Show (SuffixExp a)
+ Language.Lua.Parser: instance Show a => Show (SuffixedExp a)
+ Language.Lua.PrettyPrinter: instance LPretty (Binop a)
+ Language.Lua.PrettyPrinter: instance LPretty (Block a)
+ Language.Lua.PrettyPrinter: instance LPretty (Exp a)
+ Language.Lua.PrettyPrinter: instance LPretty (FunArg a)
+ Language.Lua.PrettyPrinter: instance LPretty (FunBody a)
+ Language.Lua.PrettyPrinter: instance LPretty (FunCall a)
+ Language.Lua.PrettyPrinter: instance LPretty (FunDef a)
+ Language.Lua.PrettyPrinter: instance LPretty (FunName a)
+ Language.Lua.PrettyPrinter: instance LPretty (Name a)
+ Language.Lua.PrettyPrinter: instance LPretty (PrefixExp a)
+ Language.Lua.PrettyPrinter: instance LPretty (Stat a)
+ Language.Lua.PrettyPrinter: instance LPretty (Table a)
+ Language.Lua.PrettyPrinter: instance LPretty (TableField a)
+ Language.Lua.PrettyPrinter: instance LPretty (Unop a)
+ Language.Lua.PrettyPrinter: instance LPretty (Var a)
+ Language.Lua.Types: VarName :: a -> (Name a) -> Var a
+ Language.Lua.Types: amap :: Annotated ast => (l -> l) -> ast l -> ast l
+ Language.Lua.Types: ann :: Annotated ast => ast l -> l
+ Language.Lua.Types: class Functor ast => Annotated ast
+ Language.Lua.Types: data Name a
+ Language.Lua.Types: instance Annotated Binop
+ Language.Lua.Types: instance Annotated Block
+ Language.Lua.Types: instance Annotated Exp
+ Language.Lua.Types: instance Annotated FunArg
+ Language.Lua.Types: instance Annotated FunBody
+ Language.Lua.Types: instance Annotated FunCall
+ Language.Lua.Types: instance Annotated FunDef
+ Language.Lua.Types: instance Annotated FunName
+ Language.Lua.Types: instance Annotated PrefixExp
+ Language.Lua.Types: instance Annotated Stat
+ Language.Lua.Types: instance Annotated Table
+ Language.Lua.Types: instance Annotated TableField
+ Language.Lua.Types: instance Annotated Unop
+ Language.Lua.Types: instance Annotated Var
+ Language.Lua.Types: instance Eq a => Eq (Binop a)
+ Language.Lua.Types: instance Eq a => Eq (Block a)
+ Language.Lua.Types: instance Eq a => Eq (Exp a)
+ Language.Lua.Types: instance Eq a => Eq (FunArg a)
+ Language.Lua.Types: instance Eq a => Eq (FunBody a)
+ Language.Lua.Types: instance Eq a => Eq (FunCall a)
+ Language.Lua.Types: instance Eq a => Eq (FunDef a)
+ Language.Lua.Types: instance Eq a => Eq (FunName a)
+ Language.Lua.Types: instance Eq a => Eq (Name a)
+ Language.Lua.Types: instance Eq a => Eq (PrefixExp a)
+ Language.Lua.Types: instance Eq a => Eq (Stat a)
+ Language.Lua.Types: instance Eq a => Eq (Table a)
+ Language.Lua.Types: instance Eq a => Eq (TableField a)
+ Language.Lua.Types: instance Eq a => Eq (Unop a)
+ Language.Lua.Types: instance Eq a => Eq (Var a)
+ Language.Lua.Types: instance Functor Binop
+ Language.Lua.Types: instance Functor Block
+ Language.Lua.Types: instance Functor Exp
+ Language.Lua.Types: instance Functor FunArg
+ Language.Lua.Types: instance Functor FunBody
+ Language.Lua.Types: instance Functor FunCall
+ Language.Lua.Types: instance Functor FunDef
+ Language.Lua.Types: instance Functor FunName
+ Language.Lua.Types: instance Functor Name
+ Language.Lua.Types: instance Functor PrefixExp
+ Language.Lua.Types: instance Functor Stat
+ Language.Lua.Types: instance Functor Table
+ Language.Lua.Types: instance Functor TableField
+ Language.Lua.Types: instance Functor Unop
+ Language.Lua.Types: instance Functor Var
+ Language.Lua.Types: instance Show a => Show (Binop a)
+ Language.Lua.Types: instance Show a => Show (Block a)
+ Language.Lua.Types: instance Show a => Show (Exp a)
+ Language.Lua.Types: instance Show a => Show (FunArg a)
+ Language.Lua.Types: instance Show a => Show (FunBody a)
+ Language.Lua.Types: instance Show a => Show (FunCall a)
+ Language.Lua.Types: instance Show a => Show (FunDef a)
+ Language.Lua.Types: instance Show a => Show (FunName a)
+ Language.Lua.Types: instance Show a => Show (Name a)
+ Language.Lua.Types: instance Show a => Show (PrefixExp a)
+ Language.Lua.Types: instance Show a => Show (Stat a)
+ Language.Lua.Types: instance Show a => Show (Table a)
+ Language.Lua.Types: instance Show a => Show (TableField a)
+ Language.Lua.Types: instance Show a => Show (Unop a)
+ Language.Lua.Types: instance Show a => Show (Var a)
- Language.Lua: Assign :: [Var] -> [Exp] -> Stat
+ Language.Lua: Assign :: a -> [Var a] -> [Exp a] -> Stat a
- Language.Lua: Binop :: Binop -> Exp -> Exp -> Exp
+ Language.Lua: Binop :: a -> (Binop a) -> (Exp a) -> (Exp a) -> Exp a
- Language.Lua: Block :: [Stat] -> (Maybe [Exp]) -> Block
+ Language.Lua: Block :: a -> [Stat a] -> (Maybe [Exp a]) -> Block a
- Language.Lua: Bool :: Bool -> Exp
+ Language.Lua: Bool :: a -> Bool -> Exp a
- Language.Lua: Break :: Stat
+ Language.Lua: Break :: a -> Stat a
- Language.Lua: Do :: Block -> Stat
+ Language.Lua: Do :: a -> (Block a) -> Stat a
- Language.Lua: EFunDef :: FunDef -> Exp
+ Language.Lua: EFunDef :: a -> (FunDef a) -> Exp a
- Language.Lua: EmptyStat :: Stat
+ Language.Lua: EmptyStat :: a -> Stat a
- Language.Lua: ForIn :: [Name] -> [Exp] -> Block -> Stat
+ Language.Lua: ForIn :: a -> [Name a] -> [Exp a] -> (Block a) -> Stat a
- Language.Lua: ForRange :: Name -> Exp -> Exp -> (Maybe Exp) -> Block -> Stat
+ Language.Lua: ForRange :: a -> (Name a) -> (Exp a) -> (Exp a) -> (Maybe (Exp a)) -> (Block a) -> Stat a
- Language.Lua: FunAssign :: FunName -> FunBody -> Stat
+ Language.Lua: FunAssign :: a -> (FunName a) -> (FunBody a) -> Stat a
- Language.Lua: FunCall :: FunCall -> Stat
+ Language.Lua: FunCall :: a -> (FunCall a) -> Stat a
- Language.Lua: Goto :: Name -> Stat
+ Language.Lua: Goto :: a -> (Name a) -> Stat a
- Language.Lua: If :: [(Exp, Block)] -> (Maybe Block) -> Stat
+ Language.Lua: If :: a -> [(Exp a, Block a)] -> (Maybe (Block a)) -> Stat a
- Language.Lua: Label :: Name -> Stat
+ Language.Lua: Label :: a -> (Name a) -> Stat a
- Language.Lua: LocalAssign :: [Name] -> (Maybe [Exp]) -> Stat
+ Language.Lua: LocalAssign :: a -> [Name a] -> (Maybe [Exp a]) -> Stat a
- Language.Lua: LocalFunAssign :: Name -> FunBody -> Stat
+ Language.Lua: LocalFunAssign :: a -> (Name a) -> (FunBody a) -> Stat a
- Language.Lua: Nil :: Exp
+ Language.Lua: Nil :: a -> Exp a
- Language.Lua: Number :: String -> Exp
+ Language.Lua: Number :: a -> String -> Exp a
- Language.Lua: PrefixExp :: PrefixExp -> Exp
+ Language.Lua: PrefixExp :: a -> (PrefixExp a) -> Exp a
- Language.Lua: Repeat :: Block -> Exp -> Stat
+ Language.Lua: Repeat :: a -> (Block a) -> (Exp a) -> Stat a
- Language.Lua: String :: String -> Exp
+ Language.Lua: String :: a -> String -> Exp a
- Language.Lua: TableConst :: Table -> Exp
+ Language.Lua: TableConst :: a -> (Table a) -> Exp a
- Language.Lua: Unop :: Unop -> Exp -> Exp
+ Language.Lua: Unop :: a -> (Unop a) -> (Exp a) -> Exp a
- Language.Lua: Vararg :: Exp
+ Language.Lua: Vararg :: a -> Exp a
- Language.Lua: While :: Exp -> Block -> Stat
+ Language.Lua: While :: a -> (Exp a) -> (Block a) -> Stat a
- Language.Lua: chunk :: Parser Block
+ Language.Lua: chunk :: Parser (Block SourcePos)
- Language.Lua: data Block
+ Language.Lua: data Block a
- Language.Lua: data Exp
+ Language.Lua: data Exp a
- Language.Lua: data Stat
+ Language.Lua: data Stat a
- Language.Lua: exp :: Parser Exp
+ Language.Lua: exp :: Parser (Exp SourcePos)
- Language.Lua: parseFile :: FilePath -> IO (Either ParseError Block)
+ Language.Lua: parseFile :: FilePath -> IO (Either ParseError (Block SourcePos))
- Language.Lua: stat :: Parser Stat
+ Language.Lua: stat :: Parser (Stat SourcePos)
- Language.Lua.Parser: chunk :: Parser Block
+ Language.Lua.Parser: chunk :: Parser (Block SourcePos)
- Language.Lua.Parser: exp :: Parser Exp
+ Language.Lua.Parser: exp :: Parser (Exp SourcePos)
- Language.Lua.Parser: parseFile :: FilePath -> IO (Either ParseError Block)
+ Language.Lua.Parser: parseFile :: FilePath -> IO (Either ParseError (Block SourcePos))
- Language.Lua.Parser: stat :: Parser Stat
+ Language.Lua.Parser: stat :: Parser (Stat SourcePos)
- Language.Lua.Types: Add :: Binop
+ Language.Lua.Types: Add :: a -> Binop a
- Language.Lua.Types: And :: Binop
+ Language.Lua.Types: And :: a -> Binop a
- Language.Lua.Types: Args :: [Exp] -> FunArg
+ Language.Lua.Types: Args :: a -> [Exp a] -> FunArg a
- Language.Lua.Types: Assign :: [Var] -> [Exp] -> Stat
+ Language.Lua.Types: Assign :: a -> [Var a] -> [Exp a] -> Stat a
- Language.Lua.Types: Binop :: Binop -> Exp -> Exp -> Exp
+ Language.Lua.Types: Binop :: a -> (Binop a) -> (Exp a) -> (Exp a) -> Exp a
- Language.Lua.Types: Block :: [Stat] -> (Maybe [Exp]) -> Block
+ Language.Lua.Types: Block :: a -> [Stat a] -> (Maybe [Exp a]) -> Block a
- Language.Lua.Types: Bool :: Bool -> Exp
+ Language.Lua.Types: Bool :: a -> Bool -> Exp a
- Language.Lua.Types: Break :: Stat
+ Language.Lua.Types: Break :: a -> Stat a
- Language.Lua.Types: Concat :: Binop
+ Language.Lua.Types: Concat :: a -> Binop a
- Language.Lua.Types: Div :: Binop
+ Language.Lua.Types: Div :: a -> Binop a
- Language.Lua.Types: Do :: Block -> Stat
+ Language.Lua.Types: Do :: a -> (Block a) -> Stat a
- Language.Lua.Types: EFunDef :: FunDef -> Exp
+ Language.Lua.Types: EFunDef :: a -> (FunDef a) -> Exp a
- Language.Lua.Types: EQ :: Binop
+ Language.Lua.Types: EQ :: a -> Binop a
- Language.Lua.Types: EmptyStat :: Stat
+ Language.Lua.Types: EmptyStat :: a -> Stat a
- Language.Lua.Types: Exp :: Binop
+ Language.Lua.Types: Exp :: a -> Binop a
- Language.Lua.Types: ExpField :: Exp -> Exp -> TableField
+ Language.Lua.Types: ExpField :: a -> (Exp a) -> (Exp a) -> TableField a
- Language.Lua.Types: Field :: Exp -> TableField
+ Language.Lua.Types: Field :: a -> (Exp a) -> TableField a
- Language.Lua.Types: ForIn :: [Name] -> [Exp] -> Block -> Stat
+ Language.Lua.Types: ForIn :: a -> [Name a] -> [Exp a] -> (Block a) -> Stat a
- Language.Lua.Types: ForRange :: Name -> Exp -> Exp -> (Maybe Exp) -> Block -> Stat
+ Language.Lua.Types: ForRange :: a -> (Name a) -> (Exp a) -> (Exp a) -> (Maybe (Exp a)) -> (Block a) -> Stat a
- Language.Lua.Types: FunAssign :: FunName -> FunBody -> Stat
+ Language.Lua.Types: FunAssign :: a -> (FunName a) -> (FunBody a) -> Stat a
- Language.Lua.Types: FunBody :: [Name] -> Bool -> Block -> FunBody
+ Language.Lua.Types: FunBody :: a -> [Name a] -> (Maybe a) -> (Block a) -> FunBody a
- Language.Lua.Types: FunCall :: FunCall -> Stat
+ Language.Lua.Types: FunCall :: a -> (FunCall a) -> Stat a
- Language.Lua.Types: FunDef :: FunBody -> FunDef
+ Language.Lua.Types: FunDef :: a -> (FunBody a) -> FunDef a
- Language.Lua.Types: FunName :: Name -> (Maybe Name) -> [Name] -> FunName
+ Language.Lua.Types: FunName :: a -> (Name a) -> [Name a] -> (Maybe (Name a)) -> FunName a
- Language.Lua.Types: GT :: Binop
+ Language.Lua.Types: GT :: a -> Binop a
- Language.Lua.Types: GTE :: Binop
+ Language.Lua.Types: GTE :: a -> Binop a
- Language.Lua.Types: Goto :: Name -> Stat
+ Language.Lua.Types: Goto :: a -> (Name a) -> Stat a
- Language.Lua.Types: If :: [(Exp, Block)] -> (Maybe Block) -> Stat
+ Language.Lua.Types: If :: a -> [(Exp a, Block a)] -> (Maybe (Block a)) -> Stat a
- Language.Lua.Types: LT :: Binop
+ Language.Lua.Types: LT :: a -> Binop a
- Language.Lua.Types: LTE :: Binop
+ Language.Lua.Types: LTE :: a -> Binop a
- Language.Lua.Types: Label :: Name -> Stat
+ Language.Lua.Types: Label :: a -> (Name a) -> Stat a
- Language.Lua.Types: Len :: Unop
+ Language.Lua.Types: Len :: a -> Unop a
- Language.Lua.Types: LocalAssign :: [Name] -> (Maybe [Exp]) -> Stat
+ Language.Lua.Types: LocalAssign :: a -> [Name a] -> (Maybe [Exp a]) -> Stat a
- Language.Lua.Types: LocalFunAssign :: Name -> FunBody -> Stat
+ Language.Lua.Types: LocalFunAssign :: a -> (Name a) -> (FunBody a) -> Stat a
- Language.Lua.Types: MethodCall :: PrefixExp -> Name -> FunArg -> FunCall
+ Language.Lua.Types: MethodCall :: a -> (PrefixExp a) -> (Name a) -> (FunArg a) -> FunCall a
- Language.Lua.Types: Mod :: Binop
+ Language.Lua.Types: Mod :: a -> Binop a
- Language.Lua.Types: Mul :: Binop
+ Language.Lua.Types: Mul :: a -> Binop a
- Language.Lua.Types: NEQ :: Binop
+ Language.Lua.Types: NEQ :: a -> Binop a
- Language.Lua.Types: Name :: Name -> Var
+ Language.Lua.Types: Name :: a -> String -> Name a
- Language.Lua.Types: NamedField :: Name -> Exp -> TableField
+ Language.Lua.Types: NamedField :: a -> (Name a) -> (Exp a) -> TableField a
- Language.Lua.Types: Neg :: Unop
+ Language.Lua.Types: Neg :: a -> Unop a
- Language.Lua.Types: Nil :: Exp
+ Language.Lua.Types: Nil :: a -> Exp a
- Language.Lua.Types: NormalFunCall :: PrefixExp -> FunArg -> FunCall
+ Language.Lua.Types: NormalFunCall :: a -> (PrefixExp a) -> (FunArg a) -> FunCall a
- Language.Lua.Types: Not :: Unop
+ Language.Lua.Types: Not :: a -> Unop a
- Language.Lua.Types: Number :: String -> Exp
+ Language.Lua.Types: Number :: a -> String -> Exp a
- Language.Lua.Types: Or :: Binop
+ Language.Lua.Types: Or :: a -> Binop a
- Language.Lua.Types: PEFunCall :: FunCall -> PrefixExp
+ Language.Lua.Types: PEFunCall :: a -> (FunCall a) -> PrefixExp a
- Language.Lua.Types: PEVar :: Var -> PrefixExp
+ Language.Lua.Types: PEVar :: a -> (Var a) -> PrefixExp a
- Language.Lua.Types: Paren :: Exp -> PrefixExp
+ Language.Lua.Types: Paren :: a -> (Exp a) -> PrefixExp a
- Language.Lua.Types: PrefixExp :: PrefixExp -> Exp
+ Language.Lua.Types: PrefixExp :: a -> (PrefixExp a) -> Exp a
- Language.Lua.Types: Repeat :: Block -> Exp -> Stat
+ Language.Lua.Types: Repeat :: a -> (Block a) -> (Exp a) -> Stat a
- Language.Lua.Types: Select :: PrefixExp -> Exp -> Var
+ Language.Lua.Types: Select :: a -> (PrefixExp a) -> (Exp a) -> Var a
- Language.Lua.Types: SelectName :: PrefixExp -> Name -> Var
+ Language.Lua.Types: SelectName :: a -> (PrefixExp a) -> (Name a) -> Var a
- Language.Lua.Types: String :: String -> Exp
+ Language.Lua.Types: String :: a -> String -> Exp a
- Language.Lua.Types: StringArg :: String -> FunArg
+ Language.Lua.Types: StringArg :: a -> String -> FunArg a
- Language.Lua.Types: Sub :: Binop
+ Language.Lua.Types: Sub :: a -> Binop a
- Language.Lua.Types: Table :: [TableField] -> Table
+ Language.Lua.Types: Table :: a -> [TableField a] -> Table a
- Language.Lua.Types: TableArg :: Table -> FunArg
+ Language.Lua.Types: TableArg :: a -> (Table a) -> FunArg a
- Language.Lua.Types: TableConst :: Table -> Exp
+ Language.Lua.Types: TableConst :: a -> (Table a) -> Exp a
- Language.Lua.Types: Unop :: Unop -> Exp -> Exp
+ Language.Lua.Types: Unop :: a -> (Unop a) -> (Exp a) -> Exp a
- Language.Lua.Types: Vararg :: Exp
+ Language.Lua.Types: Vararg :: a -> Exp a
- Language.Lua.Types: While :: Exp -> Block -> Stat
+ Language.Lua.Types: While :: a -> (Exp a) -> (Block a) -> Stat a
- Language.Lua.Types: data Binop
+ Language.Lua.Types: data Binop a
- Language.Lua.Types: data Block
+ Language.Lua.Types: data Block a
- Language.Lua.Types: data Exp
+ Language.Lua.Types: data Exp a
- Language.Lua.Types: data FunArg
+ Language.Lua.Types: data FunArg a
- Language.Lua.Types: data FunBody
+ Language.Lua.Types: data FunBody a
- Language.Lua.Types: data FunCall
+ Language.Lua.Types: data FunCall a
- Language.Lua.Types: data FunDef
+ Language.Lua.Types: data FunDef a
- Language.Lua.Types: data FunName
+ Language.Lua.Types: data FunName a
- Language.Lua.Types: data PrefixExp
+ Language.Lua.Types: data PrefixExp a
- Language.Lua.Types: data Stat
+ Language.Lua.Types: data Stat a
- Language.Lua.Types: data Table
+ Language.Lua.Types: data Table a
- Language.Lua.Types: data TableField
+ Language.Lua.Types: data TableField a
- Language.Lua.Types: data Unop
+ Language.Lua.Types: data Unop a
- Language.Lua.Types: data Var
+ Language.Lua.Types: data Var a
Files
- language-lua.cabal +7/−1
- src/Language/Lua/Lexer.x +2/−2
- src/Language/Lua/Parser.hs +187/−156
- src/Language/Lua/PrettyPrinter.hs +88/−82
- src/Language/Lua/Types.hs +245/−69
language-lua.cabal view
@@ -1,6 +1,12 @@ Name: language-lua Description: Lua 5.2 lexer, parser and pretty-printer.-Version: 0.1.7+ .+ Changelog:+ .+ \0.2.0:+ .+ - Syntax tree is annotated. All parsers(`parseText`, `parseFile`) annotate resulting tree with source positions.+Version: 0.2.0 Synopsis: Lua parser and pretty-printer Homepage: http://github.com/osa1/language-lua Bug-reports: http://github.com/osa1/language-lua/issues
src/Language/Lua/Lexer.x view
@@ -27,8 +27,8 @@ $longstr = \0-\255 -- valid character in a long string -- escape characters-@charescd = '\\' ([ntvbrfaeE\\\?\"] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)-@charescs = '\\' ([ntvbrfaeE\\\?\'] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)+@charescd = \\ ([ntvbrfaeE\\\?\"] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)+@charescs = \\ ([ntvbrfaeE\\\?\'] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+) @digits = $digit+ @hexdigits = $hexdigit+
src/Language/Lua/Parser.hs view
@@ -20,16 +20,16 @@ import Text.Parsec.LTok import Text.Parsec.Expr import Control.Applicative ((<*), (<$>), (<*>))-import Control.Monad (void, liftM)+import Control.Monad (liftM) -- | Runs Lua lexer before parsing. Use @parseText stat@ to parse -- statements, and @parseText exp@ to parse expressions. parseText :: Parsec [LTok] () a -> String -> Either ParseError a-parseText p s = parse p "lua" (llex s)+parseText p s = parse p "<string>" (llex s) -- | Parse a Lua file. You can use @parseText chunk@ to parse a file from a string.-parseFile :: FilePath -> IO (Either ParseError Block)-parseFile = liftM (parseText chunk) . readFile+parseFile :: FilePath -> IO (Either ParseError (Block SourcePos))+parseFile path = parse chunk path . llex <$> readFile path parens :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a parens = between (tok LTokLParen) (tok LTokRParen)@@ -37,210 +37,233 @@ brackets :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a brackets = between (tok LTokLBracket) (tok LTokRBracket) -name :: Parser String-name = tokenValue <$> anyIdent+name :: Parser (Name SourcePos)+name = do+ pos <- getPosition+ str <- tokenValue <$> anyIdent+ return $ Name pos str number :: Parser String number = tokenValue <$> anyNum -data PrimaryExp- = PName Name- | PParen Exp+data PrimaryExp a+ = PName a (Name a)+ | PParen a (Exp a) deriving (Show, Eq) -data SuffixedExp- = SuffixedExp PrimaryExp [SuffixExp]+data SuffixedExp a+ = SuffixedExp a (PrimaryExp a) [SuffixExp a] deriving (Show, Eq) -data SuffixExp- = SSelect Name- | SSelectExp Exp- | SSelectMethod Name FunArg- | SFunCall FunArg+data SuffixExp a+ = SSelect a (Name a)+ | SSelectExp a (Exp a)+ | SSelectMethod a (Name a) (FunArg a)+ | SFunCall a (FunArg a) deriving (Show, Eq) -primaryExp :: Parser PrimaryExp-primaryExp = (PName <$> name) <|> (liftM PParen $ parens exp)+primaryExp :: Parser (PrimaryExp SourcePos)+primaryExp = do+ pos <- getPosition+ PName pos <$> name <|> PParen pos <$> parens exp -suffixedExp :: Parser SuffixedExp-suffixedExp = SuffixedExp <$> primaryExp <*> many suffixExp+suffixedExp :: Parser (SuffixedExp SourcePos)+suffixedExp = SuffixedExp <$> getPosition <*> primaryExp <*> many suffixExp -suffixExp :: Parser SuffixExp+suffixExp :: Parser (SuffixExp SourcePos) suffixExp = selectName <|> selectExp <|> selectMethod <|> funarg- where selectName = SSelect <$> (tok LTokDot >> name)- selectExp = SSelectExp <$> brackets exp- selectMethod = tok LTokColon >> (SSelectMethod <$> name <*> funArg)- funarg = SFunCall <$> funArg+ where selectName = SSelect <$> getPosition <*> (tok LTokDot >> name)+ selectExp = SSelectExp <$> getPosition <*> brackets exp+ selectMethod = do+ pos <- getPosition+ tok LTokColon+ SSelectMethod pos <$> name <*> funArg+ funarg = SFunCall <$> getPosition <*> funArg -sexpToPexp :: SuffixedExp -> PrefixExp-sexpToPexp (SuffixedExp t r) = case r of- [] -> t'- (SSelect sname:xs) -> iter xs (PEVar (SelectName t' sname))- (SSelectExp sexp:xs) -> iter xs (PEVar (Select t' sexp))- (SSelectMethod mname args:xs) -> iter xs (PEFunCall (MethodCall t' mname args))- (SFunCall args:xs) -> iter xs (PEFunCall (NormalFunCall t' args))+sexpToPexp :: SuffixedExp SourcePos -> PrefixExp SourcePos+sexpToPexp (SuffixedExp _ t r) = case r of+ [] -> t'+ (SSelect pos sname:xs) -> iter xs (PEVar pos (SelectName pos t' sname))+ (SSelectExp pos sexp:xs) -> iter xs (PEVar pos (Select pos t' sexp))+ (SSelectMethod pos mname args:xs) -> iter xs (PEFunCall pos (MethodCall pos t' mname args))+ (SFunCall pos args:xs) -> iter xs (PEFunCall pos (NormalFunCall pos t' args)) - where t' :: PrefixExp+ where t' :: PrefixExp SourcePos t' = case t of- PName name -> PEVar (Name name)- PParen exp -> Paren exp+ PName pos name -> PEVar pos (VarName pos name)+ PParen pos exp -> Paren pos exp - iter :: [SuffixExp] -> PrefixExp -> PrefixExp- iter [] pe = pe- iter (SSelect sname:xs) pe = iter xs (PEVar (SelectName pe sname))- iter (SSelectExp sexp:xs) pe = iter xs (PEVar (Select pe sexp))- iter (SSelectMethod mname args:xs) pe = iter xs (PEFunCall (MethodCall pe mname args))- iter (SFunCall args:xs) pe = iter xs (PEFunCall (NormalFunCall pe args))+ iter :: [SuffixExp SourcePos] -> PrefixExp SourcePos -> PrefixExp SourcePos+ iter [] pe = pe+ iter (SSelect pos sname:xs) pe = iter xs (PEVar pos (SelectName pos pe sname))+ iter (SSelectExp pos sexp:xs) pe = iter xs (PEVar pos (Select pos pe sexp))+ iter (SSelectMethod pos mname args:xs) pe = iter xs (PEFunCall pos (MethodCall pos pe mname args))+ iter (SFunCall pos args:xs) pe = iter xs (PEFunCall pos (NormalFunCall pos pe args)) -- TODO: improve error messages.-sexpToVar :: SuffixedExp -> Parser Var-sexpToVar (SuffixedExp (PName name) []) = return (Name name)-sexpToVar (SuffixedExp _ []) = fail "syntax error"+sexpToVar :: SuffixedExp SourcePos -> Parser (Var SourcePos)+sexpToVar (SuffixedExp pos (PName _ name) []) = return (VarName pos name)+sexpToVar (SuffixedExp _ _ []) = fail "syntax error" sexpToVar sexp = case sexpToPexp sexp of- PEVar var -> return var+ PEVar _ var -> return var _ -> fail "syntax error" -sexpToFunCall :: SuffixedExp -> Parser FunCall-sexpToFunCall (SuffixedExp _ []) = fail "syntax error"+sexpToFunCall :: SuffixedExp SourcePos -> Parser (FunCall SourcePos)+sexpToFunCall (SuffixedExp _ _ []) = fail "syntax error" sexpToFunCall sexp = case sexpToPexp sexp of- PEFunCall funcall -> return funcall+ PEFunCall _ funcall -> return funcall _ -> fail "syntax error" -var :: Parser Var+var :: Parser (Var SourcePos) var = suffixedExp >>= sexpToVar -funCall :: Parser FunCall+funCall :: Parser (FunCall SourcePos) funCall = suffixedExp >>= sexpToFunCall stringlit :: Parser String stringlit = tokenValue <$> string -funArg :: Parser FunArg-funArg = tableArg <|> stringArg <|> parlist- where tableArg = TableArg <$> table- stringArg = StringArg <$> stringlit- parlist = parens (do exps <- exp `sepBy` tok LTokComma- return $ Args exps)+funArg :: Parser (FunArg SourcePos)+funArg = tableArg <|> stringArg <|> arglist+ where tableArg = TableArg <$> getPosition <*> table+ stringArg = StringArg <$> getPosition <*> stringlit+ arglist = do+ pos <- getPosition+ parens (do exps <- exp `sepBy` tok LTokComma+ return $ Args pos exps) -funBody :: Parser FunBody+funBody :: Parser (FunBody SourcePos) funBody = do- (params, vararg) <- parlist+ pos <- getPosition+ (params, vararg) <- arglist body <- block tok LTokEnd- return $ FunBody params vararg body+ return $ FunBody pos params vararg body - where parlist = parens $ do+ where lastarg = do+ pos <- getPosition+ arg <- optionMaybe (tok LTokEllipsis <|> tok LTokComma)+ case arg of+ Just LTokEllipsis -> return (Just pos)+ _ -> return Nothing++ arglist = parens $ do vars <- name `sepEndBy` tok LTokComma- vararg <- optionMaybe (tok LTokEllipsis <|> tok LTokComma)- return $ case vararg of- Nothing -> (vars, False)- Just LTokEllipsis -> (vars, True)- _ -> (vars, False)+ vararg <- lastarg+ return (vars, vararg) -block :: Parser Block+block :: Parser (Block SourcePos) block = do+ pos <- getPosition stats <- many stat ret <- optionMaybe retstat- return $ Block stats ret+ return $ Block pos stats ret -retstat :: Parser [Exp]+retstat :: Parser [Exp SourcePos] retstat = do tok LTokReturn exps <- exp `sepBy` tok LTokComma optional (tok LTokSemic) return exps -tableField :: Parser TableField+tableField :: Parser (TableField SourcePos) tableField = choice [ expField, try namedField, field ]- where expField :: Parser TableField+ where expField :: Parser (TableField SourcePos) expField = do+ pos <- getPosition e1 <- brackets exp tok LTokAssign e2 <- exp- return $ ExpField e1 e2+ return $ ExpField pos e1 e2 - namedField :: Parser TableField+ namedField :: Parser (TableField SourcePos) namedField = do+ pos <- getPosition name' <- name tok LTokAssign val <- exp- return $ NamedField name' val+ return $ NamedField pos name' val - field :: Parser TableField- field = Field <$> exp+ field :: Parser (TableField SourcePos)+ field = Field <$> getPosition <*> exp -table :: Parser Table-table = between (tok LTokLBrace)- (tok LTokRBrace)- (do fields <- tableField `sepEndBy` fieldSep- return $ Table fields)+table :: Parser (Table SourcePos)+table = do+ pos <- getPosition+ between (tok LTokLBrace)+ (tok LTokRBrace)+ (do fields <- tableField `sepEndBy` fieldSep+ return $ Table pos fields) where fieldSep = tok LTokComma <|> tok LTokSemic ----------------------------------------------------------------------- ---- Expressions nilExp, boolExp, numberExp, stringExp, varargExp, fundefExp,- prefixexpExp, tableconstExp, opExp, exp, exp' :: Parser Exp+ prefixexpExp, tableconstExp, exp, exp' :: Parser (Exp SourcePos) -nilExp = tok LTokNil >> return Nil+nilExp = (Nil <$> getPosition) <* tok LTokNil -boolExp = (tok LTokTrue >> return (Bool True)) <|>- (tok LTokFalse >> return (Bool False))+boolExp = do+ pos <- getPosition+ tOrF <- tok LTokTrue <|> tok LTokFalse+ return $ Bool pos (tOrF == LTokTrue) -numberExp = Number <$> number+numberExp = Number <$> getPosition <*> number -stringExp = String <$> stringlit+stringExp = String <$> getPosition <*> stringlit -varargExp = tok LTokEllipsis >> return Vararg+varargExp = (Vararg <$> getPosition) <* tok LTokEllipsis fundefExp = do+ pos <- getPosition tok LTokFunction body <- funBody- return $ EFunDef (FunDef body)--prefixexpExp = PrefixExp <$> (liftM sexpToPexp suffixedExp)+ return $ EFunDef pos (FunDef (ann body) body) -tableconstExp = TableConst <$> table+prefixexpExp = PrefixExp <$> getPosition <*> liftM sexpToPexp suffixedExp -binary :: Monad m => LToken -> (a -> a -> a) -> Assoc -> Operator [LTok] u m a-binary op fun = Infix (tok op >> return fun)+tableconstExp = TableConst <$> getPosition <*> table -prefix :: Monad m => LToken -> (a -> a) -> Operator [LTok] u m a-prefix op fun = Prefix (tok op >> return fun)+binary :: Monad m => LToken -> (SourcePos -> a -> a -> a) -> Assoc -> Operator [LTok] u m a+binary op fun = Infix (do pos <- getPosition; tok op; return $ fun pos) -opTable :: Monad m => [[Operator [LTok] u m Exp]]-opTable = [ [ binary LTokExp (Binop Exp) AssocRight ]- , [ prefix LTokNot (Unop Not)- , prefix LTokSh (Unop Len)- , prefix LTokMinus (Unop Neg)- ]- , [ binary LTokStar (Binop Mul) AssocLeft- , binary LTokSlash (Binop Div) AssocLeft- , binary LTokPercent (Binop Mod) AssocLeft- ]- , [ binary LTokPlus (Binop Add) AssocLeft- , binary LTokMinus (Binop Sub) AssocLeft- ]- , [ binary LTokDDot (Binop Concat) AssocRight ]- , [ binary LTokGT (Binop GT) AssocLeft- , binary LTokLT (Binop LT) AssocLeft- , binary LTokGEq (Binop GTE) AssocLeft- , binary LTokLEq (Binop LTE) AssocLeft- , binary LTokNotequal (Binop NEQ) AssocLeft- , binary LTokEqual (Binop EQ) AssocLeft- ]- , [ binary LTokAnd (Binop And) AssocLeft ]- , [ binary LTokOr (Binop Or) AssocLeft ]- ]+prefix :: Monad m => LToken -> (SourcePos -> a -> a) -> Operator [LTok] u m a+prefix op fun = Prefix (do pos <- getPosition; tok op; return $ fun pos) -opExp = buildExpressionParser opTable exp' <?> "opExp"+opTable :: Monad m => SourcePos -> [[Operator [LTok] u m (Exp SourcePos)]]+opTable pos = [ [ binary LTokExp (Binop pos . Exp) AssocRight ]+ , [ prefix LTokNot (Unop pos . Not)+ , prefix LTokSh (Unop pos . Len)+ , prefix LTokMinus (Unop pos . Neg)+ ]+ , [ binary LTokStar (Binop pos . Mul) AssocLeft+ , binary LTokSlash (Binop pos . Div) AssocLeft+ , binary LTokPercent (Binop pos . Mod) AssocLeft+ ]+ , [ binary LTokPlus (Binop pos . Add) AssocLeft+ , binary LTokMinus (Binop pos . Sub) AssocLeft+ ]+ , [ binary LTokDDot (Binop pos . Concat) AssocRight ]+ , [ binary LTokGT (Binop pos . GT) AssocLeft+ , binary LTokLT (Binop pos . LT) AssocLeft+ , binary LTokGEq (Binop pos . GTE) AssocLeft+ , binary LTokLEq (Binop pos . LTE) AssocLeft+ , binary LTokNotequal (Binop pos . NEQ) AssocLeft+ , binary LTokEqual (Binop pos . EQ) AssocLeft+ ]+ , [ binary LTokAnd (Binop pos . And) AssocLeft ]+ , [ binary LTokOr (Binop pos . Or) AssocLeft ]+ ]+opExp :: SourcePos -> Parser (Exp SourcePos)+opExp pos = buildExpressionParser (opTable pos) exp' <?> "opExp" exp' = choice [ nilExp, boolExp, numberExp, stringExp, varargExp, fundefExp, prefixexpExp, tableconstExp ] -- | Expression parser.-exp = choice [ opExp, nilExp, boolExp, numberExp, stringExp, varargExp,+exp = choice [ opExp =<< getPosition, nilExp, boolExp, numberExp, stringExp, varargExp, fundefExp, prefixexpExp, tableconstExp ] -----------------------------------------------------------------------@@ -248,69 +271,72 @@ emptyStat, assignStat, funCallStat, labelStat, breakStat, gotoStat, doStat, whileStat, repeatStat, ifStat, forRangeStat, forInStat,- funAssignStat, localFunAssignStat, localAssignStat, stat :: Parser Stat+ funAssignStat, localFunAssignStat, localAssignStat, stat :: Parser (Stat SourcePos) -emptyStat = void (tok LTokSemic) >> return EmptyStat+emptyStat = (EmptyStat <$> getPosition) <* tok LTokSemic assignStat = do+ pos <- getPosition vars <- var `sepBy` tok LTokComma tok LTokAssign exps <- exp `sepBy` tok LTokComma- return $ Assign vars exps+ return $ Assign pos vars exps -funCallStat = FunCall <$> funCall+funCallStat = FunCall <$> getPosition <*> funCall -labelStat = Label <$> label+labelStat = Label <$> getPosition <*> label where label = between (tok LTokDColon) (tok LTokDColon) name -breakStat = tok LTokBreak >> return Break+breakStat = (Break <$> getPosition) <* tok LTokBreak -gotoStat = Goto <$> (tok LTokGoto >> name)+gotoStat = Goto <$> getPosition <*> (tok LTokGoto >> name) -doStat = Do <$> between (tok LTokDo) (tok LTokEnd) block+doStat = Do <$> getPosition <*> between (tok LTokDo) (tok LTokEnd) block -whileStat =+whileStat = do+ pos <- getPosition between (tok LTokWhile) (tok LTokEnd) (do cond <- exp tok LTokDo body <- block- return $ While cond body)+ return $ While pos cond body) repeatStat = do+ pos <- getPosition tok LTokRepeat body <- block tok LTokUntil cond <- exp- return $ Repeat body cond+ return $ Repeat pos body cond -ifStat =+ifStat = do+ pos <- getPosition between (tok LTokIf) (tok LTokEnd) (do f <- ifPart conds <- many elseifPart l <- optionMaybe elsePart- return $ If (f:conds) l)+ return $ If pos (f:conds) l) - where ifPart :: Parser (Exp, Block)- ifPart = do- cond <- exp- tok LTokThen- body <- block- return (cond, body)+ where ifPart :: Parser (Exp SourcePos, Block SourcePos)+ ifPart = cond - elseifPart :: Parser (Exp, Block)- elseifPart = do- tok LTokElseIf+ elseifPart :: Parser (Exp SourcePos, Block SourcePos)+ elseifPart = tok LTokElseIf >> cond++ cond :: Parser (Exp SourcePos, Block SourcePos)+ cond = do cond <- exp tok LTokThen body <- block return (cond, body) - elsePart :: Parser Block+ elsePart :: Parser (Block SourcePos) elsePart = tok LTokElse >> block -forRangeStat =+forRangeStat = do+ pos <- getPosition between (tok LTokFor) (tok LTokEnd) (do name' <- name@@ -321,9 +347,10 @@ range <- optionMaybe $ tok LTokComma >> exp tok LTokDo body <- block- return $ ForRange name' start end range body)+ return $ ForRange pos name' start end range body) -forInStat =+forInStat = do+ pos <- getPosition between (tok LTokFor) (tok LTokEnd) (do names <- name `sepBy` tok LTokComma@@ -331,30 +358,34 @@ exps <- exp `sepBy` tok LTokComma tok LTokDo body <- block- return $ ForIn names exps body)+ return $ ForIn pos names exps body) funAssignStat = do+ pos <- getPosition tok LTokFunction name' <- funName body <- funBody- return $ FunAssign name' body- where funName :: Parser FunName- funName = FunName <$> name- <*> optionMaybe (tok LTokDot >> name)- <*> many (tok LTokColon >> name)+ return $ FunAssign pos name' body+ where funName :: Parser (FunName SourcePos)+ funName = FunName <$> getPosition+ <*> name+ <*> many (tok LTokDot >> name)+ <*> optionMaybe (tok LTokColon >> name) localFunAssignStat = do+ pos <- getPosition tok LTokLocal tok LTokFunction name' <- name body <- funBody- return $ LocalFunAssign name' body+ return $ LocalFunAssign pos name' body localAssignStat = do+ pos <- getPosition tok LTokLocal names <- name `sepBy` tok LTokComma rest <- optionMaybe $ tok LTokAssign >> exp `sepBy` tok LTokComma- return $ LocalAssign names rest+ return $ LocalAssign pos names rest -- | Statement parser. stat =@@ -376,5 +407,5 @@ ] -- | Lua file parser.-chunk :: Parser Block+chunk :: Parser (Block SourcePos) chunk = block <* tok LTokEof
src/Language/Lua/PrettyPrinter.hs view
@@ -30,60 +30,63 @@ pprint True = text "true" pprint False = text "false" -instance LPretty Exp where- pprint Nil = text "nil"- pprint (Bool s) = pprint s- pprint (Number n) = text n- pprint (String s) = dquotes (text s)- pprint Vararg = text "..."- pprint (EFunDef f) = pprint f- pprint (PrefixExp pe) = pprint pe- pprint (TableConst t) = pprint t- pprint (Binop op e1 e2) = pprint e1 <+> pprint op <+> pprint e2- pprint (Unop op e) = pprint op <> pprint e+instance LPretty (Name a) where+ pprint (Name _ s) = text s -instance LPretty Var where- pprint (Name n) = text n- pprint (Select pe e) = pprint pe <> brackets (pprint e)- pprint (SelectName pe name) = group (pprint pe <$$> (char '.' <> pprint name))+instance LPretty (Exp a) where+ pprint (Nil _) = text "nil"+ pprint (Bool _ s) = pprint s+ pprint (Number _ n) = text n+ pprint (String _ s) = dquotes (text s)+ pprint (Vararg _) = text "..."+ pprint (EFunDef _ f) = pprint f+ pprint (PrefixExp _ pe) = pprint pe+ pprint (TableConst _ t) = pprint t+ pprint (Binop _ op e1 e2) = pprint e1 <+> pprint op <+> pprint e2+ pprint (Unop _ op e) = pprint op <> pprint e -instance LPretty Binop where- pprint Add = char '+'- pprint Sub = char '-'- pprint Mul = char '*'- pprint Div = char '/'- pprint Exp = char '^'- pprint Mod = char '%'- pprint Concat = text ".."- pprint LT = char '<'- pprint LTE = text "<="- pprint GT = char '>'- pprint GTE = text ">="- pprint EQ = text "=="- pprint NEQ = text "~="- pprint And = text "and"- pprint Or = text "or"+instance LPretty (Var a) where+ pprint (VarName _ n) = pprint n+ pprint (Select _ pe e) = pprint pe <> brackets (pprint e)+ pprint (SelectName _ pe name) = group (pprint pe <$$> (char '.' <> pprint name)) -instance LPretty Unop where- pprint Neg = char '-'- pprint Not = text "not "- pprint Len = char '#'+instance LPretty (Binop a) where+ pprint Add{} = char '+'+ pprint Sub{} = char '-'+ pprint Mul{} = char '*'+ pprint Div{} = char '/'+ pprint Exp{} = char '^'+ pprint Mod{} = char '%'+ pprint Concat{} = text ".."+ pprint LT{} = char '<'+ pprint LTE{} = text "<="+ pprint GT{} = char '>'+ pprint GTE{} = text ">="+ pprint EQ{} = text "=="+ pprint NEQ{} = text "~="+ pprint And{} = text "and"+ pprint Or{} = text "or" -instance LPretty PrefixExp where- pprint (PEVar var) = pprint var- pprint (PEFunCall funcall) = pprint funcall- pprint (Paren e) = parens (pprint e)+instance LPretty (Unop a) where+ pprint Neg{} = char '-'+ pprint Not{} = text "not "+ pprint Len{} = char '#' -instance LPretty Table where- pprint (Table fields) = braces (nest 4 (cat (punctuate comma (map pprint fields))))+instance LPretty (PrefixExp a) where+ pprint (PEVar _ var) = pprint var+ pprint (PEFunCall _ funcall) = pprint funcall+ pprint (Paren _ e) = parens (pprint e) -instance LPretty TableField where- pprint (ExpField e1 e2) = brackets (pprint e1) <+> equals <+> pprint e2- pprint (NamedField name e) = pprint name <+> equals <+> pprint e- pprint (Field e) = pprint e+instance LPretty (Table a) where+ pprint (Table _ fields) = braces (nest 4 (cat (punctuate comma (map pprint fields)))) -instance LPretty Block where- pprint (Block stats ret)+instance LPretty (TableField a) where+ pprint (ExpField _ e1 e2) = brackets (pprint e1) <+> equals <+> pprint e2+ pprint (NamedField _ name e) = pprint name <+> equals <+> pprint e+ pprint (Field _ e) = pprint e++instance LPretty (Block a) where+ pprint (Block _ stats ret) = case stats of [] -> ret' _ -> (foldr (<$>) empty (map pprint stats)) <$> ret'@@ -91,56 +94,59 @@ Nothing -> empty Just e -> nest 2 (text "return" </> (intercalate comma (map pprint e))) -instance LPretty FunName where- pprint (FunName name s methods) = text name <> s' <> (intercalate colon (map pprint methods))- where s' = case s of- Nothing -> empty- Just s' -> char '.' <> text s'+instance LPretty (FunName a) where+ pprint (FunName _ name s methods) = cat (punctuate dot (map pprint $ name:s)) <> method'+ where method' = case methods of+ Nothing -> empty+ Just m' -> char ':' <> pprint m' -instance LPretty FunDef where- pprint (FunDef body) = pprint body+instance LPretty (FunDef a) where+ pprint (FunDef _ body) = pprint body -instance LPretty FunBody where+instance LPretty (FunBody a) where pprint funbody = pprintFunction Nothing funbody -pprintFunction :: Maybe Doc -> FunBody -> Doc-pprintFunction funname (FunBody args vararg block)+pprintFunction :: Maybe Doc -> FunBody a -> Doc+pprintFunction funname (FunBody _ args vararg block) = group (nest 4 (funhead <$> funbody) <$> end) where funhead = case funname of Nothing -> nest 2 (text "function" </> args') Just n -> nest 2 (text "function" </> n </> args')+ vararg' = case vararg of+ Nothing -> []+ Just pos -> [Name pos "..."] args' = parens (align (cat (punctuate (comma <> space)- (map pprint (args ++ if vararg then ["..."] else [])))))+ (map pprint (args ++ vararg'))))) funbody = pprint block end = text "end" -instance LPretty FunCall where- pprint (NormalFunCall pe arg) = group (nest 4 (pprint pe <$$> pprint arg))- pprint (MethodCall pe method arg) = group (nest 4 (pprint pe <$$> (colon <> text method) <$$> pprint arg))+instance LPretty (FunCall a) where+ pprint (NormalFunCall _ pe arg) = group (nest 4 (pprint pe <$$> pprint arg))+ pprint (MethodCall _ pe method arg) = group (nest 4 (pprint pe <$$> (colon <> pprint method) <$$> pprint arg)) -instance LPretty FunArg where- pprint (Args exps) = parens (nest 4 (cat (punctuate (comma <> space) (map pprint exps))))- pprint (TableArg t) = pprint t- pprint (StringArg s) = dquotes (text s)+instance LPretty (FunArg a) where+ pprint (Args _ exps) = parens (nest 4 (cat (punctuate (comma <> space) (map pprint exps))))+ pprint (TableArg _ t) = pprint t+ pprint (StringArg _ s) = dquotes (text s) -instance LPretty Stat where- pprint (Assign names vals)+instance LPretty (Stat a) where+ pprint (Assign _ names vals) = (intercalate comma (map pprint names)) <+> equals <+> (intercalate comma (map pprint vals))- pprint (FunCall funcall) = pprint funcall- pprint (Label name) = text "::" <> text name <> text "::"- pprint Break = text "break"- pprint (Goto name) = text "goto" <+> text name- pprint (Do block) = group (nest 4 (text "do" <$> pprint block) <$> text "end")- pprint (While guard e)+ pprint (FunCall _ funcall) = pprint funcall+ pprint (Label _ name) = text "::" <> pprint name <> text "::"+ pprint (Break _) = text "break"+ pprint (Goto _ name) = text "goto" <+> pprint name+ pprint (Do _ block) = group (nest 4 (text "do" <$> pprint block) <$> text "end")+ pprint (While _ guard e) = (nest 4 (text "while" <+> pprint guard <+> text "do" </> indent 4 (pprint e))) </> text "end"- pprint (Repeat block guard)+ pprint (Repeat _ block guard) = nest 4 (text "repeat" </> pprint block) </> (nest 4 (text "until" </> pprint guard)) - pprint (If cases elsePart) = group (printIf cases elsePart)+ pprint (If _ cases elsePart) = group (printIf cases elsePart) where printIf ((guard, block):xs) e = group (nest 4 (text "if" <+> pprint guard <+> text "then" <$> pprint block))@@ -154,25 +160,25 @@ <$> pprint block)) <$> printIf' xs e - pprint (ForRange name e1 e2 e3 block)- = text "for" <+> text name <> equals <> pprint e1 <> comma <> pprint e2 <> e3' <+> text "do"+ pprint (ForRange _ name e1 e2 e3 block)+ = text "for" <+> pprint name <> equals <> pprint e1 <> comma <> pprint e2 <> e3' <+> text "do" <$> indent 4 (pprint block) <$> text "end" where e3' = case e3 of Nothing -> empty Just e -> comma <> pprint e - pprint (ForIn names exps block)+ pprint (ForIn _ names exps block) = text "for" <+> (intercalate comma (map pprint names)) <+> text "in" <+> (intercalate comma (map pprint exps)) <+> text "do" <$> indent 4 (pprint block) <$> text "end" - pprint (FunAssign name body) = pprintFunction (Just (pprint name)) body- pprint (LocalFunAssign name body) = text "local" <+> pprintFunction (Just (pprint name)) body- pprint (LocalAssign names exps)+ pprint (FunAssign _ name body) = pprintFunction (Just (pprint name)) body+ pprint (LocalFunAssign _ name body) = text "local" <+> pprintFunction (Just (pprint name)) body+ pprint (LocalAssign _ names exps) = text "local" <+> (intercalate comma (map pprint names)) <+> equals <+> exps' where exps' = case exps of Nothing -> empty Just es -> intercalate comma (map pprint es)- pprint EmptyStat = empty+ pprint EmptyStat{} = empty
src/Language/Lua/Types.hs view
@@ -1,88 +1,264 @@ {-# OPTIONS_GHC -Wall #-}+{-# LANGUAGE DeriveFunctor #-} -- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.++-- Annotation implementation is inspired by haskell-src-exts.+ module Language.Lua.Types where -type Name = String+import Prelude hiding (LT, EQ, GT) -data Stat- = Assign [Var] [Exp] -- ^var1, var2 .. = exp1, exp2 ..- | FunCall FunCall -- ^function call- | Label Name -- ^label for goto- | Break -- ^break- | Goto Name -- ^goto label- | Do Block -- ^do .. end- | While Exp Block -- ^while .. do .. end- | Repeat Block Exp -- ^repeat .. until ..- | If [(Exp, Block)] (Maybe Block) -- ^if .. then .. [elseif ..] [else ..] end- | ForRange Name Exp Exp (Maybe Exp) Block -- ^for x=start, end [, step] do .. end- | ForIn [Name] [Exp] Block -- ^for x in .. do .. end- | FunAssign FunName FunBody -- ^function \<var\> (..) .. end- | LocalFunAssign Name FunBody -- ^local function \<var\> (..) .. end- | LocalAssign [Name] (Maybe [Exp]) -- ^local var1, var2 .. = exp1, exp2 ..- | EmptyStat -- ^/;/- deriving (Show, Eq)+data Name a = Name a String deriving (Show, Eq, Functor) -data Exp- = Nil- | Bool Bool- | Number String- | String String- | Vararg -- ^/.../- | EFunDef FunDef -- ^/function (..) .. end/- | PrefixExp PrefixExp- | TableConst Table -- ^table constructor- | Binop Binop Exp Exp -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/- | Unop Unop Exp -- ^unary operators, /- not #/- deriving (Show, Eq)+data Stat a+ = Assign a [Var a] [Exp a] -- ^var1, var2 .. = exp1, exp2 ..+ | FunCall a (FunCall a) -- ^function call+ | Label a (Name a) -- ^label for goto+ | Break a -- ^break+ | Goto a (Name a) -- ^goto label+ | Do a (Block a) -- ^do .. end+ | While a (Exp a) (Block a) -- ^while .. do .. end+ | Repeat a (Block a) (Exp a) -- ^repeat .. until ..+ | If a [(Exp a, Block a)] (Maybe (Block a)) -- ^if .. then .. [elseif ..] [else ..] end+ | ForRange a (Name a) (Exp a) (Exp a) (Maybe (Exp a)) (Block a) -- ^for x=start, end [, step] do .. end+ | ForIn a [Name a] [Exp a] (Block a) -- ^for x in .. do .. end+ | FunAssign a (FunName a) (FunBody a) -- ^function \<var\> (..) .. end+ | LocalFunAssign a (Name a) (FunBody a) -- ^local function \<var\> (..) .. end+ | LocalAssign a [Name a] (Maybe [Exp a]) -- ^local var1, var2 .. = exp1, exp2 ..+ | EmptyStat a -- ^/;/+ deriving (Show, Eq, Functor) -data Var- = Name Name -- ^variable- | Select PrefixExp Exp -- ^/table[exp]/- | SelectName PrefixExp Name -- ^/table.variable/- deriving (Show, Eq)+data Exp a+ = Nil a+ | Bool a Bool+ | Number a String+ | String a String+ | Vararg a -- ^/.../+ | EFunDef a (FunDef a) -- ^/function (..) .. end/+ | PrefixExp a (PrefixExp a)+ | TableConst a (Table a) -- ^table constructor+ | Binop a (Binop a) (Exp a) (Exp a) -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/+ | Unop a (Unop a) (Exp a) -- ^unary operators, /- not #/+ deriving (Show, Eq, Functor) -data Binop = Add | Sub | Mul | Div | Exp | Mod | Concat- | LT | LTE | GT | GTE | EQ | NEQ | And | Or- deriving (Show, Eq)+data Var a+ = VarName a (Name a) -- ^variable+ | Select a (PrefixExp a) (Exp a) -- ^/table[exp]/+ | SelectName a (PrefixExp a) (Name a) -- ^/table.variable/+ deriving (Show, Eq, Functor) -data Unop = Neg | Not | Len- deriving (Show, Eq)+data Binop a = Add a | Sub a | Mul a | Div a | Exp a | Mod a | Concat a+ | LT a | LTE a | GT a | GTE a | EQ a | NEQ a | And a | Or a+ deriving (Show, Eq, Functor) -data PrefixExp- = PEVar Var- | PEFunCall FunCall- | Paren Exp- deriving (Show, Eq)+data Unop a = Neg a | Not a | Len a+ deriving (Show, Eq, Functor) -data Table = Table [TableField] -- ^list of table fields- deriving (Show, Eq)+data PrefixExp a+ = PEVar a (Var a)+ | PEFunCall a (FunCall a)+ | Paren a (Exp a)+ deriving (Show, Eq, Functor) -data TableField- = ExpField Exp Exp -- ^/[exp] = exp/- | NamedField Name Exp -- ^/name = exp/- | Field Exp- deriving (Show, Eq)+data Table a = Table a [TableField a] -- ^list of table fields+ deriving (Show, Eq, Functor) +data TableField a+ = ExpField a (Exp a) (Exp a) -- ^/[exp] = exp/+ | NamedField a (Name a) (Exp a) -- ^/name = exp/+ | Field a (Exp a)+ deriving (Show, Eq, Functor)+ -- | A block is list of statements with optional return statement.-data Block = Block [Stat] (Maybe [Exp])- deriving (Show, Eq)+data Block a = Block a [Stat a] (Maybe [Exp a])+ deriving (Show, Eq, Functor) -data FunName = FunName Name (Maybe Name) [Name]- deriving (Show, Eq)+data FunName a = FunName a (Name a) [Name a] (Maybe (Name a))+ deriving (Show, Eq, Functor) -data FunDef = FunDef FunBody- deriving (Show, Eq)+data FunDef a = FunDef a (FunBody a)+ deriving (Show, Eq, Functor) -data FunBody = FunBody [Name] Bool Block -- ^(args, vararg predicate, block)- deriving (Show, Eq)+data FunBody a = FunBody a [Name a] (Maybe a) (Block a) -- ^(args, vararg, block)+ deriving (Show, Eq, Functor) -data FunCall- = NormalFunCall PrefixExp FunArg -- ^/prefixexp ( funarg )/- | MethodCall PrefixExp Name FunArg -- ^/prefixexp : name ( funarg )/- deriving (Show, Eq)+data FunCall a+ = NormalFunCall a (PrefixExp a) (FunArg a) -- ^/prefixexp ( funarg )/+ | MethodCall a (PrefixExp a) (Name a) (FunArg a) -- ^/prefixexp : name ( funarg )/+ deriving (Show, Eq, Functor) -data FunArg- = Args [Exp] -- ^list of args- | TableArg Table -- ^table constructor- | StringArg String -- ^string- deriving (Show, Eq)+data FunArg a+ = Args a [Exp a] -- ^list of args+ | TableArg a (Table a) -- ^table constructor+ | StringArg a String -- ^string+ deriving (Show, Eq, Functor)+++class Functor ast => Annotated ast where+ -- | Retrieve the annotation of an AST node.+ ann :: ast l -> l+ -- | Change the annotation of an AST node. Note that only the annotation of+ -- the node itself is affected, and not the annotations of any child nodes.+ -- if all nodes in the AST tree are to be affected, use 'fmap'.+ amap :: (l -> l) -> ast l -> ast l++instance Annotated Stat where+ ann (Assign a _ _) = a+ ann (FunCall a _) = a+ ann (Label a _) = a+ ann (Break a) = a+ ann (Goto a _) = a+ ann (Do a _) = a+ ann (While a _ _) = a+ ann (Repeat a _ _) = a+ ann (If a _ _) = a+ ann (ForRange a _ _ _ _ _) = a+ ann (ForIn a _ _ _) = a+ ann (FunAssign a _ _) = a+ ann (LocalFunAssign a _ _) = a+ ann (LocalAssign a _ _) = a+ ann (EmptyStat a) = a++ amap f (Assign a x1 x2) = Assign (f a) x1 x2+ amap f (FunCall a x1) = FunCall (f a) x1+ amap f (Label a x1) = Label (f a) x1+ amap f (Break a) = Break (f a)+ amap f (Goto a x1) = Goto (f a) x1+ amap f (Do a x1) = Do (f a) x1+ amap f (While a x1 x2) = While (f a) x1 x2+ amap f (Repeat a x1 x2) = Repeat (f a) x1 x2+ amap f (If a x1 x2) = If (f a) x1 x2+ amap f (ForRange a x1 x2 x3 x4 x5) = ForRange (f a) x1 x2 x3 x4 x5+ amap f (ForIn a x1 x2 x3) = ForIn (f a) x1 x2 x3+ amap f (FunAssign a x1 x2) = FunAssign (f a) x1 x2+ amap f (LocalFunAssign a x1 x2) = LocalFunAssign (f a) x1 x2+ amap f (LocalAssign a x1 x2) = LocalAssign (f a) x1 x2+ amap f (EmptyStat a) = EmptyStat (f a)++instance Annotated Exp where+ ann (Nil a) = a+ ann (Bool a _) = a+ ann (Number a _) = a+ ann (String a _) = a+ ann (Vararg a) = a+ ann (EFunDef a _) = a+ ann (PrefixExp a _) = a+ ann (TableConst a _) = a+ ann (Binop a _ _ _) = a+ ann (Unop a _ _) = a++ amap f (Nil a) = Nil (f a)+ amap f (Bool a x1) = Bool (f a) x1+ amap f (Number a x1) = Number (f a) x1+ amap f (String a x1) = String (f a) x1+ amap f (Vararg a) = Vararg (f a)+ amap f (EFunDef a x1) = EFunDef (f a) x1+ amap f (PrefixExp a x1) = PrefixExp (f a) x1+ amap f (TableConst a x1) = TableConst (f a) x1+ amap f (Binop a x1 x2 x3) = Binop (f a) x1 x2 x3+ amap f (Unop a x1 x2) = Unop (f a) x1 x2++instance Annotated Var where+ ann (VarName a _) = a+ ann (Select a _ _) = a+ ann (SelectName a _ _) = a++ amap f (VarName a x1) = VarName (f a) x1+ amap f (Select a x1 x2) = Select (f a) x1 x2+ amap f (SelectName a x1 x2) = SelectName (f a) x1 x2++instance Annotated Binop where+ ann (Add a) = a+ ann (Sub a) = a+ ann (Mul a) = a+ ann (Div a) = a+ ann (Exp a) = a+ ann (Mod a) = a+ ann (Concat a) = a+ ann (LT a) = a+ ann (LTE a) = a+ ann (GT a) = a+ ann (GTE a) = a+ ann (EQ a) = a+ ann (NEQ a) = a+ ann (And a) = a+ ann (Or a) = a++ amap f (Add a) = Add (f a)+ amap f (Sub a) = Sub (f a)+ amap f (Mul a) = Mul (f a)+ amap f (Div a) = Div (f a)+ amap f (Exp a) = Exp (f a)+ amap f (Mod a) = Mod (f a)+ amap f (Concat a) = Concat (f a)+ amap f (LT a) = LT (f a)+ amap f (LTE a) = LTE (f a)+ amap f (GT a) = GT (f a)+ amap f (GTE a) = GTE (f a)+ amap f (EQ a) = EQ (f a)+ amap f (NEQ a) = NEQ (f a)+ amap f (And a) = And (f a)+ amap f (Or a) = Or (f a)++instance Annotated Unop where+ ann (Neg a) = a+ ann (Not a) = a+ ann (Len a) = a++ amap f (Neg a) = Neg (f a)+ amap f (Not a) = Not (f a)+ amap f (Len a) = Len (f a)++instance Annotated PrefixExp where+ ann (PEVar a _) = a+ ann (PEFunCall a _) = a+ ann (Paren a _) = a++ amap f (PEVar a x1) = PEVar (f a) x1+ amap f (PEFunCall a x1) = PEFunCall (f a) x1+ amap f (Paren a x1) = Paren (f a) x1++instance Annotated Table where+ ann (Table a _) = a+ amap f (Table a x1) = Table (f a) x1++instance Annotated TableField where+ ann (ExpField a _ _) = a+ ann (NamedField a _ _) = a+ ann (Field a _) = a++ amap f (ExpField a x1 x2) = ExpField (f a) x1 x2+ amap f (NamedField a x1 x2) = NamedField (f a) x1 x2+ amap f (Field a x1) = Field (f a) x1++instance Annotated Block where+ ann (Block a _ _) = a+ amap f (Block a x1 x2) = Block (f a) x1 x2++instance Annotated FunName where+ ann (FunName a _ _ _) = a+ amap f (FunName a x1 x2 x3) = FunName (f a) x1 x2 x3++instance Annotated FunDef where+ ann (FunDef a _) = a+ amap f (FunDef a x1) = FunDef (f a) x1++instance Annotated FunBody where+ ann (FunBody a _ _ _) = a+ amap f (FunBody a x1 x2 x3) = FunBody (f a) x1 x2 x3++instance Annotated FunCall where+ ann (NormalFunCall a _ _) = a+ ann (MethodCall a _ _ _) = a++ amap f (NormalFunCall a x1 x2) = NormalFunCall (f a) x1 x2+ amap f (MethodCall a x1 x2 x3) = MethodCall (f a) x1 x2 x3++instance Annotated FunArg where+ ann (Args a _) = a+ ann (TableArg a _) = a+ ann (StringArg a _) = a++ amap f (Args a x1) = Args (f a) x1+ amap f (TableArg a x1) = TableArg (f a) x1+ amap f (StringArg a x1) = StringArg (f a) x1