summaryrefslogtreecommitdiffstats
path: root/byterun/parsing.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1995-10-03 14:04:07 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1995-10-03 14:04:07 +0000
commitafc957472262504264c534efaec7d4dd4454e743 (patch)
tree7c3e7bfb773fe999faff190832e4081bfa1cacf9 /byterun/parsing.c
parent97fba0e18e7970fb1b055ae449072090c26d694c (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.c10
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 */