Browse Source

Treat shebang bash as line comment (if in first line).

Marco Bambini 8 years ago
parent
commit
7f85d8441b
3 changed files with 31 additions and 0 deletions
  1. 16 0
      src/compiler/gravity_lexer.c
  2. 3 0
      src/compiler/gravity_lexer.h
  3. 12 0
      src/compiler/gravity_parser.c

+ 16 - 0
src/compiler/gravity_lexer.c

@@ -601,6 +601,22 @@ gtoken_t gravity_lexer_token_type (gravity_lexer_t *lexer) {
 	return lexer->token.type;
 }
 
+void gravity_lexer_skip_line (gravity_lexer_t *lexer) {
+	while (!IS_EOF) {
+		int c = next_utf8(lexer);
+		if (is_newline(lexer, c)) {
+			INC_LINE;
+			break;
+		}
+	}
+}
+
+uint32_t gravity_lexer_lineno (gravity_lexer_t *lexer) {
+	return lexer->lineno;
+}
+
+// MARK: -
+
 void gravity_lexer_token_dump (gtoken_s token) {
 	printf("(%02d, %02d) %s: ", token.lineno, token.colno, token_name(token.type));
 	printf("%.*s\t(offset: %d len:%d)\n", token.bytes, token.value, token.position, token.bytes);

+ 3 - 0
src/compiler/gravity_lexer.h

@@ -50,6 +50,9 @@ gtoken_s			gravity_lexer_token (gravity_lexer_t *lexer);
 gtoken_s			gravity_lexer_token_next (gravity_lexer_t *lexer);
 gtoken_t			gravity_lexer_token_type (gravity_lexer_t *lexer);
 void				gravity_lexer_token_dump (gtoken_s token);
+void				gravity_lexer_skip_line (gravity_lexer_t *lexer);
+uint32_t			gravity_lexer_lineno (gravity_lexer_t *lexer);
+
 
 #if GRAVITY_LEXER_DEGUB
 void				gravity_lexer_debug (gravity_lexer_t *lexer);

+ 12 - 0
src/compiler/gravity_parser.c

@@ -1943,6 +1943,18 @@ static gnode_t *parse_macro_statement (gravity_parser_t *parser) {
 	gtoken_t type = gravity_lexer_next(lexer);
 	assert(type == TOK_MACRO);
 	
+	// check for #! and interpret #! shebang bash as one line comment
+	// only if found on first line (https://github.com/marcobambini/gravity/issues/86)
+	if (gravity_lexer_peek(lexer) == TOK_OP_NOT && gravity_lexer_lineno(lexer) == 1) {
+		// consume special ! symbol
+		type = gravity_lexer_next(lexer);
+		assert(type == TOK_OP_NOT);
+		
+		// skip until EOL
+		gravity_lexer_skip_line(lexer);
+		return NULL;
+	}
+	
 	// macro has its own parser because I don't want to mess standard syntax
 	const char *macroid = parse_identifier(parser);
 	if (macroid == NULL) goto handle_error;