Allow shebang/hashbang (#!) as first line of Hack files

A shebang allow a script to be run as an executable on UNIX
systems.  PHP allows shebangs, but Hack does not.  This
changeset allows Hack to have shebangs like in PHP.
Esse commit está contido em:
Matt Glazar
2013-04-30 14:00:26 -07:00
commit de Sara Golemon
commit eb6eb3f495
11 arquivos alterados com 21401 adições e 21295 exclusões
+4 -4
Ver Arquivo
@@ -79,12 +79,12 @@
#line 1 "hphp.y"
#ifdef TEST_PARSER
#include "util/parser/test/parser.h"
#include "hphp/util/parser/test/parser.h"
#else
#include "compiler/parser/parser.h"
#include "hphp/compiler/parser/parser.h"
#endif
#include "util/util.h"
#include "util/logger.h"
#include "hphp/util/util.h"
#include "hphp/util/logger.h"
// macros for bison
#define YYSTYPE HPHP::HPHP_PARSER_NS::Token
@@ -0,0 +1,3 @@
#!/usr/bin/env hhvm
<?php
echo "Hashbang/shebang allowed before <?php\n";
@@ -0,0 +1 @@
Hashbang/shebang allowed before <?php
@@ -0,0 +1,4 @@
#!/usr/bin/env hhvm
<?php
echo "Hashbang/shebang and whitespace allowed before <?php\n";
@@ -0,0 +1,2 @@
Hashbang/shebang and whitespace allowed before <?php
+3
Ver Arquivo
@@ -0,0 +1,3 @@
#!/usr/bin/env hhvm
<?hh
echo "Hashbang/shebang allowed before <?hh\n";
@@ -0,0 +1 @@
Hashbang/shebang allowed before <?hh
@@ -0,0 +1,4 @@
#!/usr/bin/env hhvm
<?hh
echo "Hashbang/shebang and whitespace disallowed before <?hh\n";
@@ -0,0 +1 @@
HipHop Fatal error: syntax error, unexpected T_HACK_ERROR, expecting $end in %s on line 2
+21 -10
Ver Arquivo
@@ -153,6 +153,7 @@ static int getNextTokenType(int t) {
%x ST_IN_HTML
%x ST_IN_SCRIPTING
%x ST_AFTER_HASHBANG
%x ST_DOUBLE_QUOTES
%x ST_BACKQUOTE
%x ST_HEREDOC
@@ -593,7 +594,7 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
<INITIAL>"#"[^\n]*"\n" {
_scanner->setHashBang(yytext, yyleng);
BEGIN(ST_IN_SCRIPTING);
yy_push_state(ST_IN_HTML, yyscanner);
yy_push_state(ST_AFTER_HASHBANG, yyscanner);
return T_INLINE_HTML;
}
@@ -604,12 +605,13 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
return T_INLINE_HTML;
}
<ST_IN_HTML>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
<ST_IN_HTML,ST_AFTER_HASHBANG>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
SETTOKEN;
BEGIN(ST_IN_HTML);
return T_INLINE_HTML;
}
<INITIAL,ST_IN_HTML>"<?"|("<?php"([ \t]|{NEWLINE}))|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" {
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<?"|("<?php"([ \t]|{NEWLINE}))|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" {
SETTOKEN;
if (_scanner->shortTags() || yyleng > 2) {
if (YY_START == INITIAL) {
@@ -622,12 +624,14 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
if (YY_START == INITIAL) {
BEGIN(ST_IN_SCRIPTING);
yy_push_state(ST_IN_HTML, yyscanner);
} else if (YY_START == ST_AFTER_HASHBANG) {
BEGIN(ST_IN_HTML);
}
return T_INLINE_HTML;
}
}
<INITIAL,ST_IN_HTML>"<%="|"<?=" {
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<%="|"<?=" {
SETTOKEN;
if ((yytext[1]=='%' && _scanner->aspTags()) ||
(yytext[1]=='?' && _scanner->shortTags())) {
@@ -641,12 +645,14 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
if (YY_START == INITIAL) {
BEGIN(ST_IN_SCRIPTING);
yy_push_state(ST_IN_HTML, yyscanner);
} else if (YY_START == ST_AFTER_HASHBANG) {
BEGIN(ST_IN_HTML);
}
return T_INLINE_HTML;
}
}
<INITIAL,ST_IN_HTML>"<%" {
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<%" {
SETTOKEN;
if (_scanner->aspTags()) {
if (YY_START == INITIAL) {
@@ -659,18 +665,23 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
if (YY_START == INITIAL) {
BEGIN(ST_IN_SCRIPTING);
yy_push_state(ST_IN_HTML, yyscanner);
} else if (YY_START == ST_AFTER_HASHBANG) {
BEGIN(ST_IN_HTML);
}
return T_INLINE_HTML;
}
}
<INITIAL,ST_IN_HTML>"<?hh"([ \t]|{NEWLINE}) {
if (YY_START != INITIAL) {
_scanner->error("Hack mode: content before <?hh");
return T_HACK_ERROR;
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<?hh"([ \t]|{NEWLINE}) {
if (YY_START == INITIAL) {
BEGIN(ST_IN_SCRIPTING);
} else if (YY_START == ST_AFTER_HASHBANG) {
yy_pop_state(yyscanner);
} else {
_scanner->error("Hack mode: content before <?hh");
return T_HACK_ERROR;
}
STEPPOS;
BEGIN(ST_IN_SCRIPTING);
_scanner->setHackMode();
return T_OPEN_TAG;
}
+21357 -21281
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff