Лучше бы переделать чтобы хватало всем одного общего инстанса токенайзера. Ибо я не представляю зачем их плодить. Это нездоровая идея.
Соответственно в парсер передается не текст, а этот токенайзер и тем самым мы уменьшаем связность между ними.
То, что у тебя функция в одном аргументе принимает как набор токенов, так и текст тоже нехорошо — лучше принимать токенайзер.
И я тут подумал, удобно бы завести отдельный токен для закрывающего тега,[/ чтобы по одному токену было видно, открывающий у нас тег или закрывающий.
Функцию parse надо бы разбить на две: в одной цикл while, в другой switch. Вот так:
parseMixedContent(){
...
while(не конец текста и не [/){
$nodes[]=$this->parseTagOrText();
}
return$nodes;
}
// парсит одну пару тегов либо кусок текста
parseTagOrText(){
if(текущий токен ==[){
return parseTagPair();
} иначе если текщий токен ==[/){
ошибка;
}else{
return parsePlainText();
}
}
parseTagpair(){
$node= parseOpeningTag();
if(!$node->isTag()){
return$node;// дальше идти нет смысла
}
do{
$node->addChildren(parseMixedConent());
$closingNode= parseClosingTag();
if(тег не распарсился){
$content[]=$closingNode;
}while(не нашли закрывающий тег);
$node->addChildren($content);
return$node;
}
switch кстати у тебя как-то странно оформлен, в плане отступов и переносов, первый раз такое вижу. У тебя вообще как-то код ужасно тесно оформлен, по несколько операторов на строчке, зачем так? И зачем все классы в один файл сваливать? Тяжело читать же.
if слишком глубоко вложены местами, надо разбивать на функции.
Не стоит писать вот так:
$x ? doSmth(): doElse()
Для этого есть if. Тернарный оператор используется в других случаях.
Лучше бы переделать чтобы хватало всем одного общего инстанса токенайзера. Ибо я не представляю зачем их плодить. Это нездоровая идея.
Соответственно в парсер передается не текст, а этот токенайзер и тем самым мы уменьшаем связность между ними.
То, что у тебя функция в одном аргументе принимает как набор токенов, так и текст тоже нехорошо — лучше принимать токенайзер.
И я тут подумал, удобно бы завести отдельный токен для закрывающего тега, [/ чтобы по одному токену было видно, открывающий у нас тег или закрывающий.
Функцию parse надо бы разбить на две: в одной цикл while, в другой switch. Вот так:
parseMixedContent() {
...
while (не конец текста и не [/) {
$nodes[] = $this->parseTagOrText();
}
return $nodes;
}
// парсит одну пару тегов либо кусок текста
parseTagOrText() {
if (текущий токен == [) {
return parseTagPair();
} иначе если текщий токен == [/) {
ошибка;
} else {
return parsePlainText();
}
}
parseTagpair() {
$node = parseOpeningTag();
if (!$node->isTag()) {
return $node; // дальше идти нет смысла
}
do {
$node->addChildren(parseMixedConent());
$closingNode = parseClosingTag();
if (тег не распарсился) {
$content[] = $closingNode;
} while (не нашли закрывающий тег);
$node->addChildren($content);
return $node;
}
switch кстати у тебя как-то странно оформлен, в плане отступов и переносов, первый раз такое вижу. У тебя вообще как-то код ужасно тесно оформлен, по несколько операторов на строчке, зачем так? И зачем все классы в один файл сваливать? Тяжело читать же.
if слишком глубоко вложены местами, надо разбивать на функции.
Не стоит писать вот так:
$x ? doSmth() : doElse()
Для этого есть if. Тернарный оператор используется в других случаях.