Я работаю над этой грамматикой, чтобы построить SDD для проверки типа или аналогичного. Вчера я провел работу над структурами данных и синтаксическим анализом, но я всегда делал ошибку сегментации. Мне кажется, что YACC (бизон) теряет ценности среди редукций.yacc теряет значения среди редукций
Таким образом, я решил создать более простую грамматику с более простыми действиями. Кажется, что ценности теряются среди одного сокращения, а другое, или, может быть, я делаю что-то неправильно? В этом примере лексерская часть не имеет отношения к делу, поэтому я пропустил ее.
После грамматики с ее действиями и результата против ожидаемого результата ..
D: T VAR SEMICOLON D {
printf("processing D -> T var ; D\n");
printf("\tvalue of T is %f\n", $1);
}
|/*empty*/ {
printf("processing D -> empty\n");
}
;
T: B {
printf("processing B inside T\n");
printf("\tvalue of B is %f\n", $1);
}
C { printf("processing C inside T\n");
printf("processing T-> B C\n");
printf("\tvalue of B is %f\n", $1);
printf("\tvalue of C is %f\n", $<dbl>2);
$$ = $1 + $<dbl>2;
}
| RECORD '{' D '}' { printf("processing record { D }\n");}
;
B: INT { printf("processing B -> int\n");
$$ = 1;
}
| FLOAT { printf("processing B -> float\n");
$$ = 1;
}
;
C: /*empty*/ { printf("processing C -> empty\n");
printf("\tsetting C to be equal to 1\n");
$$=1;
}
| LBRACK NUM RBRACK C { int n = $2;
printf("processing C -> [%d] C\n", n);
double d = $4;
printf("\tprevious C value is %f\n", d);
double f = d+ 1;
printf("\tnew value of $$ is %f\n", f);
$$ = f;
}
;
это выход для входа как int [12][3] ciao;
processing B -> int
processing B inside T
value of B is 1.000000
processing C -> empty
setting C to be equal to 1
processing C -> [3] C
previous C value is 1.000000
new value of $$ is 2.000000
processing C -> [12] C
previous C value is 2.000000
new value of $$ is 3.000000
processing C inside T
processing T-> B C
value of B is 1.000000
value of C is 0.000000 (*)
processing D -> empty
processing D -> T var ; D
value of T is 1.000000 (*)
Как вы можете увидеть значение теряется среди C, отмеченные знаком *
Я ожидаю, что он вырастет, например,
processing B -> int
processing B inside T
value of B is 1.000000
processing C -> empty
setting C to be equal to 1
processing C -> [3] C
previous C value is 1.000000
new value of $$ is 2.000000
processing C -> [12] C
previous C value is 2.000000
new value of $$ is 3.000000
processing C inside T
processing T-> B C
value of B is 1.000000
value of C is 3.000000
processing D -> empty
processing D -> T var ; D
value of T is 4.000000
ЛЮБОЙ совет приветствуется, а также объяснение и предложение достичь объема, есть ли что-нибудь, что мне не хватает?
В производстве T-> C имеется только один элемент, и вы ссылаетесь на два в семантическом действии. – user3344003
Нет! обратите внимание, что между ними нет трубы .. Производство T-> B C .. – LMG