@@ -201,13 +201,15 @@ pSyntaxDecl syn
201201 fc <- pfc
202202 return (PSyntax fc s)
203203 where
204− names (Rule syms _) = mapMaybe ename syms
204+ names (Rule syms _ _) = mapMaybe ename syms
205205 ename (Keyword n) = Just n
206206 ename _ = Nothing
207207
208208pSyntaxRule :: SyntaxInfo -> IParser Syntax
209209pSyntaxRule syn
210− = do reserved "syntax"
210+ = do sty <- option AnySyntax (do reserved "term"; return TermSyntax
211+ <|> do reserved "pattern"; return PatternSyntax)
212+ reserved "syntax"
211213 syms <- many1 pSynSym
212214 when (all expr syms) $ fail "No keywords in syntax rule"
213215 let ns = mapMaybe name syms
@@ -216,7 +218,7 @@ pSyntaxRule syn
216218 lchar '='
217219 tm <- pExpr syn
218220 lchar ';'
219− return (Rule syms tm)
221+ return (Rule syms tm sty)
220222 where
221223 expr (Expr _) = True
222224 expr _ = False
@@ -331,15 +333,19 @@ pExtExpr syn = do i <- getState
331333
332334pSimpleExtExpr :: SyntaxInfo -> IParser PTerm
333335pSimpleExtExpr syn = do i <- getState
334− pExtensions syn (filter simple (syntax_rules i))
336+ pExtensions syn (filter valid (filter simple (syntax_rules i)))
335337 where
336− simple (Rule (Expr x:xs) _) = False
337− simple (Rule (_:xs) _) = case (last xs) of
338+ simple (Rule (Expr x:xs) _ _) = False
339+ simple (Rule (_:xs) _ _) = case (last xs) of
338340 Keyword _ -> True
339341 Symbol _ -> True
340342 _ -> False
341343 simple _ = False
342344
345+ valid (Rule _ _ AnySyntax) = True
346+ valid (Rule _ _ PatternSyntax) = inPattern syn
347+ valid (Rule _ _ TermSyntax) = not (inPattern syn)
348+
343349pNoExtExpr syn =
344350 try (pApp syn)
345351 <|> pSimpleExpr syn
@@ -352,7 +358,7 @@ pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
352358pExtensions syn rules = choice (map (\x -> try (pExt syn x)) rules)
353359
354360pExt :: SyntaxInfo -> Syntax -> IParser PTerm
355−pExt syn (Rule (s:ssym) ptm)
361+pExt syn (Rule (s:ssym) ptm _)
356362 = do s1 <- pSymbol pSimpleExpr s
357363 smap <- mapM (pSymbol pExpr') ssym
358364 let ns = mapMaybe id (s1:smap)
@@ -616,7 +622,8 @@ whereSyn n syn args = let ns = concatMap allNamesIn args
616622 no_imp = nub (ni ++ ns) }
617623 where decorate n x = UN [(show n ++ "_" ++ show x)]
618624
619−pArgExpr syn = try (pHSimpleExpr syn) <|> pSimpleExtExpr syn
625+pArgExpr syn = let syn' = syn { inPattern = True } in
626+ try (pHSimpleExpr syn') <|> pSimpleExtExpr syn'
620627
621628pClause :: SyntaxInfo -> IParser PClause
622629pClause syn