diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1995-10-03 14:04:07 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1995-10-03 14:04:07 +0000 |
commit | afc957472262504264c534efaec7d4dd4454e743 (patch) | |
tree | 7c3e7bfb773fe999faff190832e4081bfa1cacf9 /byterun/parsing.c | |
parent | 97fba0e18e7970fb1b055ae449072090c26d694c (diff) |
On prend symb_start = symb_end quand on applique une epsilon-production.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@311 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun/parsing.c')
-rw-r--r-- | byterun/parsing.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/byterun/parsing.c b/byterun/parsing.c index 0ebdfcb96..1be57adfe 100644 --- a/byterun/parsing.c +++ b/byterun/parsing.c @@ -111,7 +111,7 @@ value parse_engine(tables, env, cmd, arg) /* ML */ value arg; { int state; - mlsize_t sp; + mlsize_t sp, asp; int errflag; int n, n1, n2, m, state1; @@ -240,8 +240,12 @@ value parse_engine(tables, env, cmd, arg) /* ML */ RESTORE; Field(env->s_stack, sp) = Val_int(state); modify(&Field(env->v_stack, sp), arg); - Field(env->symb_end_stack, sp) = - Field(env->symb_end_stack, Int_val(env->asp)); + asp = Int_val(env->asp); + Field(env->symb_end_stack, sp) = Field(env->symb_end_stack, asp); + if (sp > asp) { + /* This is an epsilon production. Take symb_start equal to symb_end. */ + Field(env->symb_start_stack, sp) = Field(env->symb_end_stack, asp); + } goto loop; default: /* Should not happen */ |