Есть маленькая непонятка с грамматикой(или это особенности парсера?), а именно с ebnf грамматикой, вот пример грамматики простых выражений
Сообщение от
grammar
expression = assignment_expression (',' assignment_expression)*;
assignment_expression = (unary_expression '=')[assign]* additive_expression;
additive_expression = multiplicative_expression (('+' | '-') multiplicative_expression)[additive]*;
multiplicative_expression = unary_expression (('*' | '/' | '%') unary_expression)[multiplicative]*;
unary_expression = (('+' | '-') unary_expression | postfix_expression);
postfix_expression = NAME[identifier] | NUM[number] | '(' expression ')';
Всё что в квадратных скобках, это как в boost::spirit semantic actions.
Если скормить эту грамматику boost::spirit и дать ему выражение
то на выходе получим:
Сообщение от
boost::spirit
identifier a
identifier b
identifier c
multiplication
addition
т.е. постфиксную запись, тут проблем нету, с этим все понятно.
Но!, если дать следующее
Сообщение от
input
d=a+b*c
вывод будет таким:
Сообщение от
boost::spirit
identifier d
assign
identifier a
identifier a
identifier b
identifier c
multiplication
addition
т.е. повторяющийся идентификатор 'a', конечно если записать грамматику присваивания так
Сообщение от
grammar
assignment_expression = additive_expression ('=' additive_expression)[assign]*;
то повторений не будет, но тогда мы теряем правоассоциацивность(как-то так пишется, но это неважно - смысл я понимаю) оператора присваивания '='.
Собственно непонятно, эти повторения это нормально? или нужно искать другой выход из ситуации? спасибо.
з.ы. то-что спирит не обращайте внимания, он у меня всего-лишь как эталон, т.е. проверяю на корректность свой парсер сравнивая результаты с спиритом)))