PageRenderTime 49ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/php/php_lexer.l

http://yaxx.googlecode.com/
LEX | 927 lines | 536 code | 174 blank | 217 comment | 0 complexity | 1f4a0efc9363d300d102b700287d7684 MD5 | raw file
Possible License(s): AGPL-1.0
  1. %{
  2. /*
  3. +----------------------------------------------------------------------+
  4. | Zend Engine |
  5. +----------------------------------------------------------------------+
  6. | Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
  7. +----------------------------------------------------------------------+
  8. | This source file is subject to version 2.00 of the Zend license, |
  9. | that is bundled with this package in the file LICENSE, and is |
  10. | available through the world-wide-web at the following url: |
  11. | http://www.zend.com/license/2_00.txt. |
  12. | If you did not receive a copy of the Zend license and are unable to |
  13. | obtain it through the world-wide-web, please send a note to |
  14. | license@zend.com so we can mail you a copy immediately. |
  15. +----------------------------------------------------------------------+
  16. | Authors: Andi Gutmans <andi@zend.com> |
  17. | Zeev Suraski <zeev@zend.com> |
  18. +----------------------------------------------------------------------+
  19. */
  20. /* $Id: php_lexer.l,v 1.1 2006/10/02 01:56:09 yijunsf Exp $ */
  21. #include "php_parser.tab.h"
  22. int getLineno(){
  23. return yylineno;
  24. }
  25. %}
  26. %x ST_IN_SCRIPTING
  27. %x ST_DOUBLE_QUOTES
  28. %x ST_SINGLE_QUOTE
  29. %x ST_BACKQUOTE
  30. %x ST_HEREDOC
  31. %x ST_LOOKING_FOR_PROPERTY
  32. %x ST_LOOKING_FOR_VARNAME
  33. %x ST_COMMENT
  34. %x ST_DOC_COMMENT
  35. %x ST_ONE_LINE_COMMENT
  36. %option stack
  37. %{
  38. int asp_tags = 0;
  39. int short_tags = 0;
  40. int lineno = 0;
  41. int comment_start_line = 0;
  42. int heredoc_len = 4;
  43. int * heredoc;
  44. %}
  45. LNUM [0-9]+
  46. DNUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*)
  47. EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
  48. HNUM "0x"[0-9a-fA-F]+
  49. LABEL [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
  50. WHITESPACE [ \n\r\t]+
  51. TABS_AND_SPACES [ \t]*
  52. TOKENS [;:,.\[\]()|^&+-/*=%!~$<>?@]
  53. ENCAPSED_TOKENS [\[\]{}$]
  54. ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+
  55. ANY_CHAR (.|[\n])
  56. NEWLINE ("\r"|"\n"|"\r\n")
  57. %option yylineno
  58. %option noyywrap
  59. %%
  60. <ST_IN_SCRIPTING>"exit" {
  61. return T_EXIT;
  62. }
  63. <ST_IN_SCRIPTING>"die" {
  64. return T_EXIT;
  65. }
  66. <ST_IN_SCRIPTING>"function" {
  67. return T_FUNCTION;
  68. }
  69. <ST_IN_SCRIPTING>"const" {
  70. return T_CONST;
  71. }
  72. <ST_IN_SCRIPTING>"return" {
  73. return T_RETURN;
  74. }
  75. <ST_IN_SCRIPTING>"try" {
  76. return T_TRY;
  77. }
  78. <ST_IN_SCRIPTING>"catch" {
  79. return T_CATCH;
  80. }
  81. <ST_IN_SCRIPTING>"throw" {
  82. return T_THROW;
  83. }
  84. <ST_IN_SCRIPTING>"if" {
  85. return T_IF;
  86. }
  87. <ST_IN_SCRIPTING>"elseif" {
  88. return T_ELSEIF;
  89. }
  90. <ST_IN_SCRIPTING>"endif" {
  91. return T_ENDIF;
  92. }
  93. <ST_IN_SCRIPTING>"else" {
  94. return T_ELSE;
  95. }
  96. <ST_IN_SCRIPTING>"while" {
  97. return T_WHILE;
  98. }
  99. <ST_IN_SCRIPTING>"endwhile" {
  100. return T_ENDWHILE;
  101. }
  102. <ST_IN_SCRIPTING>"do" {
  103. return T_DO;
  104. }
  105. <ST_IN_SCRIPTING>"for" {
  106. return T_FOR;
  107. }
  108. <ST_IN_SCRIPTING>"endfor" {
  109. return T_ENDFOR;
  110. }
  111. <ST_IN_SCRIPTING>"foreach" {
  112. return T_FOREACH;
  113. }
  114. <ST_IN_SCRIPTING>"endforeach" {
  115. return T_ENDFOREACH;
  116. }
  117. <ST_IN_SCRIPTING>"declare" {
  118. return T_DECLARE;
  119. }
  120. <ST_IN_SCRIPTING>"enddeclare" {
  121. return T_ENDDECLARE;
  122. }
  123. <ST_IN_SCRIPTING>"instanceof" {
  124. return T_INSTANCEOF;
  125. }
  126. <ST_IN_SCRIPTING>"as" {
  127. return T_AS;
  128. }
  129. <ST_IN_SCRIPTING>"switch" {
  130. return T_SWITCH;
  131. }
  132. <ST_IN_SCRIPTING>"endswitch" {
  133. return T_ENDSWITCH;
  134. }
  135. <ST_IN_SCRIPTING>"case" {
  136. return T_CASE;
  137. }
  138. <ST_IN_SCRIPTING>"default" {
  139. return T_DEFAULT;
  140. }
  141. <ST_IN_SCRIPTING>"break" {
  142. return T_BREAK;
  143. }
  144. <ST_IN_SCRIPTING>"continue" {
  145. return T_CONTINUE;
  146. }
  147. <ST_IN_SCRIPTING>"echo" {
  148. return T_ECHO;
  149. }
  150. <ST_IN_SCRIPTING>"print" {
  151. return T_PRINT;
  152. }
  153. <ST_IN_SCRIPTING>"class" {
  154. return T_CLASS;
  155. }
  156. <ST_IN_SCRIPTING>"aspect" {
  157. /* added by William Candillon <wcandillon@php.net> */
  158. return T_ASPECT;
  159. }
  160. <ST_IN_SCRIPTING>"before" {
  161. /* added by William Candillon <wcandillon@php.net> */
  162. return T_BEFORE;
  163. }
  164. <ST_IN_SCRIPTING>"around" {
  165. /* added by William Candillon <wcandillon@php.net> */
  166. return T_AROUND;
  167. }
  168. <ST_IN_SCRIPTING>"after" {
  169. /* added by William Candillon <wcandillon@php.net> */
  170. return T_AFTER;
  171. }
  172. <ST_IN_SCRIPTING>"pointcut" {
  173. /* added by William Candillon <wcandillon@php.net> */
  174. return T_POINTCUT;
  175. }
  176. <ST_IN_SCRIPTING>"exec" {
  177. /* added by William Candillon <wcandillon@php.net> */
  178. return T_EXEC;
  179. }
  180. <ST_IN_SCRIPTING>"call" {
  181. /* added by William Candillon <wcandillon@php.net> */
  182. return T_CALL;
  183. }
  184. <ST_IN_SCRIPTING>"set" {
  185. /* added by William Candillon <wcandillon@php.net> */
  186. return T_SET;
  187. }
  188. <ST_IN_SCRIPTING>"get" {
  189. /* added by William Candillon <wcandillon@php.net> */
  190. return T_GET;
  191. }
  192. <ST_IN_SCRIPTING>"interface" {
  193. return T_INTERFACE;
  194. }
  195. <ST_IN_SCRIPTING>"extends" {
  196. return T_EXTENDS;
  197. }
  198. <ST_IN_SCRIPTING>"implements" {
  199. return T_IMPLEMENTS;
  200. }
  201. <ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"->" {
  202. yy_push_state(ST_LOOKING_FOR_PROPERTY);
  203. return T_OBJECT_OPERATOR;
  204. }
  205. <ST_LOOKING_FOR_PROPERTY>{LABEL} {
  206. yy_pop_state();
  207. return T_STRING;
  208. }
  209. <ST_LOOKING_FOR_PROPERTY>{ANY_CHAR} {
  210. yyless(0);
  211. yy_pop_state();
  212. }
  213. <ST_IN_SCRIPTING>"::" {
  214. return T_PAAMAYIM_NEKUDOTAYIM;
  215. }
  216. <ST_IN_SCRIPTING>"new" {
  217. return T_NEW;
  218. }
  219. <ST_IN_SCRIPTING>"clone" {
  220. return T_CLONE;
  221. }
  222. <ST_IN_SCRIPTING>"var" {
  223. return T_VAR;
  224. }
  225. <ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("int"|"integer"){TABS_AND_SPACES}")" {
  226. return T_INT_CAST;
  227. }
  228. <ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("real"|"double"|"float"){TABS_AND_SPACES}")" {
  229. return T_DOUBLE_CAST;
  230. }
  231. <ST_IN_SCRIPTING>"("{TABS_AND_SPACES}"string"{TABS_AND_SPACES}")" {
  232. return T_STRING_CAST;
  233. }
  234. <ST_IN_SCRIPTING>"("{TABS_AND_SPACES}"array"{TABS_AND_SPACES}")" {
  235. return T_ARRAY_CAST;
  236. }
  237. <ST_IN_SCRIPTING>"("{TABS_AND_SPACES}"object"{TABS_AND_SPACES}")" {
  238. return T_OBJECT_CAST;
  239. }
  240. <ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("bool"|"boolean"){TABS_AND_SPACES}")" {
  241. return T_BOOL_CAST;
  242. }
  243. <ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("unset"){TABS_AND_SPACES}")" {
  244. return T_UNSET_CAST;
  245. }
  246. <ST_IN_SCRIPTING>"eval" {
  247. return T_EVAL;
  248. }
  249. <ST_IN_SCRIPTING>"include" {
  250. return T_INCLUDE;
  251. }
  252. <ST_IN_SCRIPTING>"include_once" {
  253. return T_INCLUDE_ONCE;
  254. }
  255. <ST_IN_SCRIPTING>"require" {
  256. return T_REQUIRE;
  257. }
  258. <ST_IN_SCRIPTING>"require_once" {
  259. return T_REQUIRE_ONCE;
  260. }
  261. <ST_IN_SCRIPTING>"use" {
  262. return T_USE;
  263. }
  264. <ST_IN_SCRIPTING>"global" {
  265. return T_GLOBAL;
  266. }
  267. <ST_IN_SCRIPTING>"isset" {
  268. return T_ISSET;
  269. }
  270. <ST_IN_SCRIPTING>"empty" {
  271. return T_EMPTY;
  272. }
  273. <ST_IN_SCRIPTING>"__halt_compiler" {
  274. return T_HALT_COMPILER;
  275. }
  276. <ST_IN_SCRIPTING>"static" {
  277. return T_STATIC;
  278. }
  279. <ST_IN_SCRIPTING>"abstract" {
  280. return T_ABSTRACT;
  281. }
  282. <ST_IN_SCRIPTING>"final" {
  283. return T_FINAL;
  284. }
  285. <ST_IN_SCRIPTING>"private" {
  286. return T_PRIVATE;
  287. }
  288. <ST_IN_SCRIPTING>"protected" {
  289. return T_PROTECTED;
  290. }
  291. <ST_IN_SCRIPTING>"public" {
  292. return T_PUBLIC;
  293. }
  294. <ST_IN_SCRIPTING>"unset" {
  295. return T_UNSET;
  296. }
  297. <ST_IN_SCRIPTING>"=>" {
  298. return T_DOUBLE_ARROW;
  299. }
  300. <ST_IN_SCRIPTING>"list" {
  301. return T_LIST;
  302. }
  303. <ST_IN_SCRIPTING>"array" {
  304. return T_ARRAY;
  305. }
  306. <ST_IN_SCRIPTING>"++" {
  307. return T_INC;
  308. }
  309. <ST_IN_SCRIPTING>"--" {
  310. return T_DEC;
  311. }
  312. <ST_IN_SCRIPTING>"===" {
  313. return T_IS_IDENTICAL;
  314. }
  315. <ST_IN_SCRIPTING>"!==" {
  316. return T_IS_NOT_IDENTICAL;
  317. }
  318. <ST_IN_SCRIPTING>"==" {
  319. return T_IS_EQUAL;
  320. }
  321. <ST_IN_SCRIPTING>"!="|"<>" {
  322. return T_IS_NOT_EQUAL;
  323. }
  324. <ST_IN_SCRIPTING>"<=" {
  325. return T_IS_SMALLER_OR_EQUAL;
  326. }
  327. <ST_IN_SCRIPTING>">=" {
  328. return T_IS_GREATER_OR_EQUAL;
  329. }
  330. <ST_IN_SCRIPTING>"+=" {
  331. return T_PLUS_EQUAL;
  332. }
  333. <ST_IN_SCRIPTING>"-=" {
  334. return T_MINUS_EQUAL;
  335. }
  336. <ST_IN_SCRIPTING>"*=" {
  337. return T_MUL_EQUAL;
  338. }
  339. <ST_IN_SCRIPTING>"/=" {
  340. return T_DIV_EQUAL;
  341. }
  342. <ST_IN_SCRIPTING>".=" {
  343. return T_CONCAT_EQUAL;
  344. }
  345. <ST_IN_SCRIPTING>"%=" {
  346. return T_MOD_EQUAL;
  347. }
  348. <ST_IN_SCRIPTING>"<<=" {
  349. return T_SL_EQUAL;
  350. }
  351. <ST_IN_SCRIPTING>">>=" {
  352. return T_SR_EQUAL;
  353. }
  354. <ST_IN_SCRIPTING>"&=" {
  355. return T_AND_EQUAL;
  356. }
  357. <ST_IN_SCRIPTING>"|=" {
  358. return T_OR_EQUAL;
  359. }
  360. <ST_IN_SCRIPTING>"^=" {
  361. return T_XOR_EQUAL;
  362. }
  363. <ST_IN_SCRIPTING>"||" {
  364. return T_BOOLEAN_OR;
  365. }
  366. <ST_IN_SCRIPTING>"&&" {
  367. return T_BOOLEAN_AND;
  368. }
  369. <ST_IN_SCRIPTING>"0R" {
  370. return T_LOGICAL_OR;
  371. }
  372. <ST_IN_SCRIPTING>"AND" {
  373. return T_LOGICAL_AND;
  374. }
  375. <ST_IN_SCRIPTING>"XOR" {
  376. return T_LOGICAL_XOR;
  377. }
  378. <ST_IN_SCRIPTING>"<<" {
  379. return T_SL;
  380. }
  381. <ST_IN_SCRIPTING>">>" {
  382. return T_SR;
  383. }
  384. <ST_IN_SCRIPTING>{TOKENS} {
  385. return yytext[0];
  386. }
  387. <ST_IN_SCRIPTING>"{" {
  388. yy_push_state(ST_IN_SCRIPTING);
  389. return '{';
  390. }
  391. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"${" {
  392. yy_push_state(ST_LOOKING_FOR_VARNAME);
  393. return T_DOLLAR_OPEN_CURLY_BRACES;
  394. }
  395. <ST_IN_SCRIPTING>"}" {
  396. /* This is a temporary fix which is dependant on flex and it's implementation */
  397. if (yy_start_stack_ptr) {
  398. yy_pop_state();
  399. }
  400. return '}';
  401. }
  402. <ST_LOOKING_FOR_VARNAME>{LABEL} {
  403. yy_pop_state();
  404. yy_push_state(ST_IN_SCRIPTING);
  405. return T_STRING_VARNAME;
  406. }
  407. <ST_LOOKING_FOR_VARNAME>{ANY_CHAR} {
  408. yyless(0);
  409. yy_pop_state();
  410. yy_push_state(ST_IN_SCRIPTING);
  411. }
  412. <ST_IN_SCRIPTING>{LNUM} {
  413. return T_LNUMBER;
  414. }
  415. <ST_IN_SCRIPTING>{HNUM} {
  416. return T_LNUMBER;
  417. }
  418. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{LNUM}|{HNUM} { /* treat numbers (almost) as strings inside encapsulated strings */
  419. return T_NUM_STRING;
  420. }
  421. <ST_IN_SCRIPTING>{DNUM}|{EXPONENT_DNUM} {
  422. return T_DNUMBER;
  423. }
  424. <ST_IN_SCRIPTING>"__CLASS__" {
  425. return T_CLASS_C;
  426. }
  427. <ST_IN_SCRIPTING>"__FUNCTION__" {
  428. return T_FUNC_C;
  429. }
  430. <ST_IN_SCRIPTING>"__METHOD__" {
  431. return T_METHOD_C;
  432. }
  433. <ST_IN_SCRIPTING>"__LINE__" {
  434. return T_LINE;
  435. }
  436. <ST_IN_SCRIPTING>"__FILE__" {
  437. return T_FILE;
  438. }
  439. <INITIAL>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
  440. return T_INLINE_HTML;
  441. }
  442. <INITIAL>"<?"|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" {
  443. if (short_tags || yyleng>2) { /* yyleng>2 means it's not <? but <script> */
  444. /* no copying - intentional */
  445. BEGIN(ST_IN_SCRIPTING);
  446. //return T_OPEN_TAG;
  447. } else {
  448. return T_INLINE_HTML;
  449. }
  450. }
  451. <INITIAL>"<%="|"<?=" {
  452. if ((yytext[1]=='%' && asp_tags) || (yytext[1]=='?' && short_tags)) {
  453. BEGIN(ST_IN_SCRIPTING);
  454. //return T_OPEN_TAG_WITH_ECHO;
  455. //return T_ECHO;
  456. } else {
  457. return T_INLINE_HTML;
  458. }
  459. }
  460. <INITIAL>"<%" {
  461. if(asp_tags){
  462. BEGIN(ST_IN_SCRIPTING);
  463. //return T_OPEN_TAG;
  464. } else {
  465. return T_INLINE_HTML;
  466. }
  467. }
  468. <INITIAL>"<?php"([ \t]|{NEWLINE}) {
  469. BEGIN(ST_IN_SCRIPTING);
  470. //return T_OPEN_TAG;
  471. }
  472. <ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL} {
  473. return T_VARIABLE;
  474. }
  475. <ST_IN_SCRIPTING>{LABEL} {
  476. return T_STRING;
  477. }
  478. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{LABEL} {
  479. return T_STRING;
  480. }
  481. <ST_IN_SCRIPTING>{WHITESPACE} {
  482. //return T_WHITESPACE;
  483. }
  484. <ST_IN_SCRIPTING>"#"|"//" {
  485. BEGIN(ST_ONE_LINE_COMMENT);
  486. yymore();
  487. }
  488. <ST_ONE_LINE_COMMENT>"?"|"%"|">" {
  489. yymore();
  490. }
  491. <ST_ONE_LINE_COMMENT>[^\n\r?%>]+{ANY_CHAR} {
  492. switch (yytext[yyleng-1]) {
  493. case '?': case '%': case '>':
  494. yyless(yyleng-1);
  495. yymore();
  496. break;
  497. case '\n':
  498. lineno++;
  499. /* intentional fall through */
  500. default:
  501. BEGIN(ST_IN_SCRIPTING);
  502. //return T_COMMENT;
  503. }
  504. }
  505. <ST_ONE_LINE_COMMENT>{NEWLINE} {
  506. BEGIN(ST_IN_SCRIPTING);
  507. lineno++;
  508. //return T_COMMENT;
  509. }
  510. <ST_ONE_LINE_COMMENT>"?>"|"%>" {
  511. if (asp_tags || yytext[yyleng-2] != '%') { /* asp comment? */
  512. yyless(yyleng-2);
  513. BEGIN(ST_IN_SCRIPTING);
  514. //return T_COMMENT;
  515. } else {
  516. yymore();
  517. }
  518. }
  519. <ST_IN_SCRIPTING>"/**"{WHITESPACE} {
  520. comment_start_line = lineno;
  521. BEGIN(ST_DOC_COMMENT);
  522. yymore();
  523. }
  524. <ST_IN_SCRIPTING>"/*" {
  525. comment_start_line = lineno;
  526. BEGIN(ST_COMMENT);
  527. yymore();
  528. }
  529. <ST_COMMENT,ST_DOC_COMMENT>[^*]+ {
  530. yymore();
  531. }
  532. <ST_DOC_COMMENT>"*/" {
  533. BEGIN(ST_IN_SCRIPTING);
  534. //return T_DOC_COMMENT;
  535. }
  536. <ST_COMMENT>"*/" {
  537. BEGIN(ST_IN_SCRIPTING);
  538. //return T_COMMENT;
  539. }
  540. <ST_COMMENT,ST_DOC_COMMENT>"*" {
  541. yymore();
  542. }
  543. <ST_IN_SCRIPTING>("?>"|"</script"{WHITESPACE}*">"){NEWLINE}? {
  544. BEGIN(INITIAL);
  545. //return T_CLOSE_TAG; /* implicit ';' at php-end tag */
  546. }
  547. <ST_IN_SCRIPTING>"%>"{NEWLINE}? {
  548. if (asp_tags) {
  549. BEGIN(INITIAL);
  550. //return T_CLOSE_TAG; /* implicit ';' at php-end tag */
  551. } else {
  552. yyless(1);
  553. return yytext[0];
  554. }
  555. }
  556. <ST_IN_SCRIPTING>(["]([^$"\\]|("\\".))*["]) {
  557. /*register char *s, *t;
  558. char *end;
  559. convert escape sequences
  560. s = t = estrndup(yytext+1, yyleng-2);;
  561. end = s+yyleng-2;*/
  562. return T_CONSTANT_ENCAPSED_STRING;
  563. }
  564. <ST_IN_SCRIPTING>([']([^'\\]|("\\".))*[']) {
  565. register char *s, *t;
  566. char *end;
  567. /* convert escape sequences
  568. s = t = estrndup(yytext+1, yyleng-2);
  569. end = s+yyleng-2;
  570. while (s<end) {
  571. if (*s=='\\') {
  572. s++;
  573. if (s>=end) {
  574. continue;
  575. }
  576. switch(*s) {
  577. case '\\':
  578. case '\'':
  579. *t++ = *s;
  580. end--;
  581. break;
  582. default:
  583. *t++ = '\\';
  584. *t++ = *s;
  585. break;
  586. }
  587. s++;
  588. } else {
  589. *t++ = *s++;
  590. }
  591. }
  592. *t = 0;
  593. */
  594. return T_CONSTANT_ENCAPSED_STRING;
  595. }
  596. <ST_IN_SCRIPTING>["] {
  597. BEGIN(ST_DOUBLE_QUOTES);
  598. return '\"';
  599. }
  600. <ST_IN_SCRIPTING>"<<<"{TABS_AND_SPACES}{LABEL}{NEWLINE} {
  601. BEGIN(ST_HEREDOC);
  602. return T_START_HEREDOC;
  603. }
  604. <ST_IN_SCRIPTING>[`] {
  605. BEGIN(ST_BACKQUOTE);
  606. return '`';
  607. }
  608. <ST_IN_SCRIPTING>['] {
  609. BEGIN(ST_SINGLE_QUOTE);
  610. return '\'';
  611. }
  612. <ST_HEREDOC>^{LABEL}(";")?{NEWLINE} {
  613. int label_len;
  614. lineno++;
  615. if (yytext[yyleng-2]=='\r') {
  616. label_len = yyleng-2;
  617. } else {
  618. label_len = yyleng-1;
  619. }
  620. if (yytext[label_len-1]==';') {
  621. label_len--;
  622. }
  623. if (label_len==heredoc_len && !memcmp(yytext, heredoc, label_len)) {
  624. yyless(yyleng - (yyleng - label_len));
  625. BEGIN(ST_IN_SCRIPTING);
  626. return T_END_HEREDOC;
  627. } else {
  628. return T_STRING;
  629. }
  630. }
  631. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{ESCAPED_AND_WHITESPACE} {
  632. return T_ENCAPSED_AND_WHITESPACE;
  633. }
  634. <ST_SINGLE_QUOTE>([^'\\]|\\[^'\\])+ {
  635. return T_ENCAPSED_AND_WHITESPACE;
  636. }
  637. <ST_DOUBLE_QUOTES>[`]+ {
  638. return T_ENCAPSED_AND_WHITESPACE;
  639. }
  640. <ST_BACKQUOTE>["]+ {
  641. return T_ENCAPSED_AND_WHITESPACE;
  642. }
  643. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"$"[^a-zA-Z_\x7f-\xff{] {
  644. if (yyleng == 2) {
  645. yyless(1);
  646. }
  647. return T_CHARACTER;
  648. }
  649. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{ENCAPSED_TOKENS} {
  650. return yytext[0];
  651. }
  652. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\{" {
  653. return T_STRING;
  654. }
  655. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"{$" {
  656. yy_push_state(ST_IN_SCRIPTING);
  657. yyless(1);
  658. return T_CURLY_OPEN;
  659. }
  660. <ST_SINGLE_QUOTE>"\\'" {
  661. return T_CHARACTER;
  662. }
  663. <ST_SINGLE_QUOTE>"\\\\" {
  664. return T_CHARACTER;
  665. }
  666. <ST_DOUBLE_QUOTES>"\\\"" {
  667. return T_CHARACTER;
  668. }
  669. <ST_BACKQUOTE>"\\`" {
  670. return T_CHARACTER;
  671. }
  672. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\"[0-7]{1,3} {
  673. return T_CHARACTER;
  674. }
  675. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\x"[0-9A-Fa-f]{1,2} {
  676. return T_CHARACTER;
  677. }
  678. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\"{ANY_CHAR} {
  679. switch (yytext[1]) {
  680. case 'n': break;
  681. case 't': break;
  682. case 'r': break;
  683. case '\\': break;
  684. case '$': break;
  685. default:
  686. return T_BAD_CHARACTER;
  687. break;
  688. }
  689. return T_CHARACTER;
  690. }
  691. <ST_HEREDOC>["'`]+ {
  692. return T_ENCAPSED_AND_WHITESPACE;
  693. }
  694. <ST_DOUBLE_QUOTES>["] {
  695. BEGIN(ST_IN_SCRIPTING);
  696. return '\"';
  697. }
  698. <ST_BACKQUOTE>[`] {
  699. BEGIN(ST_IN_SCRIPTING);
  700. return '`';
  701. }
  702. <ST_SINGLE_QUOTE>['] {
  703. BEGIN(ST_IN_SCRIPTING);
  704. return '\'';
  705. }
  706. <ST_DOUBLE_QUOTES,ST_BACKQUOTE,INITIAL,ST_IN_SCRIPTING,ST_LOOKING_FOR_PROPERTY><<EOF>> {
  707. return 0;
  708. }
  709. <ST_COMMENT,ST_DOC_COMMENT><<EOF>> {
  710. printf("Unterminated comment starting line %d", comment_start_line);
  711. return 0;
  712. }
  713. <ST_IN_SCRIPTING,INITIAL,ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_SINGLE_QUOTE,ST_HEREDOC>{ANY_CHAR} {
  714. printf("Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
  715. }