@@ -172,9 +172,9 @@ pSyntaxRule syn
172 name _ = Nothing
172 name _ = Nothing
174pSynSym :: IParser SSymbol
174pSynSym :: IParser SSymbol
175−pSynSym = try (do lchar '['; n <- iName; lchar ']'
175+pSynSym = try (do lchar '['; n <- pName; lchar ']'
176 return (Expr n))
176 return (Expr n))
177− <|> do n <- iName
177+ <|> do n <- pName
178 return (Keyword n)
178 return (Keyword n)
179 <|> do sym <- strlit
179 <|> do sym <- strlit
180 return (Symbol sym)
180 return (Symbol sym)
@@ -237,26 +237,30 @@ pExpr' :: SyntaxInfo -> IParser PTerm
237pExpr' syn
237pExpr' syn
238 = try (do i <- getState
238 = try (do i <- getState
239 pExtensions syn (syntax_rules i))
239 pExtensions syn (syntax_rules i))
240− <|> try (pApp syn)
243+ try (pApp syn)
241 <|> pSimpleExpr syn
244 <|> pSimpleExpr syn
242 <|> try (pLambda syn)
245 <|> try (pLambda syn)
243 <|> try (pPi syn)
246 <|> try (pPi syn)
244 <|> try (pDoBlock syn)
247 <|> try (pDoBlock syn)
246pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
249pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
247−pExtensions syn rules = choice (map (pExt syn) rules)
250+pExtensions syn rules = choice (map (\x -> try (pExt syn x)) rules)
249pExt :: SyntaxInfo -> Syntax -> IParser PTerm
252pExt :: SyntaxInfo -> Syntax -> IParser PTerm
250−pExt syn (Rule ssym ptm)
253+pExt syn (Rule (s:ssym) ptm)
254+ = do s1 <- pSymbol pSimpleExpr s
251− = do smap <- mapM pSymbol ssym
255+ smap <- mapM (pSymbol pExpr') ssym
252− let ns = mapMaybe id smap
256+ let ns = mapMaybe id (s1:smap)
253 return (update ns ptm) -- updated with smap
257 return (update ns ptm) -- updated with smap
255− pSymbol (Keyword n) = do reserved (show n); return Nothing
259+ pSymbol p (Keyword n) = do reserved (show n); return Nothing
256− pSymbol (Expr n) = do tm <- pSimpleExpr syn
260+ pSymbol p (Expr n) = do tm <- p syn
257− return $ Just (n, tm)
261+ return $ Just (n, tm)
258− pSymbol (Symbol s) = do symbol s
262+ pSymbol p (Symbol s) = do symbol s
259− return Nothing
263+ return Nothing
260 dropn n [] = []
264 dropn n [] = []
261 dropn n ((x,t) : xs) | n == x = xs
265 dropn n ((x,t) : xs) | n == x = xs
262 | otherwise = (x,t):dropn n xs
266 | otherwise = (x,t):dropn n xs
@@ -276,13 +280,21 @@ pExt syn (Rule ssym ptm)
276 upd ns (DoBind n t : ds) = DoBind n (update ns t) : upd (dropn n ns) ds
280 upd ns (DoBind n t : ds) = DoBind n (update ns t) : upd (dropn n ns) ds
277 upd ns (DoLet n t : ds) = DoLet n (update ns t) : upd (dropn n ns) ds
281 upd ns (DoLet n t : ds) = DoLet n (update ns t) : upd (dropn n ns) ds
283+pName = do i <- getState
284+ iName (map show (names (syntax_rules i)))
286+ names rs = concatMap namesR rs
287+ namesR (Rule syms _) = mapMaybe ename syms
288+ ename (Keyword n) = Just n
279−pfName = try iName
291+pfName = try pName
280 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
292 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
282pSimpleExpr syn =
294pSimpleExpr syn =
283 try (do symbol "!["; t <- pTerm; lchar ']'
295 try (do symbol "!["; t <- pTerm; lchar ']'
284 return $ PQuote t)
296 return $ PQuote t)
285− <|> try (do lchar '?'; x <- iName; return (PMetavar x))
297+ <|> try (do lchar '?'; x <- pName; return (PMetavar x))
286 <|> try (do reserved "return"; return PReturn)
298 <|> try (do reserved "return"; return PReturn)
287 <|> try (do x <- pfName; return (PRef x))
299 <|> try (do x <- pfName; return (PRef x))
288 <|> try (do lchar '('; l <- pExpr syn; lchar ','; r <- pExpr syn; lchar ')';
300 <|> try (do lchar '('; l <- pExpr syn; lchar ','; r <- pExpr syn; lchar ')';
@@ -309,7 +321,7 @@ pArg syn = pImplicitArg syn
309 <|> do e <- pSimpleExpr syn
321 <|> do e <- pSimpleExpr syn
310 return (PExp e)
322 return (PExp e)
312−pImplicitArg syn = do lchar '{'; n <- iName
324+pImplicitArg syn = do lchar '{'; n <- pName
313 v <- option (PRef n) (do lchar '='; pExpr syn)
325 v <- option (PRef n) (do lchar '='; pExpr syn)
314 lchar '}'
326 lchar '}'
315 return (PImp n v)
327 return (PImp n v)
@@ -349,9 +361,9 @@ pDoBlock syn
349 return (PDoBlock ds)
361 return (PDoBlock ds)
352− = try (do i <- iName; symbol "<-"; e <- pExpr syn;
364+ = try (do i <- pName; symbol "<-"; e <- pExpr syn;
353 return (DoBind i e))
365 return (DoBind i e))
354− <|> try (do reserved "let"; i <- iName; reservedOp "="; e <- pExpr syn
366+ <|> try (do reserved "let"; i <- pName; reservedOp "="; e <- pExpr syn
355 return (DoLet i e))
367 return (DoLet i e))
356 <|> try (do e <- pExpr syn; return (DoExp e))
368 <|> try (do e <- pExpr syn; return (DoExp e))
@@ -394,7 +406,7 @@ pData syn = try (do reserved "data"; tyn <- pfName; ty <- pTSig syn
394 cons <- sepBy (pConstructor syn) (lchar '|')
406 cons <- sepBy (pConstructor syn) (lchar '|')
395 lchar ';'
407 lchar ';'
396 return $ PData (PDatadecl tyn ty' cons))
408 return $ PData (PDatadecl tyn ty' cons))
397− <|> do reserved "data"; tyn <- pfName; args <- many iName
409+ <|> do reserved "data"; tyn <- pfName; args <- many pName
398 lchar '='
410 lchar '='
399 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
411 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
400 lchar ';'
412 lchar ';'