@@ -1,174 +0,0 @@
1−-----------------------------------------------------------------------------
3−-- Module : Language.PureScript.Parser.JS
4−-- Copyright : (c) Phil Freeman 2013
7−-- Maintainer : Phil Freeman <paf31@cantab.net>
8−-- Stability : experimental
12−-- A parser for a small fragment of Javascript
14−-----------------------------------------------------------------------------
16−module Language.PureScript.Parser.JS (
20−import Language.PureScript.Values
21−import Language.PureScript.Names
22−import Language.PureScript.CodeGen.JS.AST
23−import qualified Language.PureScript.Parser.Common as C
24−import Control.Applicative
26−import Data.Functor.Identity
27−import qualified Text.Parsec as P
28−import qualified Text.Parsec.Token as P
29−import qualified Text.Parsec.Expr as P
31−booleanLiteral :: P.Parsec String u Bool
32−booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
34−parseNumericLiteral :: P.Parsec String u JS
35−parseNumericLiteral = JSNumericLiteral <$> C.integerOrFloat
37−parseStringLiteral :: P.Parsec String u JS
38−parseStringLiteral = JSStringLiteral <$> C.stringLiteral
40−parseBooleanLiteral :: P.Parsec String u JS
41−parseBooleanLiteral = JSBooleanLiteral <$> booleanLiteral
43−parseArrayLiteral :: P.Parsec String u JS
44−parseArrayLiteral = JSArrayLiteral <$> P.squares C.tokenParser (P.commaSep C.tokenParser parseJS)
46−parseObjectLiteral :: P.Parsec String u JS
47−parseObjectLiteral = JSObjectLiteral <$> P.braces C.tokenParser (P.commaSep C.tokenParser parseIdentifierAndValue)
49−parseIdentifierAndValue :: P.Parsec String u (String, JS)
50−parseIdentifierAndValue = (,) <$> (identifier <* C.colon)
53−identifier :: P.Parsec String u String
55− ident <- C.identifier
56− when (ident `elem` C.reservedJsNames) $ P.unexpected $ ("reserved identifier " ++ show ident)
59−parseFunction :: P.Parsec String u JS
61− C.reserved "function"
62− name <- P.optionMaybe C.identifier
63− args <- P.parens C.tokenParser $ P.commaSep C.tokenParser identifier
65− return $ JSFunction name args body
67−parseBlock :: P.Parsec String u JS
68−parseBlock = JSBlock <$> P.braces C.tokenParser (P.many parseJS)
70−parseVar :: P.Parsec String u JS
71−parseVar = JSVar <$> identifier
73−parseJSAtom :: P.Parsec String u JS
74−parseJSAtom = P.choice
75− [ P.try parseNumericLiteral
76− , P.try parseStringLiteral
77− , P.try parseBooleanLiteral
79− , P.try parseObjectLiteral
83− , parseVariableIntroduction
87− , P.parens C.tokenParser parseJS ]
89−parseAccessor :: JS -> P.Parsec String u JS
90−parseAccessor js = P.try $ flip JSAccessor js <$> (C.dot *> P.notFollowedBy C.opLetter *> identifier)
92−parseIndexer :: JS -> P.Parsec String u JS
93−parseIndexer js = P.try $ flip JSIndexer js <$> (P.squares C.tokenParser parseJS)
95−parseConditional :: JS -> P.Parsec String u JS
96−parseConditional js = P.try $ do
97− _ <- C.lexeme $ P.char '?'
99− _ <- C.lexeme $ P.char ':'
101− return $ JSConditional js tr fa
103−binary :: BinaryOperator -> String -> P.Assoc -> P.Operator String u Identity JS
104−binary op s f = P.Infix (P.try $ C.reservedOp s >> return (JSBinary op)) f
106−unary :: UnaryOperator -> String -> P.Operator String u Identity JS
107−unary op s = P.Prefix (P.try $ C.reservedOp s >> return (JSUnary op))
110−-- Parse a simplified Javascript expression
112−parseJS :: P.Parsec String u JS
114− (P.buildExpressionParser operators
115− . C.buildPostfixParser postfixTable2
116− $ indexersAndAccessors) P.<?> "javascript"
118− indexersAndAccessors = C.buildPostfixParser postfixTable1 parseJSAtom
119− postfixTable1 = [ parseAccessor, parseIndexer, parseConditional, parseAssignment ]
120− postfixTable2 = [ \v -> P.try $ JSApp v <$> (P.parens C.tokenParser (P.commaSep C.tokenParser parseJS)) ]
121− operators = [ [ binary LessThan "<" P.AssocLeft]
122− , [ binary LessThanOrEqualTo "<=" P.AssocLeft]
123− , [ binary GreaterThan ">" P.AssocLeft]
124− , [ binary GreaterThanOrEqualTo ">=" P.AssocLeft]
126− , [ unary BitwiseNot "~" ]
127− , [ unary Negate "-" ]
128− , [ unary Positive "+" ]
129− , [ binary Multiply "*" P.AssocLeft]
130− , [ binary Divide "/" P.AssocLeft]
131− , [ binary Modulus "%" P.AssocLeft]
132− , [ binary Add "+" P.AssocLeft]
133− , [ binary Subtract "-" P.AssocLeft]
134− , [ binary ShiftLeft "<<" P.AssocLeft]
135− , [ binary ShiftRight ">>" P.AssocLeft]
136− , [ binary ZeroFillShiftRight ">>>" P.AssocLeft]
137− , [ binary EqualTo "===" P.AssocLeft]
138− , [ binary NotEqualTo "!==" P.AssocLeft]
139− , [ binary BitwiseAnd "&" P.AssocLeft]
140− , [ binary BitwiseXor "^" P.AssocLeft]
141− , [ binary BitwiseOr "|" P.AssocLeft]
142− , [ binary And "&&" P.AssocRight]
143− , [ binary Or "||" P.AssocRight]
146−parseVariableIntroduction :: P.Parsec String u JS
147−parseVariableIntroduction = do
149− name <- P.identifier C.tokenParser
150− value <- P.optionMaybe $ do
151− _ <- C.lexeme $ P.char '='
155− return $ JSVariableIntroduction name value
157−parseAssignment :: JS -> P.Parsec String u JS
158−parseAssignment tgt = do
159− _ <- C.lexeme $ P.char '='
162− return $ JSAssignment tgt value
164−parseWhile :: P.Parsec String u JS
165−parseWhile = JSWhile <$> (C.reserved "while" *> P.parens C.tokenParser parseJS)
168−parseIf :: P.Parsec String u JS
169−parseIf = JSIfElse <$> (C.reserved "if" *> P.parens C.tokenParser parseJS)
171− <*> P.optionMaybe (C.reserved "else" >> parseJS)
173−parseReturn :: P.Parsec String u JS
174−parseReturn = JSReturn <$> (C.reserved "return" *> parseJS <* C.semi)