Checkpoint having Alt actually have a backtracking-or-not option.
Chris Pressey
1 year, 5 months ago
47 | 47 |
|
48 | 48 |
-- We look at all the choices; each should start with a pre-condition
|
49 | 49 |
-- determining whether we can select it; and we should narrow down our
|
50 | |
-- choices based on that. (Then pick randomly? Or insist deterministic?)
|
|
50 |
-- choices based on that.
|
51 | 51 |
gen g state@(Generating _str store) (Alt False choices) =
|
52 | 52 |
case missingPreConditions choices of
|
53 | 53 |
missing@(_:_) ->
|
19 | 19 |
p <- option [] formals
|
20 | 20 |
bt <- option False (do { keyword "(*)"; return True })
|
21 | 21 |
keyword "::="
|
22 | |
e <- expr0
|
|
22 |
e <- expr0 bt
|
23 | 23 |
keyword ";"
|
24 | 24 |
return Production{ ntname=nt, params=p, backtrackable=bt, constituents=e }
|
25 | 25 |
|
|
29 | 29 |
keyword ">"
|
30 | 30 |
return v
|
31 | 31 |
|
32 | |
expr0 = do
|
33 | |
es <- sepBy (expr1) (keyword "|")
|
34 | |
return $ Alt False es
|
35 | |
|
36 | |
expr1 = do
|
37 | |
es <- many1 term
|
|
32 |
expr0 bt = do
|
|
33 |
es <- sepBy (expr1 bt) (keyword "|")
|
|
34 |
return $ Alt bt es
|
|
35 |
|
|
36 |
expr1 bt = do
|
|
37 |
es <- many1 $ term bt
|
38 | 38 |
return $ Seq $ flattenseq es where
|
39 | 39 |
flattenseq [] = []
|
40 | 40 |
flattenseq (s:ss) = case s of
|
|
42 | 42 |
Seq xs -> xs ++ (flattenseq ss)
|
43 | 43 |
_ -> (s:flattenseq ss)
|
44 | 44 |
|
45 | |
term = (try parenExpr) <|> (try loopExpr) <|> (try constraintExpr) <|> (try terminal) <|> nonterminal
|
46 | |
|
47 | |
parenExpr = do
|
|
45 |
term bt = (try $ parenExpr bt) <|> (try $ loopExpr bt) <|> (try $ constraintExpr bt) <|> (try $ terminal bt) <|> nonterminal bt
|
|
46 |
|
|
47 |
parenExpr bt = do
|
48 | 48 |
keyword "("
|
49 | |
e <- expr0
|
|
49 |
e <- expr0 bt
|
50 | 50 |
keyword ")"
|
51 | 51 |
return e
|
52 | 52 |
|
53 | |
loopExpr = do
|
|
53 |
loopExpr bt = do
|
54 | 54 |
keyword "{"
|
55 | |
e <- expr0
|
|
55 |
e <- expr0 bt
|
56 | 56 |
keyword "}"
|
57 | 57 |
return $ Loop e []
|
58 | 58 |
|
59 | |
constraintExpr = do
|
|
59 |
constraintExpr _bt = do
|
60 | 60 |
keyword "<."
|
61 | 61 |
c <- constrainer
|
62 | 62 |
keyword ".>"
|
63 | 63 |
return $ Constraint $ c
|
64 | 64 |
|
65 | |
constrainer = (try unifyConst) <|> (try unifyVar) <|> (try inc) <|> (try dec) <|> (try gte) <|> (try gt) <|> (try lte) <|> (try lt) <|> (try both)
|
|
65 |
terminal _bt = do
|
|
66 |
s <- quotedString <|> charlit
|
|
67 |
case s of
|
|
68 |
[c] -> return $ Terminal $ c
|
|
69 |
_ -> return $ Seq $ map (\c -> Terminal c) s
|
|
70 |
|
|
71 |
nonterminal _bt = do
|
|
72 |
s <- capWord
|
|
73 |
a <- option [] actuals
|
|
74 |
return $ NonTerminal s a
|
|
75 |
where
|
|
76 |
actuals = do
|
|
77 |
keyword "<"
|
|
78 |
v <- sepBy (variable) (keyword ",")
|
|
79 |
keyword ">"
|
|
80 |
return v
|
|
81 |
|
|
82 |
constrainer = (try unifyConst) <|> (try unifyVar) <|> (try inc) <|> (try dec) <|>
|
|
83 |
(try gte) <|> (try gt) <|> (try lte) <|> (try lt) <|> (try both)
|
66 | 84 |
|
67 | 85 |
unifyConst = do
|
68 | 86 |
v <- variable
|
|
134 | 152 |
v <- variable
|
135 | 153 |
return $ CVar v
|
136 | 154 |
|
137 | |
terminal = do
|
138 | |
s <- quotedString <|> charlit
|
139 | |
case s of
|
140 | |
[c] -> return $ Terminal $ c
|
141 | |
_ -> return $ Seq $ map (\c -> Terminal c) s
|
142 | |
|
143 | |
nonterminal = do
|
144 | |
s <- capWord
|
145 | |
a <- option [] actuals
|
146 | |
return $ NonTerminal s a
|
147 | |
|
148 | |
actuals = do
|
149 | |
keyword "<"
|
150 | |
v <- sepBy (variable) (keyword ",")
|
151 | |
keyword ">"
|
152 | |
return v
|
153 | |
|
154 | 155 |
--
|
155 | 156 |
-- Low level: Concrete things
|
156 | 157 |
--
|
30 | 30 |
Failure -> Failure
|
31 | 31 |
st' -> parseSeq st' rest
|
32 | 32 |
|
33 | |
parse g state (Alt _bt s) = parseAlt state s where
|
|
33 |
-- Hello, Mrs Backtracking Alternation!
|
|
34 |
parse g state (Alt True s) = parseAlt state s where
|
34 | 35 |
parseAlt _st [] = Failure
|
35 | 36 |
parseAlt st (e : rest) =
|
36 | 37 |
case parse g st e of
|
37 | 38 |
Failure -> parseAlt st rest
|
38 | 39 |
st' -> st'
|
|
40 |
|
|
41 |
-- Hello, Mrs Non-Backtracking Alternation!
|
|
42 |
parse g state (Alt False s) = parseAlt state s where
|
|
43 |
parseAlt _st [] = Failure
|
|
44 |
-- FIXME: this should do "pick an applicable one"
|
|
45 |
parseAlt st (e : _) = parse g st e
|
39 | 46 |
|
40 | 47 |
parse g state (Loop l _) = parseLoop state l where
|
41 | 48 |
parseLoop st e =
|