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
;
26 void parse_file (const char *f
) {
27 /* suspend scan of current file and push this new file in the stream */
29 /* now parse each block of rules and execute it */
30 /* execute it outside of the parser so that recursive */
31 /* calls to yyrun() work (no recursive yyparse's) */
35 int jmp
= 0; /* JMP_NONE */
36 /* $(<) and $(>) empty in outer scope */
38 /* filled by yyparse() calling parse_save() */
40 /* if parse error or empty parse, outta here */
41 if (yyparse() || !(p
= yypsave
)) break;
42 /* run the parse tree */
43 list_free((*(p
->func
))(p
, &l
, &jmp
));
49 void parse_save (PARSE
*p
) {
55 LIST
*(*func
) (PARSE
*p
, LOL
*args
, int *jmp
),
63 PARSE
*p
= (PARSE
*)malloc(sizeof(PARSE
));
76 void parse_refer (PARSE
*p
) {
81 void parse_free (PARSE
*p
) {
82 if (--p
->refs
) return;
83 if (p
->string
) freestr( p
->string
);
84 if (p
->string1
) freestr( p
->string1
);
85 if (p
->left
) parse_free( p
->left
);
86 if (p
->right
) parse_free( p
->right
);
87 if (p
->third
) parse_free( p
->third
);
92 const char *multiFormSfx (int cnt
) {