64 | HexNumber String |
64 | HexNumber String |
65 | Reference Reference |
65 | Reference Reference |
66 | Null |
66 | Null |
67 deriving Show |
67 deriving Show |
68 data Reference = ArrayElement Identifier Expression |
68 data Reference = ArrayElement Identifier Expression |
69 | FunCall Reference [Expression] |
69 | FunCall [Expression] Reference |
70 | SimpleReference Identifier |
70 | SimpleReference Identifier |
71 | Dereference Reference |
71 | Dereference Reference |
72 | RecordField Reference Reference |
72 | RecordField Reference Reference |
73 | Address Reference |
73 | Address Reference |
74 deriving Show |
74 deriving Show |
146 reference = buildExpressionParser table term <?> "reference" |
146 reference = buildExpressionParser table term <?> "reference" |
147 where |
147 where |
148 term = comments >> choice [ |
148 term = comments >> choice [ |
149 parens pas reference |
149 parens pas reference |
150 , try $ iD >>= \i -> (brackets pas) expression >>= return . ArrayElement i |
150 , try $ iD >>= \i -> (brackets pas) expression >>= return . ArrayElement i |
151 , try $ funCall |
|
152 , try $ reference >>= \r -> char '^' >> return (Dereference r) |
|
153 , char '@' >> reference >>= return . Address |
151 , char '@' >> reference >>= return . Address |
154 , iD >>= return . SimpleReference |
152 , iD >>= return . SimpleReference |
155 ] <?> "simple reference" |
153 ] <?> "simple reference" |
156 |
154 |
157 table = [ |
155 table = [ |
158 [Infix (try (char '.' >> notFollowedBy (char '.')) >> return RecordField) AssocLeft] |
156 [Postfix $ (parens pas) (option [] parameters) >>= return . FunCall] |
|
157 , [Postfix (char '^' >> return Dereference)] |
|
158 , [Infix (try (char '.' >> notFollowedBy (char '.')) >> return RecordField) AssocLeft] |
159 ] |
159 ] |
|
160 |
160 |
161 |
161 varsDecl1 = varsParser sepEndBy1 |
162 varsDecl1 = varsParser sepEndBy1 |
162 varsDecl = varsParser sepEndBy |
163 varsDecl = varsParser sepEndBy |
163 varsParser m endsWithSemi = do |
164 varsParser m endsWithSemi = do |
164 vs <- m (aVarDecl endsWithSemi) (semi pas) |
165 vs <- m (aVarDecl endsWithSemi) (semi pas) |