Я не хочу повторять the Cthulhu answer, но я хочу совместить пары открывающих и закрывающих HTML-тегов с помощью Treetop. Используя this grammar, я могу сопоставить открывающие теги и закрывающие теги, но теперь я хочу, чтобы правило связывало их обоих. Я попытался следующие, но используя это делает мой парсер продолжаться вечно (бесконечный цикл):Соответствующие пар тегов в грамматике Treetop
rule html_tag_pair
html_open_tag (!html_close_tag (html_tag_pair/''/text/newline/
whitespace))+ html_close_tag <HTMLTagPair>
end
Я пытался основать это от рекурсивного примера скобки и отрицательного опережения например on the Treetop Github page. Другие правила я упоминаться следующие:
rule newline
[\n\r] {
def content
:newline
end
}
end
rule tab
"\t" {
def content
:tab
end
}
end
rule whitespace
(newline/tab/[\s]) {
def content
:whitespace
end
}
end
rule text
[^<]+ {
def content
[:text, text_value]
end
}
end
rule html_open_tag
"<" html_tag_name attribute_list ">" <HTMLOpenTag>
end
rule html_empty_tag
"<" html_tag_name attribute_list whitespace* "/>" <HTMLEmptyTag>
end
rule html_close_tag
"</" html_tag_name ">" <HTMLCloseTag>
end
rule html_tag_name
[A-Za-z0-9]+ {
def content
text_value
end
}
end
rule attribute_list
attribute* {
def content
elements.inject({}){ |hash, e| hash.merge(e.content) }
end
}
end
rule attribute
whitespace+ html_tag_name "=" quoted_value {
def content
{elements[1].content => elements[3].content}
end
}
end
rule quoted_value
('"' [^"]* '"'/"'" [^']* "'") {
def content
elements[1].text_value
end
}
end
Я знаю, что нужно, чтобы обеспечить соответствие одного открытия или закрытия тегов, но если пара HTML-теги существуют, я хотел бы получить их вместе как пара. Казалось, что это самое чистое, сопоставляя их с моей грамматикой, но, возможно, есть лучший способ?
должен там быть «+» между ' и '(! Html_close_tag (etc'? Кроме того (и я признаю, что предпросмотр в Treetop путает Кнут из меня), кажется, как бы отрицательного предпросмотра (например,
и положительный lookahead для совпадающих тегов – philosodad
Хм, похоже, не должно быть +, поскольку все правило является рекурсивным, поэтому в нем уже может быть несколько открытых тегов, потому что есть другие теги. –