diff --git a/src/wren_compiler.c b/src/wren_compiler.c index ccbea58c..58ab3033 100644 --- a/src/wren_compiler.c +++ b/src/wren_compiler.c @@ -796,6 +796,17 @@ static void nextToken(Parser* parser) peekChar(parser) == '_' ? TOKEN_STATIC_FIELD : TOKEN_FIELD); return; + case '#': + // Ignore shebang on the first line. + if (peekChar(parser) == '!' && parser->currentLine == 1) + { + skipLineComment(parser); + break; + } + + lexError(parser, "Invalid character '%c'.", c); + return; + default: if (isName(c)) { diff --git a/test/shebang/shebang.wren b/test/shebang/shebang.wren new file mode 100644 index 00000000..83f35c0a --- /dev/null +++ b/test/shebang/shebang.wren @@ -0,0 +1,2 @@ +#!/bin/wren +IO.print("ok") // expect: ok diff --git a/test/shebang/shebang_at_eof.wren b/test/shebang/shebang_at_eof.wren new file mode 100644 index 00000000..0eabdbab --- /dev/null +++ b/test/shebang/shebang_at_eof.wren @@ -0,0 +1 @@ +#!/bin/wren \ No newline at end of file diff --git a/test/shebang/shebang_at_other_line.wren b/test/shebang/shebang_at_other_line.wren new file mode 100644 index 00000000..4fa3ac95 --- /dev/null +++ b/test/shebang/shebang_at_other_line.wren @@ -0,0 +1,3 @@ +// expect error line 3 +IO.print("nope") +#!/bin/wren \ No newline at end of file diff --git a/test/shebang/shebang_invalid.wren b/test/shebang/shebang_invalid.wren new file mode 100644 index 00000000..828c4fa0 --- /dev/null +++ b/test/shebang/shebang_invalid.wren @@ -0,0 +1,3 @@ +#/invalid/shebang +// expect error line 1 +IO.print("nope")