2 * Copyright 1993, 2000 Christopher Seiwald.
4 * This file is part of Jam - see jam.c for Copyright information.
8 * parse.c - make and destroy parse trees as driven by the parser
10 * 09/07/00 (seiwald) - ref count on PARSE to avoid freeing when used,
11 * as per Matt Armstrong.
12 * 09/11/00 (seiwald) - structure reworked to reflect that (*func)()
14 * 10/22/02 (seiwald) - working return/break/continue statements
15 * 11/04/02 (seiwald) - const-ing for string literals
24 static PARSE
*yypsave
;
30 static int yyparse (void) {
32 void *pp
= ParseAlloc(malloc
);
34 /*ParseTrace(stderr, "**");*/
38 Parse(pp
, tk
, yylval
);
45 void parse_file (const char *f
) {
46 /* suspend scan of current file and push this new file in the stream */
48 /* now parse each block of rules and execute it */
49 /* execute it outside of the parser so that recursive */
50 /* calls to yyrun() work (no recursive yyparse's) */
54 int jmp
= 0; /* JMP_NONE */
55 /* $(<) and $(>) empty in outer scope */
57 /* filled by yyparse() calling parse_save() */
59 /* if parse error or empty parse, outta here */
60 if (yyparse() || !(p
= yypsave
)) break;
61 /* run the parse tree */
62 list_free((*(p
->func
))(p
, &l
, &jmp
));
68 void parse_save (PARSE
*p
) {
74 LIST
*(*func
) (PARSE
*p
, LOL
*args
, int *jmp
),
82 PARSE
*p
= (PARSE
*)malloc(sizeof(PARSE
));
95 void parse_refer (PARSE
*p
) {
100 void parse_free (PARSE
*p
) {
101 if (--p
->refs
) return;
102 if (p
->string
) freestr(p
->string
);
103 if (p
->string1
) freestr(p
->string1
);
104 if (p
->left
) parse_free(p
->left
);
105 if (p
->right
) parse_free(p
->right
);
106 if (p
->third
) parse_free(p
->third
);
111 JAMFA_CONST
const char *multiform_suffix (int cnt
) {
112 return (cnt
== 1 ? "" : "s");