diff options
| author | krasimir <krasimir@chalmers.se> | 2008-06-12 13:34:47 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2008-06-12 13:34:47 +0000 |
| commit | 96230f84f5aa6ee4775bdf469010ace7b8a902d5 (patch) | |
| tree | 74f5c586e0b6839d14ab7621543fd0b0c11c6dc4 /src-3.0 | |
| parent | 79cbcdad2d5751e086990d8d98dfef4fcb4a8612 (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.hs | 19 |
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
|
