on master help sign in
Update parsers for dissolution of AST.Literal

New parser for numbers allocates a bit extra. Seems kind of lame. Need to test if providing functions for each case is actually faster though. Decided to go for the nicer code while it is unknown.

commit6f4306108ece46162f69bc10c23fa99d4c825051 authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 8 Nov 2017, 16:17 (9 years ago) parent232f7dc
4 files changed+82−50
src/Parse/Expression.hs+31−7 src/Parse/Pattern.hs+17−3 src/Parse/Primitives/Number.hs+10−5 src/Parse/Literal.hs → src/Parse/Shader.hs+24−35
src/Parse/Expression.hs+31−7
@@ -12,11 +12,13 @@ import qualified AST.Expression.Source as Src
1212import qualified Elm.Name as N
1313import Parse.Primitives
1414import qualified Parse.Primitives.Keyword as Keyword
15+import qualified Parse.Primitives.Number as Number
1516import qualified Parse.Primitives.Symbol as Symbol
17+import qualified Parse.Primitives.Utf8 as Utf8
1618import qualified Parse.Primitives.Variable as Var
1719import qualified Parse.Primitives.Whitespace as W
18−import qualified Parse.Literal as Literal
1920import qualified Parse.Pattern as Pattern
21+import qualified Parse.Shader as Shader
2022import qualified Parse.Type as Type
2123import qualified Reporting.Annotation as A
2224import qualified Reporting.Error.Syntax as E
@@ -33,20 +35,42 @@ term =
3335 do start <- getPosition
3436 oneOf
3537 [ variable start >>= accessible start
36− , literal start
37− , Literal.shader start
38+ , string start
39+ , number start
40+ , Shader.shader start
3841 , list start
3942 , record start >>= accessible start
4043 , tuple start >>= accessible start
4144 , accessor start
45+ , character start
4246 ]
4347
4448
45−literal :: R.Position -> Parser Src.Expr
46−literal start =
47− do value <- Literal.literal
49+string :: R.Position -> Parser Src.Expr
50+string start =
51+ do str <- Utf8.string
4852 end <- getPosition
49− return (A.at start end (Src.Literal value))
53+ return (A.at start end (Src.Str str))
54+
55+
56+character :: R.Position -> Parser Src.Expr
57+character start =
58+ do chr <- Utf8.character
59+ end <- getPosition
60+ return (A.at start end (Src.Chr chr))
61+
62+
63+number :: R.Position -> Parser Src.Expr
64+number start =
65+ do nmbr <- Number.number
66+ end <- getPosition
67+ return $ A.at start end $
68+ case nmbr of
69+ Number.Int int ->
70+ Src.Int int
71+
72+ Number.Float float ->
73+ Src.Float float
5074
5175
5276accessor :: R.Position -> Parser Src.Expr
src/Parse/Pattern.hs+17−3
@@ -11,10 +11,11 @@ import qualified Data.List as List
1111
1212import qualified AST.Expression.Source as Src
1313import qualified Elm.Name as N
14−import qualified Parse.Literal as Literal
1514import Parse.Primitives (Parser, SParser, SPos, addLocation, checkSpace, getPosition, hint, inContext, spaces, oneOf)
1615import qualified Parse.Primitives.Keyword as Keyword
16+import qualified Parse.Primitives.Number as Number
1717import qualified Parse.Primitives.Symbol as Symbol
18+import qualified Parse.Primitives.Utf8 as Utf8
1819import qualified Parse.Primitives.Variable as Var
1920import Parse.Primitives.Whitespace (whitespace)
2021import qualified Reporting.Annotation as A
@@ -55,9 +56,22 @@ termHelp start =
5556 let ctor = Src.PCtor (R.Region start end) maybePrefix name []
5657 return (A.at start end ctor)
5758 ,
58− do lit <- Literal.literal
59+ do number <- Number.number
5960 end <- getPosition
60− return (A.at start end (Src.PLiteral lit))
61+ case number of
62+ Number.Int int ->
63+ return (A.at start end (Src.PInt int))
64+
65+ Number.Float _ ->
66+ error "TODO floats are not allowed in pattern matches"
67+ ,
68+ do str <- Utf8.string
69+ end <- getPosition
70+ return (A.at start end (Src.PStr str))
71+ ,
72+ do chr <- Utf8.character
73+ end <- getPosition
74+ return (A.at start end (Src.PChr chr))
6175 ]
6276
6377
src/Parse/Primitives/Number.hs+10−5
@@ -1,7 +1,8 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE BangPatterns, UnboxedTuples #-}
33module Parse.Primitives.Number
4− ( number
4+ ( Number(..)
5+ , number
56 , chompHex
67 )
78 where
@@ -13,7 +14,6 @@ import qualified Data.ByteString.Internal as B
1314import Foreign.ForeignPtr (ForeignPtr)
1415import GHC.Word (Word8)
1516
16−import qualified AST.Literal as L
1717import Parse.Primitives.Internals (Parser(..), State(..), noError)
1818import qualified Parse.Primitives.Internals as I
1919import qualified Parse.Primitives.Variable as Var
@@ -39,7 +39,12 @@ isDecimalDigit word =
3939-- NUMBERS
4040
4141
42−number :: Parser L.Literal
42+data Number
43+ = Int Int
44+ | Float Double
45+
46+
47+number :: Parser Number
4348number =
4449 Parser $ \(State fp offset terminal indent row col ctx) cok cerr _ eerr ->
4550 if offset >= terminal then
@@ -64,7 +69,7 @@ number =
6469
6570 OkInt newOffset n ->
6671 let
67− !integer = L.IntNum n
72+ !integer = Int n
6873 !newState = State fp newOffset terminal indent row (col + (newOffset - offset)) ctx
6974 in
7075 cok integer newState noError
@@ -72,7 +77,7 @@ number =
7277 OkFloat newOffset ->
7378 let
7479 !length = newOffset - offset
75− !float = L.FloatNum $ read $ Char8.unpack $ B.PS fp offset length
80+ !float = Float $ read $ Char8.unpack $ B.PS fp offset length
7681 !newState = State fp newOffset terminal indent row (col + length) ctx
7782 in
7883 cok float newState noError
src/Parse/Literal.hs → src/Parse/Shader.hsrenamed+24−35
@@ -1,5 +1,9 @@
1−{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2−module Parse.Literal (literal, shader) where
1+{-# OPTIONS_GHC -Wall #-}
2+module Parse.Shader
3+ ( shader
4+ )
5+ where
6+
37
48import qualified Data.List as List
59import qualified Data.Map as Map
@@ -10,26 +14,11 @@ import qualified Text.Parsec as Parsec
1014import qualified Text.Parsec.Error as Parsec
1115
1216import qualified AST.Expression.Source as Src
13−import qualified AST.Literal as L
17+import qualified AST.Shader as Shader
1418import qualified Reporting.Annotation as A
1519import qualified Reporting.Region as R
16−import Parse.Primitives (Parser, getPosition, oneOf)
17−import qualified Parse.Primitives.Number as Number
20+import Parse.Primitives (Parser, getPosition)
1821import qualified Parse.Primitives.Shader as Shader
19−import qualified Parse.Primitives.Utf8 as Utf8
20−
21−
22−
23−-- LITERALS
24−
25−
26−literal :: Parser L.Literal
27−literal =
28− oneOf
29− [ L.Str <$> Utf8.string
30− , L.Chr <$> Utf8.character
31− , Number.number
32− ]
3322
3423
3524
@@ -42,10 +31,10 @@ shader start@(R.Position row col) =
4231 shdr <- parseSource row col (Text.unpack src)
4332 end@(R.Position row2 col2) <- getPosition
4433 let uid = List.intercalate ":" (map show [row, col, row2, col2])
45− return (A.at start end (Src.GLShader (Text.pack uid) src shdr))
34+ return (A.at start end (Src.Shader (Text.pack uid) src shdr))
4635
4736
48−parseSource :: Int -> Int -> String -> Parser L.Shader
37+parseSource :: Int -> Int -> String -> Parser Shader.Shader
4938parseSource startRow startCol src =
5039 case GLP.parse src of
5140 Right (GLS.TranslationUnit decls) ->
@@ -71,27 +60,27 @@ parseSource startRow startCol src =
7160 Shader.failure (startRow + row - 1) col (Text.pack msg)
7261
7362
74−emptyShader :: L.Shader
63+emptyShader :: Shader.Shader
7564emptyShader =
76− L.Shader Map.empty Map.empty Map.empty
65+ Shader.Shader Map.empty Map.empty Map.empty
7766
7867
79−addInput :: (GLS.StorageQualifier, L.GLType, Text.Text) -> L.Shader -> L.Shader
68+addInput :: (GLS.StorageQualifier, Shader.Type, Text.Text) -> Shader.Shader -> Shader.Shader
8069addInput ( qual, tipe, name ) glDecls =
8170 case qual of
8271 GLS.Attribute ->
83− glDecls { L.attribute = Map.insert name tipe (L.attribute glDecls) }
72+ glDecls { Shader._attribute = Map.insert name tipe (Shader._attribute glDecls) }
8473
8574 GLS.Uniform ->
86− glDecls { L.uniform = Map.insert name tipe (L.uniform glDecls) }
75+ glDecls { Shader._uniform = Map.insert name tipe (Shader._uniform glDecls) }
8776
8877 GLS.Varying ->
89− glDecls { L.varying = Map.insert name tipe (L.varying glDecls) }
78+ glDecls { Shader._varying = Map.insert name tipe (Shader._varying glDecls) }
9079
9180 _ -> error "Should never happen due to below filter"
9281
9382
94−extractInputs :: GLS.ExternalDeclaration -> [(GLS.StorageQualifier, L.GLType, Text.Text)]
83+extractInputs :: GLS.ExternalDeclaration -> [(GLS.StorageQualifier, Shader.Type, Text.Text)]
9584extractInputs decl =
9685 case decl of
9786 GLS.Declaration
@@ -106,12 +95,12 @@ extractInputs decl =
10695 False -> []
10796 True ->
10897 case tipe of
109− GLS.Vec2 -> [(qual, L.V2, Text.pack name)]
110− GLS.Vec3 -> [(qual, L.V3, Text.pack name)]
111− GLS.Vec4 -> [(qual, L.V4, Text.pack name)]
112− GLS.Mat4 -> [(qual, L.M4, Text.pack name)]
113− GLS.Int -> [(qual, L.Int, Text.pack name)]
114− GLS.Float -> [(qual, L.Float, Text.pack name)]
115− GLS.Sampler2D -> [(qual, L.Texture, Text.pack name)]
98+ GLS.Vec2 -> [(qual, Shader.V2, Text.pack name)]
99+ GLS.Vec3 -> [(qual, Shader.V3, Text.pack name)]
100+ GLS.Vec4 -> [(qual, Shader.V4, Text.pack name)]
101+ GLS.Mat4 -> [(qual, Shader.M4, Text.pack name)]
102+ GLS.Int -> [(qual, Shader.Int, Text.pack name)]
103+ GLS.Float -> [(qual, Shader.Float, Text.pack name)]
104+ GLS.Sampler2D -> [(qual, Shader.Texture, Text.pack name)]
116105 _ -> []
117106 _ -> []