Показать сообщение отдельно

  #17  
Старый 14.05.2010, 14:02
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
С нами: 9320830

Репутация: 86
По умолчанию

Есть маленькая непонятка с грамматикой(или это особенности парсера?), а именно с 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 и дать ему выражение
Цитата:
Сообщение от input  
a+b*c
то на выходе получим:
Цитата:
Сообщение от 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]*;
то повторений не будет, но тогда мы теряем правоассоциацивность(как-то так пишется, но это неважно - смысл я понимаю) оператора присваивания '='.
Собственно непонятно, эти повторения это нормально? или нужно искать другой выход из ситуации? спасибо.

з.ы. то-что спирит не обращайте внимания, он у меня всего-лишь как эталон, т.е. проверяю на корректность свой парсер сравнивая результаты с спиритом)))

Последний раз редактировалось rudvil; 14.05.2010 в 14:09..
 
Ответить с цитированием