Allow shebang/hashbang (#!) as first line in 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-05-16 12:51:24 -07:00
commit de Sara Golemon
commit d6d9955136
10 arquivos alterados com 21397 adições e 21291 exclusões
@@ -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
@@ -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
+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
+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