struct token *lexer_read_substitution(struct lexer_book *bk) { int parenthesis = 0; char c = lexer_next_peek(bk); if(c != '$') lexer_report_error(bk, "Expecting $ for variable substitution."); lexer_next_char(bk); /* Jump $ */ if(lexer_next_peek(bk) == '(') { lexer_next_char(bk); /* Jump ( */ parenthesis = 1; } struct token *name = lexer_read_syntax_name(bk); name->type = SUBSTITUTION; if(parenthesis) { if(lexer_next_peek(bk) == ')') lexer_next_char(bk); /* Jump ) */ else lexer_report_error(bk, "Expecting ) for closing variable substitution."); } return name; }
struct token *lexer_read_substitution(struct lexer *lx) { char closer = 0; //closer is either 0 (no closer), ) or }. char c = lexer_next_peek(lx); if(c != '$') lexer_report_error(lx, "Expecting $ for variable substitution."); lexer_next_char(lx); /* Jump $ */ if(lexer_next_peek(lx) == '(') { lexer_next_char(lx); /* Jump ( */ closer = ')'; } else if(lexer_next_peek(lx) == '{') { lexer_next_char(lx); /* Jump { */ closer = '}'; } struct token *name = lexer_read_syntax_name(lx); name->type = TOKEN_SUBSTITUTION; if(closer) { if(lexer_next_peek(lx) == closer) lexer_next_char(lx); /* Jump ) */ else lexer_report_error(lx, "Expecting %c for closing variable substitution.", closer); } return name; }
accept_t lexer_read_syntax(struct lexer_book * bk) { lexer_discard_white_space(bk); struct token *name = lexer_read_syntax_name(bk); if(strcmp("export", name->lexeme) == 0) return lexer_read_syntax_export(bk, name); else if(lexer_unquoted_look_ahead_count(bk, "=") > -1) return lexer_read_variable(bk, name); else { lexer_roll_back(bk, strlen(name->lexeme)); lexer_report_error(bk, "Unrecognized keyword: %s.", name->lexeme); } return NO; }
accept_t lexer_read_syntax_export(struct lexer_book *bk, struct token *name) { lexer_discard_white_space(bk); name->type = SYNTAX; lexer_push_token(bk, name); if(lexer_unquoted_look_ahead_count(bk, "=") > -1) return lexer_read_variable(bk, lexer_read_syntax_name(bk)); else return lexer_read_variable_list(bk); return YES; }
int lexer_read_syntax_or_variable(struct lexer * lx) { lexer_discard_white_space(lx); struct token *name = lexer_read_syntax_name(lx); if(strcmp("export", name->lexeme) == 0) return lexer_read_syntax_export(lx, name); else if(lexer_unquoted_look_ahead_count(lx, "=") > -1) return lexer_read_variable(lx, name); else { lexer_roll_back(lx, strlen(name->lexeme)); lexer_report_error(lx, "Unrecognized keyword: %s.", name->lexeme); } return 1; }
int lexer_read_syntax_export(struct lexer *lx, struct token *name) { lexer_discard_white_space(lx); //name->lexeme is "export" name->type = TOKEN_SYNTAX; lexer_push_token(lx, name); if(lexer_unquoted_look_ahead_count(lx, "=") > -1) lexer_read_variable(lx, lexer_read_syntax_name(lx)); else lexer_read_variable_list(lx); lexer_push_token(lx, lexer_pack_token(lx, TOKEN_NEWLINE)); return 1; }
int lexer_read_variable_list(struct lexer * lx) { int c; while((c = lexer_next_peek(lx)) != '\n') { lexer_discard_white_space(lx); if(c == '#') { lexer_discard_comments(lx); lexer_roll_back(lx, 1); //Recover the newline break; } lexer_push_token(lx, lexer_read_syntax_name(lx)); } lexer_add_to_lexeme(lx, lexer_next_char(lx)); //Drop the newline lexer_push_token(lx, lexer_pack_token(lx, TOKEN_NEWLINE)); return 1; }
accept_t lexer_read_variable_list(struct lexer_book * bk) { int c; while((c = lexer_next_peek(bk)) != '\n') { lexer_discard_white_space(bk); if(c == '#') { lexer_discard_comments(bk); lexer_roll_back(bk, 1); //Recover the newline break; } lexer_push_token(bk, lexer_read_syntax_name(bk)); } lexer_add_to_lexeme(bk, lexer_next_char(bk)); //Drop the newline lexer_push_token(bk, lexer_pack_token(bk, NEWLINE)); return YES; }