summaryrefslogtreecommitdiff
path: root/src-3.0
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2008-06-12 13:34:47 +0000
committerkrasimir <krasimir@chalmers.se>2008-06-12 13:34:47 +0000
commit96230f84f5aa6ee4775bdf469010ace7b8a902d5 (patch)
tree74f5c586e0b6839d14ab7621543fd0b0c11c6dc4 /src-3.0
parent79cbcdad2d5751e086990d8d98dfef4fcb4a8612 (diff)
fix the tree extractor in the incremental parser to check for cyclic charts and coercion rules.
Diffstat (limited to 'src-3.0')
-rw-r--r--src-3.0/PGF/Parsing/FCFG/Incremental.hs19
1 files changed, 11 insertions, 8 deletions
diff --git a/src-3.0/PGF/Parsing/FCFG/Incremental.hs b/src-3.0/PGF/Parsing/FCFG/Incremental.hs
index dfa1a995f..16a5e8875 100644
--- a/src-3.0/PGF/Parsing/FCFG/Incremental.hs
+++ b/src-3.0/PGF/Parsing/FCFG/Incremental.hs
@@ -93,14 +93,17 @@ extractExps (State pinfo chart items) start = exps
let (FRule fn _ args cat lins) = allRules pinfo ! ruleid
lbl <- indices lins
fid <- Map.lookup (PK c lbl 0) (passive st)
- go fid
-
- go fid = do
- set <- IntMap.lookup fid (forest st)
- Passive ruleid args <- Set.toList set
- let (FRule fn _ _ cat lins) = allRules pinfo ! ruleid
- args <- mapM go args
- return (EApp fn args)
+ go Set.empty fid
+
+ go rec fid
+ | Set.member fid rec = mzero
+ | otherwise = do set <- IntMap.lookup fid (forest st)
+ Passive ruleid args <- Set.toList set
+ let (FRule fn _ _ cat lins) = allRules pinfo ! ruleid
+ if fn == wildCId
+ then go (Set.insert fid rec) (head args)
+ else do args <- mapM (go (Set.insert fid rec)) args
+ return (EApp fn args)
process fn !rules [] acc_chart = acc_chart
process fn !rules (item:items) acc_chart = univRule item acc_chart