SCCS-vsn: usr.bin/tn3270/tools/mkmake.y 1.7
+%token <intval> FOR IN DO DONE
%token <string> TOKEN QUOTED_STRING
%token <string> TOKEN QUOTED_STRING
-%token <intval> MACRO_CHAR BREAK_CHAR WHITE_SPACE NL END_OF_FILE
-%token <intval> ':' '=' '$' '{' '}'
-%type <same> target assignment actions action tokens token
+%token <intval> MACRO_CHAR WHITE_SPACE NL END_OF_FILE
+%token <intval> ':' '=' '$' '{' '}' ';' '-' '@' '(' ')'
+%type <same> target assignment actions action
+%type <same> for_statement maybe_at_minus tokens token
%type <intval> special_chars white_space macro_char
%%
%type <intval> special_chars white_space macro_char
%%
;
action: white_space tokens NL
;
action: white_space tokens NL
+ {
+ $$ = $2;
+ }
+ | white_space for_statement NL
+for_statement: maybe_at_minus FOR white_space token
+ white_space IN white_space tokens maybe_white_space ';'
+ maybe_white_space DO white_space '(' maybe_white_space
+ tokens maybe_white_space ')' maybe_white_space ';'
+ maybe_white_space DONE
+ {
+ $$ = for_statement($1, $4, expand_variables($8, 0), $16);
+ }
+ ;
+
+maybe_at_minus: /* empty */
+ {
+ $$ = same_copy(null);
+ }
+ | '@'
+ {
+ char buffer[2];
+
+ buffer[0] = $1;
+ buffer[1] = 0;
+ $$ = same_item(string_lookup(buffer));
+ }
+ | '-'
+ {
+ char buffer[2];
+
+ buffer[0] = $1;
+ buffer[1] = 0;
+ $$ = same_item(string_lookup(buffer));
+ }
+ ;
tokens : token
| tokens token
{
tokens : token
| tokens token
{
+ | '-'
+ {
+ $$ = same_char('-');
+ }
+ | '@'
+ {
+ $$ = same_char('@');
+ }
;
macro_char: MACRO_CHAR
| '$'
;
;
macro_char: MACRO_CHAR
| '$'
;
-special_chars : BREAK_CHAR
- | MACRO_CHAR
+special_chars : MACRO_CHAR
} while (token != list);
}
} while (token != list);
}
same_unlink(token)
same_t
*token;
{
same_unlink(token)
same_t
*token;
{
+ return 0;
+ }
+ if ((tmp = token->nexttoken) == token) {
+ tmp = 0;
}
token->lasttoken->nexttoken = token->nexttoken;
token->nexttoken->lasttoken = token->lasttoken;
token->nexttoken = token->lasttoken = token;
}
token->lasttoken->nexttoken = token->nexttoken;
token->nexttoken->lasttoken = token->lasttoken;
token->nexttoken = token->lasttoken = token;
+ return tmp;
+}
+
+same_t *
+same_char(ch)
+char ch;
+{
+ char buffer[2];
+
+ buffer[0] = ch;
+ buffer[1] = 0;
+
+ return same_item(string_lookup(buffer));
do {
target->action_list = same_cat(target->action_list,
same_copy(actions));
do {
target->action_list = same_cat(target->action_list,
same_copy(actions));
- if ((ptr = target->nexttoken) == target) {
- ptr = 0;
- }
- same_unlink(target);
+ ptr = same_unlink(target);
add_target(target);
target = ptr;
} while (target);
add_target(target);
target = ptr;
} while (target);
if ((ptr = same_search(variables, variable)) != 0) {
same_free(ptr->value_list);
if ((ptr = same_search(variables, variable)) != 0) {
same_free(ptr->value_list);
+ (void) same_unlink(ptr);
same_free(ptr);
}
variable->value_list = value;
same_free(ptr);
}
variable->value_list = value;
+
+same_t *
+expand_variables(token, free)
+same_t *token;
+int free;
+{
+ same_t *head = 0;
+
+ if (!free) {
+ token = same_copy(token); /* Get our private copy */
+ }
+
+ while (token) {
+ char *string = token->string->string;
+ same_t *tmp = same_unlink(token);
+
+ if ((string[0] == '$') && (string[1] == '{')) {/* '}' Expand time */
+ int len = strlen(string);
+
+ string[len-1] = 0;
+ head = same_cat(head, expand_variables(
+ value_of(same_item(string_lookup(string+2))), 1));
+ string[len-1] = '}';
+ } else {
+ head = same_cat(head, token);
+ }
+ token = tmp;
+ }
+ return head;
+}
+
same_t *
variable(var_name)
same_t *var_name;
same_t *
variable(var_name)
same_t *var_name;
+same_t *
+for_statement(special, variable, list, commands)
+same_t
+ *special,
+ *variable,
+ *list,
+ *commands;
+{
+ return same_cat(special, same_cat(variable, same_cat(list, commands)));
+}
+
+int
+token_type(string)
+char *string;
+{
+ switch (string[0]) {
+ case 'f':
+ if (strcmp(string, "for") == 0) {
+ return FOR;
+ }
+ break;
+ case 'd':
+ if (string[1] == 'o') {
+ if (strcmp(string, "do") == 0) {
+ return DO;
+ } else if (strcmp(string, "done") == 0) {
+ return DONE;
+ }
+ }
+ break;
+ case 'i':
+ if (strcmp(string, "in") == 0) {
+ return IN;
+ }
+ break;
+ default:
+ break;
+ }
+ return TOKEN;
+}
+
+
yylex()
{
#define ret_token(c) if (bufptr != buffer) { \
yylex()
{
#define ret_token(c) if (bufptr != buffer) { \
*bufptr = 0; \
bufptr = buffer; \
yylval.string = string_lookup(buffer); \
*bufptr = 0; \
bufptr = buffer; \
yylval.string = string_lookup(buffer); \
+ return token_type(buffer); \
}
#define save(c) { last_char = c; last_saved = 1; }
#if defined(YYDEBUG)
}
#define save(c) { last_char = c; last_saved = 1; }
#if defined(YYDEBUG)
case '<':
case '?':
ret_token(c);
Return(MACRO_CHAR, c);
case '<':
case '?':
ret_token(c);
Return(MACRO_CHAR, c);
- case '-':
- case '(':
- case ')':
- case ';':
- ret_token(c);
- Return(BREAK_CHAR, c);
case '\t':
case ' ':
ret_token(c);
Return(WHITE_SPACE, c);
case '\t':
case ' ':
ret_token(c);
Return(WHITE_SPACE, c);
case '=':
case '$':
case '{':
case '}':
case '=':
case '$':
case '{':
case '}':
ret_token(c);
Return(c,c);
case '\'':
ret_token(c);
Return(c,c);
case '\'':