z7zmey / php-parser

PHP parser written in Go

Home Page:https://php-parser.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

backslash before newline in single quoted string

imuli opened this issue · comments

While backslash-newline doesn't have any special meaning inside a string in PHP,
it is syntatically valid. Currently parsing somethng like

<?php
echo "/ --- \
| foo |
\ --- /" . "\n";
echo '/ --- \
| bar |
\ --- /' . "\n";

yields syntax errors on the second string

==> multi_line_strings.php
syntax error: unexpected $unk at line 5
syntax error: unexpected T_DEC, expecting T_STRING at line 7
  | [*node.Root]
  |   "Position": Pos{Line: 2-7 Pos: 7-83};
  |   "Stmts":
  |     [*stmt.Echo]
  |       "Position": Pos{Line: 2-4 Pos: 7-44};
  |       "Exprs":
  |         [*binary.Concat]
  |           "Position": Pos{Line: 2-4 Pos: 12-43};
  |           "Left":
  |             [*scalar.String]
  |               "Position": Pos{Line: 2-4 Pos: 12-36};
  |               "Value": "/ --- \
| foo |
\ --- /";
  |           "Right":
  |             [*scalar.String]
  |               "Position": Pos{Line: 4-4 Pos: 40-43};
  |               "Value": "\n";
  |     [*stmt.Expression]
  |       "Position": Pos{Line: 7-7 Pos: 79-83};
  |       "Expr":
  |         [*scalar.String]
  |           "Position": Pos{Line: 7-7 Pos: 79-82};
  |           "Value": "\n";

rather than two valid strings

==> /home/imuli/src/github.com/imuli/semantic-php/snippets/multi_line_strings.php
  | [*node.Root]
  |   "Position": Pos{Line: 2-7 Pos: 7-83};
  |   "Stmts":
  |     [*stmt.Echo]
  |       "Position": Pos{Line: 2-4 Pos: 7-44};
  |       "Exprs":
  |         [*binary.Concat]
  |           "Position": Pos{Line: 2-4 Pos: 12-43};
  |           "Left":
  |             [*scalar.String]
  |               "Position": Pos{Line: 2-4 Pos: 12-36};
  |               "Value": "/ --- \
| foo |
\ --- /";
  |           "Right":
  |             [*scalar.String]
  |               "Position": Pos{Line: 4-4 Pos: 40-43};
  |               "Value": "\n";
  |     [*stmt.Echo]
  |       "Position": Pos{Line: 5-7 Pos: 46-83};
  |       "Exprs":
  |         [*binary.Concat]
  |           "Position": Pos{Line: 5-7 Pos: 51-82};
  |           "Left":
  |             [*scalar.String]
  |               "Position": Pos{Line: 5-7 Pos: 51-75};
  |               "Value": '/ --- \
| bar |
\ --- /';
  |           "Right":
  |             [*scalar.String]
  |               "Position": Pos{Line: 7-7 Pos: 79-82};
  |               "Value": "\n";