[#82] add support of shebang
This commit is contained in:
parent
4a518d9e5d
commit
31052588b1
@ -1077,6 +1077,18 @@ func TestParseAndPrintPhp5InlineHtml(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseAndPrintPhp5Shebang(t *testing.T) {
|
||||||
|
src := `#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
$a;?>test<? `
|
||||||
|
|
||||||
|
actual := print(parse(src))
|
||||||
|
|
||||||
|
if src != actual {
|
||||||
|
t.Errorf("\nexpected: %s\ngot: %s\n", src, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestParseAndPrintPhp5Interface(t *testing.T) {
|
func TestParseAndPrintPhp5Interface(t *testing.T) {
|
||||||
src := `<?php
|
src := `<?php
|
||||||
interface Foo extends Bar , Baz {
|
interface Foo extends Bar , Baz {
|
||||||
|
@ -1200,6 +1200,18 @@ func TestParseAndPrintInlineHtml(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseAndPrintShebang(t *testing.T) {
|
||||||
|
src := `#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
$a;?>test<? `
|
||||||
|
|
||||||
|
actual := print(parse(src))
|
||||||
|
|
||||||
|
if src != actual {
|
||||||
|
t.Errorf("\nexpected: %s\ngot: %s\n", src, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestParseAndPrintInterface(t *testing.T) {
|
func TestParseAndPrintInterface(t *testing.T) {
|
||||||
src := `<?php
|
src := `<?php
|
||||||
interface Foo extends Bar , Baz {
|
interface Foo extends Bar , Baz {
|
||||||
|
17655
scanner/scanner.go
17655
scanner/scanner.go
File diff suppressed because it is too large
Load Diff
@ -134,6 +134,16 @@ func (lex *Lexer) Lex(lval Lval) int {
|
|||||||
);
|
);
|
||||||
|
|
||||||
main := |*
|
main := |*
|
||||||
|
"#!" any* :>> newline => {
|
||||||
|
lex.addFreeFloating(freefloating.CommentType, lex.ts, lex.te)
|
||||||
|
};
|
||||||
|
any => {
|
||||||
|
fnext html;
|
||||||
|
lex.ungetCnt(1)
|
||||||
|
};
|
||||||
|
*|;
|
||||||
|
|
||||||
|
html := |*
|
||||||
any_line+ -- '<?' => {
|
any_line+ -- '<?' => {
|
||||||
lex.ungetStr("<")
|
lex.ungetStr("<")
|
||||||
lex.setTokenPosition(token)
|
lex.setTokenPosition(token)
|
||||||
@ -159,8 +169,8 @@ func (lex *Lexer) Lex(lval Lval) int {
|
|||||||
|
|
||||||
php := |*
|
php := |*
|
||||||
whitespace_line* => {lex.addFreeFloating(freefloating.WhiteSpaceType, lex.ts, lex.te)};
|
whitespace_line* => {lex.addFreeFloating(freefloating.WhiteSpaceType, lex.ts, lex.te)};
|
||||||
'?>' newline? => {lex.setTokenPosition(token); tok = TokenID(int(';')); fnext main; fbreak;};
|
'?>' newline? => {lex.setTokenPosition(token); tok = TokenID(int(';')); fnext html; fbreak;};
|
||||||
';' whitespace_line* '?>' newline? => {lex.setTokenPosition(token); tok = TokenID(int(';')); fnext main; fbreak;};
|
';' whitespace_line* '?>' newline? => {lex.setTokenPosition(token); tok = TokenID(int(';')); fnext html; fbreak;};
|
||||||
|
|
||||||
(dnum | exponent_dnum) => {lex.setTokenPosition(token); tok = T_DNUMBER; fbreak;};
|
(dnum | exponent_dnum) => {lex.setTokenPosition(token); tok = T_DNUMBER; fbreak;};
|
||||||
bnum => {
|
bnum => {
|
||||||
|
@ -377,6 +377,51 @@ func TestTokens(t *testing.T) {
|
|||||||
assert.DeepEqual(t, expected, actual)
|
assert.DeepEqual(t, expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestShebang(t *testing.T) {
|
||||||
|
src := `#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
0.1
|
||||||
|
`
|
||||||
|
|
||||||
|
expected := []string{
|
||||||
|
"#!/usr/bin/env php\n",
|
||||||
|
"<?php",
|
||||||
|
"\n",
|
||||||
|
}
|
||||||
|
|
||||||
|
lexer := NewLexer([]byte(src))
|
||||||
|
lexer.WithFreeFloating = true
|
||||||
|
lv := &lval{}
|
||||||
|
actual := []string{}
|
||||||
|
|
||||||
|
token := lexer.Lex(lv)
|
||||||
|
assert.Equal(t, token, int(T_DNUMBER))
|
||||||
|
|
||||||
|
for _, tt := range lv.Tkn.FreeFloating {
|
||||||
|
actual = append(actual, tt.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.DeepEqual(t, expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestShebangHtml(t *testing.T) {
|
||||||
|
src := `#!/usr/bin/env php
|
||||||
|
<br/><?php
|
||||||
|
0.1
|
||||||
|
`
|
||||||
|
|
||||||
|
lexer := NewLexer([]byte(src))
|
||||||
|
lexer.WithFreeFloating = true
|
||||||
|
lv := &lval{}
|
||||||
|
|
||||||
|
token := lexer.Lex(lv)
|
||||||
|
assert.Equal(t, token, int(T_INLINE_HTML))
|
||||||
|
assert.Equal(t, lv.Tkn.FreeFloating[0].Value, "#!/usr/bin/env php\n")
|
||||||
|
|
||||||
|
token = lexer.Lex(lv)
|
||||||
|
assert.Equal(t, token, int(T_DNUMBER))
|
||||||
|
}
|
||||||
|
|
||||||
func TestNumberTokens(t *testing.T) {
|
func TestNumberTokens(t *testing.T) {
|
||||||
src := `<?php
|
src := `<?php
|
||||||
0.1
|
0.1
|
||||||
|
Loading…
Reference in New Issue
Block a user