@@ -172,9 +172,9 @@ pSyntaxRule syn
172172 name _ = Nothing
173173
174174pSynSym :: IParser SSymbol
175−pSynSym = try (do lchar '['; n <- iName; lchar ']'
175+pSynSym = try (do lchar '['; n <- pName; lchar ']'
176176 return (Expr n))
177− <|> do n <- iName
177+ <|> do n <- pName
178178 return (Keyword n)
179179 <|> do sym <- strlit
180180 return (Symbol sym)
@@ -237,26 +237,30 @@ pExpr' :: SyntaxInfo -> IParser PTerm
237237pExpr' syn
238238 = try (do i <- getState
239239 pExtensions syn (syntax_rules i))
240− <|> try (pApp syn)
240+ <|> pNoExtExpr syn
241+
242+pNoExtExpr syn =
243+ try (pApp syn)
241244 <|> pSimpleExpr syn
242245 <|> try (pLambda syn)
243246 <|> try (pPi syn)
244247 <|> try (pDoBlock syn)
245248
246249pExtensions :: 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)
248251
249252pExt :: SyntaxInfo -> Syntax -> IParser PTerm
250−pExt syn (Rule ssym ptm)
251− = do smap <- mapM pSymbol ssym
252− let ns = mapMaybe id smap
253+pExt syn (Rule (s:ssym) ptm)
254+ = do s1 <- pSymbol pSimpleExpr s
255+ smap <- mapM (pSymbol pExpr') ssym
256+ let ns = mapMaybe id (s1:smap)
253257 return (update ns ptm) -- updated with smap
254258 where
255− pSymbol (Keyword n) = do reserved (show n); return Nothing
256− pSymbol (Expr n) = do tm <- pSimpleExpr syn
257− return $ Just (n, tm)
258− pSymbol (Symbol s) = do symbol s
259− return Nothing
259+ pSymbol p (Keyword n) = do reserved (show n); return Nothing
260+ pSymbol p (Expr n) = do tm <- p syn
261+ return $ Just (n, tm)
262+ pSymbol p (Symbol s) = do symbol s
263+ return Nothing
260264 dropn n [] = []
261265 dropn n ((x,t) : xs) | n == x = xs
262266 | otherwise = (x,t):dropn n xs
@@ -276,13 +280,21 @@ pExt syn (Rule ssym ptm)
276280 upd ns (DoBind n t : ds) = DoBind n (update ns t) : upd (dropn n ns) ds
277281 upd ns (DoLet n t : ds) = DoLet n (update ns t) : upd (dropn n ns) ds
278282
279−pfName = try iName
283+pName = do i <- getState
284+ iName (map show (names (syntax_rules i)))
285+ where
286+ names rs = concatMap namesR rs
287+ namesR (Rule syms _) = mapMaybe ename syms
288+ ename (Keyword n) = Just n
289+ ename _ = Nothing
290+
291+pfName = try pName
280292 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
281293
282294pSimpleExpr syn =
283295 try (do symbol "!["; t <- pTerm; lchar ']'
284296 return $ PQuote t)
285− <|> try (do lchar '?'; x <- iName; return (PMetavar x))
297+ <|> try (do lchar '?'; x <- pName; return (PMetavar x))
286298 <|> try (do reserved "return"; return PReturn)
287299 <|> try (do x <- pfName; return (PRef x))
288300 <|> try (do lchar '('; l <- pExpr syn; lchar ','; r <- pExpr syn; lchar ')';
@@ -309,7 +321,7 @@ pArg syn = pImplicitArg syn
309321 <|> do e <- pSimpleExpr syn
310322 return (PExp e)
311323
312−pImplicitArg syn = do lchar '{'; n <- iName
324+pImplicitArg syn = do lchar '{'; n <- pName
313325 v <- option (PRef n) (do lchar '='; pExpr syn)
314326 lchar '}'
315327 return (PImp n v)
@@ -349,9 +361,9 @@ pDoBlock syn
349361 return (PDoBlock ds)
350362
351363pDo syn
352− = try (do i <- iName; symbol "<-"; e <- pExpr syn;
364+ = try (do i <- pName; symbol "<-"; e <- pExpr syn;
353365 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
355367 return (DoLet i e))
356368 <|> try (do e <- pExpr syn; return (DoExp e))
357369
@@ -394,7 +406,7 @@ pData syn = try (do reserved "data"; tyn <- pfName; ty <- pTSig syn
394406 cons <- sepBy (pConstructor syn) (lchar '|')
395407 lchar ';'
396408 return $ PData (PDatadecl tyn ty' cons))
397− <|> do reserved "data"; tyn <- pfName; args <- many iName
409+ <|> do reserved "data"; tyn <- pfName; args <- many pName
398410 lchar '='
399411 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
400412 lchar ';'