57 |
* This function is used to parse aliases and sub-groups. *) |
* This function is used to parse aliases and sub-groups. *) |
58 |
fun recParse (p1, p2) p = |
fun recParse (p1, p2) p = |
59 |
(case parse' (p, (group, (source, p1, p2)) :: groupstack) of |
(case parse' (p, (group, (source, p1, p2)) :: groupstack) of |
60 |
NONE => (#anyErrors source := true; CMSemant.emptyGroup) |
NONE => (#anyErrors source := true; CMSemant.emptyGroup group) |
61 |
| SOME res => res) |
| SOME res => res) |
62 |
handle exn as IO.Io _ => (error (p1, p2) (General.exnMessage exn); |
handle exn as IO.Io _ => (error (p1, p2) (General.exnMessage exn); |
63 |
CMSemant.emptyGroup) |
CMSemant.emptyGroup group) |
64 |
|
|
65 |
fun doMember (p, p1, p2, c, e) = |
fun doMember (p, p1, p2, c, e) = |
66 |
CMSemant.member (recParse (p1, p2)) |
CMSemant.member (recParse (p1, p2)) |
166 |
val (parseResult, _) = |
val (parseResult, _) = |
167 |
CMParse.parse (lookAhead, tokenStream, |
CMParse.parse (lookAhead, tokenStream, |
168 |
fn (s,p1,p2) => error (p1, p2) s, |
fn (s,p1,p2) => error (p1, p2) s, |
169 |
(context, error', error, recParse, doMember)) |
(group, context, error', error, recParse, doMember)) |
170 |
in |
in |
171 |
TextIO.closeIn stream; |
TextIO.closeIn stream; |
172 |
if !(#anyErrors source) then NONE |
if !(#anyErrors source) then NONE |