Как правильно использовать группы EBNF в Jison
Я пытаюсь выяснить, как справиться с ситуацией, возникающей при использовании расширения EBNF в Jison (Jison по умолчанию поддерживает только BNF - вы можете активировать эту опцию по мере необходимости).
Я пытаюсь написать простой парсер XML. В XML есть пустые теги и непустые теги. Непустые теги имеют начальный тег, содержимое, а затем и конечный тег снова. Правило содержимого EBNF определяется следующим образом:
Content
: CHARDATA? (Element CHARDATA?)* {
var children = [];
$1 && children.push($1);
/* This will contain an array of all elements
but no character data ?! */
$2 && children.push($2);
$$ = children;
}
;
Теперь, отладив, я понял, что Jison назначит группу захвата $2 и передаст совпадения в массиве. Это имеет смысл, так как я ожидаю получить список совпадений здесь. Но что меня действительно поражает, так это то, что в содержащемся массиве есть только элементы и никаких символьных данных.
Предположим, что эта входная строка, например:
<a>h<x/>i<y/>j</a>
Теперь вышеприведенное правило даст представление для h, x и y. Но я и j будут отсутствовать.
Я предполагаю, что что-то упустил, но не знаю, что это может быть...
Я могу предоставить полную грамматику, если необходимо, но попытался выделить проблему.
Спасибо заранее!
С наилучшими пожеланиями, Харальд