Во-первых, я уже упоминал здесь много подобных вопросов, но не смог разрешить конфликты.
У меня есть этот кусок в моем файле .y
.
.
.
obj
: INT { $$ = objNew($1, INT_T); }
| FLOAT { $$ = objNew($1, FLOAT_T); }
| STR { $$ = objNew($1, STR_T); }
;
var
: IDEN { $$ = varLookup($1); }
;
atom
: '(' expression ')' { $$ = $2; }
;
index
: '[' obj ']' { $$ = $2; }
;
primary_expr
: obj { $$ = objExpr($1); }
| var { $$ = varExpr($1); }
| atom { $$ = atmExpr($1); }
| expression index { $$ = idxExpr($1, $2); }
;
unary_expr
: primary_expr { $$ = $1; }
| '+' unary_expr { $$ = unExpr(UPLUS, $2); }
| '-' unary_expr { $$ = unExpr(UMINUS, $2); }
;
power_expr
: unary_expr { $$ = $1; }
| power_expr '^' unary_expr { $$ = biExpr('^', $1, $3); }
;
multiplicative_expr
: power_expr { $$ = $1; }
| multiplicative_expr '*' power_expr { $$ = biExpr('*', $1, $3); }
| multiplicative_expr '/' power_expr { $$ = biExpr('/', $1, $3); }
;
additive_expr
: multiplicative_expr { $$ = $1; }
| additive_expr '+' multiplicative_expr { $$ = biExpr('+', $1, $3); }
| additive_expr '-' multiplicative_expr { $$ = biExpr('-', $1, $3); }
;
relational_expr
: additive_expr { $$ = $1; }
| relational_expr '>' additive_expr { $$ = biExpr('>', $1, $3); }
| relational_expr '<' additive_expr { $$ = biExpr('<', $1, $3); }
| relational_expr '=' additive_expr { $$ = biExpr('=', $1, $3); }
;
referential_expr
: relational_expr { $$ = $1; }
| referential_expr IS relational_expr { $$ = biExpr(IS, $1, $3); }
;
conjunction_expr
: referential_expr { $$ = $1; }
| conjunction_expr AND referential_expr { $$ = biExpr(AND, $1, $3); }
;
disjunction_expr
: conjunction_expr { $$ = $1; }
| disjunction_expr OR conjunction_expr { $$ = biExpr(OR, $1, $3); }
;
conditional_expr
: disjunction_expr { $$ = $1; }
| disjunction_expr '?' disjunction_expr ':' conditional_expr { $$ = trExpr('?', $1, $3, $5); }
;
sequence
: conditional_expr { $$ = seqChain(NULL, $1); }
| sequence ',' conditional_expr { $$ = seqChain($1, $3); }
;
assignment_expr
: sequence { $$ = seqAssign($1, NULL); }
| sequence ASS assignment_expr { $$ = seqAssign($1, $3); }
;
expression
: assignment_expr { $$ = $1; }
;
statement
: ';' { $$ = NULL; }
| expression ';' { $$ = exprStmt($1); }
;
routine
: routine statement { $$ = rtnChain($1, $2); }
| { $$ = NULL; }
;
program
: routine { compile($1); exit(0); }
;
.
.
.
Этот грамматик порождает много конфликтов приведения/уменьшения. Например:
State 81
18 power_expr: unary_expr .
19 | power_expr '^' unary_expr .
'+' reduce using rule 18 (power_expr)
'+' [reduce using rule 19 (power_expr)]
У меня много подобных конфликтов. Но я не понимаю этого.
Насколько я знаю, это говорит о том, что когда производство unary_expr
или когда оно power_expr '^' unary_expr
, а затем выглядит как '+'
, возникает конфликт уменьшения\уменьшения. Но почему возникает конфликт уменьшения\уменьшения? Когда у него есть часть power_expr '^'
, он может использовать правило 19 (и должен использовать, поскольку в противном случае производство будет power_expr '^' power_expr
, которое не определено в грамматике.), а когда нет части power_expr '^'
, он должен использовать правило 18. Где здесь возникает двусмысленность? , и как это решить.
bison -Wcounterexamples
? - person akim   schedule 14.02.2021bison: invalid argument 'counterexamples' for '--warning'
ошибку. - person Sourav Kannantha B   schedule 14.02.2021