У меня есть класс лексер, который из текста, например:
%div.content
%h1.headline Заголовок
возвращает мне массив в лексемами:
[
{
lexem: 'tag',
value: { name: 'div', content: '', attributes: [Object] }
},
{ lexem: 'indent', value: ' ' },
{
lexem: 'tag',
value: { name: 'h1', content: 'Заголовок', attributes: [Object] }
}
]
Синтаксис как у haml.
Если один тэг вложен в другой, тогда в лексемы добавляется indent
И я столкнулся с проблемой, что не могу в парсере, нормально описать эту вложенность.
Парсер из этих лексем должен возвращать мне AST. Что-то вроде этого:
{
type: "root",
nodes: [
{
type: "tag",
value: {
name: "div",
attributes: {
class: "content"
},
nodes: [ // вместо content, я пишу nodes (узлы), в которых будут лежать дочерние тэги
{
// и тут дочерние тэги, а в дочерних тэгах, могут быть еще тэги
}
]
}
}
]
}
Но я не могу понять как мне сделать так, чтобы если в одном тэге был другой, он бы делал nodes для первого тэга, а второй бы клал в nodes'ы первого. Запутано, но так есть на самом деле.
+ Если во втором тэге, есть другой тэг, тогда вообще каша полная.
Есть ли какой нибудь алгоритм парсинга лексем для такого рода html шаблонизаторов?