* nonterminal.
* This length consists of two fields: the number of terminals,
* and a number that is composed of
- * - the value of the first terminal
+ * - the number of this alternative
* - a crude measure of the number of terms and nonterminals in the
* production of this shortest string.
*/
register p_term q;
t_length i;
t_length X;
+ int cnt = 0;
X.cnt = 0;
X.val = 0;
switch (g_gettype(p)) {
case LITERAL :
case TERMINAL :
- if (!X.cnt) add(&X, 1, g_getcont(p));
- else add(&X, 1, 0);
+ add(&X, 1, 0);
break;
case ALTERNATION :
X.cnt = INFINITY;
X.val = INFINITY;
while (g_gettype(p) != EORULE) {
+ cnt++;
l = g_getlink(p);
complength(l->l_rule,&i);
+ i.val += cnt;
if (l->l_flag & DEF) {
X = i;
break;
q = g_getterm(p);
rep = r_getkind(q);
+ X.val += 1;
if ((q->t_flags&PERSISTENT) ||
rep==FIXED || rep==PLUS) {
complength(q->t_rule,&i);
add(&X, i.cnt, i.val);
- if (i.cnt == 0) X.val += ntokens;
if (rep == FIXED && r_getnum(q) > 0) {
for (rep = r_getnum(q) - 1;
rep > 0; rep--) {
}
}
}
- else {
- /* Empty producing term on this path */
- X.val += ntokens;
- }
break; }
case NONTERM : {
int nn = g_getcont(p);
}
else if (x == -1) x = INFINITY;
add(&X, x, pl->val);
- if (x == 0) {
- /* Empty producing nonterminal */
- X.val += ntokens;
- }}
+ X.val += 1;
+ }
}
p++;
}
a->cnt = INFINITY;
return;
}
- if (a->cnt == 0) a->val = v;
+ a->val += v;
a->cnt += c;
}
break;
case ALTERNATION: {
register p_link l, l1;
- int temp = 0, temp1;
+ int temp = 0, temp1, cnt = 0;
t_length count, i;
count.cnt = INFINITY;
count.val = INFINITY;
l1 = g_getlink(p);
do {
+ cnt++;
l = g_getlink(p);
complength(l->l_rule,&i);
+ i.val += cnt;
if (l->l_flag & DEF) temp = 1;
temp1 = compare(&i, &count);
if (temp1 < 0 ||
*/
extern string e_noopen; /* Error message string used often */
extern int verbose; /* Level of verbosity */
+extern int wflag; /* warnings? */
extern string lexical; /* name of lexical analyser */
extern string onerror; /* name of user error handler */
extern int ntneeded; /* ntneeded = 1 if nonterminals are included
while (argc >= 2 && (arg = argv[1], *arg == '-')) {
while (*++arg) {
switch(*arg) {
+ case 'w':
+ case 'W':
+ wflag = 1;
+ continue;
case 'v':
case 'V':
verbose++;
* Just a warning
*/
+ if (wflag) return;
if (!lineno) lineno = 1;
fprintf(stderr,"\"%s\", line %d : (Warning) ",f_input, lineno);
fprintf(stderr,s,t,u);