It seems that XHPAST doesn't properly parse strings contains interpolated variables. Specifically, "This string contains no variables" and "This string contains $variables" are both parsed as n_STRING_SCALAR. See https://secure.phabricator.com/xhpast/view/729/ for example... tokenizing this same file with token_get_all produces the following:
array ( 0 => array ( 0 => 374, 1 => '<?php ', 2 => 1, ), 1 => array ( 0 => 377, 1 => ' ', 2 => 1, ), 2 => array ( 0 => 317, 1 => 'echo', 2 => 3, ), 3 => array ( 0 => 377, 1 => ' ', 2 => 3, ), 4 => array ( 0 => 316, 1 => '"This string contains no variables."', 2 => 3, ), 5 => ';', 6 => array ( 0 => 377, 1 => ' ', 2 => 3, ), 7 => array ( 0 => 317, 1 => 'echo', 2 => 4, ), 8 => array ( 0 => 377, 1 => ' ', 2 => 4, ), 9 => '"', 10 => array ( 0 => 315, 1 => 'This string contains ', 2 => 4, ), 11 => array ( 0 => 310, 1 => '$variables', 2 => 4, ), 12 => array ( 0 => 315, 1 => '.', 2 => 4, ), 13 => '"', 14 => ';', )
More succinctly:
// "This string contains no variables." array( array( 0 => T_CONSTANT_ENCAPSED_STRING, 1 => '"This string contains no variables."', 2 => 3, ), ); // "This string contains $variables." array( '"', array( 0 => T_ENCAPSED_AND_WHITESPACE, 1 => 'This string contains ', 2 => 4, ), array( 0 => T_VARIABLE, 1 => '$variables', 2 => 4, ), array( 0 => T_ENCAPSED_AND_WHITESPACE, 1 => '.', 2 => 4, ), '"', );