fork download
  1. <?php
  2.  
  3. function parseExpr() {
  4. return parseSum();
  5. }
  6.  
  7. // парсит сумму чисел или произведений
  8. function parseSum() {
  9.  
  10. $numbers = array();
  11.  
  12. while (true) {
  13. $numbers[] = parseMultiplication(); // добавляем очередное слагаемое
  14. if (nextTokenIs('+')) { // если дальше плюс
  15. consumeToken('+'); // проглотить токен '+'
  16. continue;
  17. }
  18. }
  19.  
  20. // прочли всю сумму, создаем узел
  21. if (count($numbers) > 1) {
  22. return new Node_Sum($numbers);
  23. } else {
  24. return $numbers[0]; // ради одного слагаемого не делаем новый узел
  25. }
  26. }
  27.  
  28. function parseMultiplication()
  29. {
  30. // то же самое, только вызывает parseNumber();
  31. }
  32.  
  33. function parseNumber()
  34. {
  35. // читает токен. если там не число то падает с ошибкой «ожидается число»
  36. $number = readToken(TYPE_NUMBER);
  37.  
  38. // создаем новый узел
  39. return new Node_Number($number);
  40. }
  41.  
  42. У тебя будет что-то похожее только функции будут типа такой:
  43.  
  44. function parseTag()
  45. {
  46. $attrs = [];
  47. $tagName = getNextToken(TYPE_OPEN_TAG); // читаем открываюий тег
  48.  
  49. while (nextTokenIs(TYPE_ATTR)) {
  50. $attrToken = getNextToken(TYPE_ATTR);
  51. $attrs[$attrToken['name']] = $attrToken['value'];
  52. }
  53.  
  54. $content = parseContent();
  55.  
  56. $closeTag = getNextToken(TYPE_CLOSE_TAG);
  57. if ($closeTag != $tagName) {
  58. ошибка, несоответсие откр. и закр. тегов
  59. }
  60.  
  61. return new Node_Tag($tagName, $attrs, $content);
  62. }
  63.  
  64.  
  65.  
Runtime error #stdin #stdout #stderr 0.01s 20592KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
PHP Parse error:  syntax error, unexpected 'тебя' (T_STRING) in /home/fwNVvn/prog.php on line 42