У меня возникают проблемы с этой программой Bison. Он должен получить строку из 1s и 0s с периодом «101.101», умножив их на 2^n. Например:Применение семантических правил для bison
"101.101" = (1*2^2)+(0*2^1)+(1*2^0)+(1*2^-1)+(0*2^-2)+(1*2^-3)=5.625
Пункт указывает, когда pow положительна или отрицательна. У меня есть следующие семантические действия:
S→ L.R
S→ L
L → L1 B
L → B
R → R1 B
R → B
B→ 0
B → 1
Sematic Rules
L.pos=0;R.pos=-1;S.val=L.val+R.val
L.pos=0;S.val=L.val;
L1.pos = L.pos + 1; B.pos = L.pos; L.val = L1.val + B.val;
B.pos = L.pos; L.val = B.val;
R1.pos = R.pos - 1; B.pos = R.pos; L.val = L1.val + B.val;
B.pos = R.pos; L.val = B.val;
B.val=0;
B.val = 1*2B.pos;
У меня есть проблема в том, что я не знаю, как добавить переменные как .val и .pos в файл Bison, а затем реализовать программный код C.
Bison
%{
#include <string.h>
#include <stdio.h>
#include<stdlib.h>
void yyerror (char *string);
int down =0;
%}
%token r1
%token l1
%token DOT
%token ZERO
%token ONE
%%
s: l DOT r
| l
;
l: l1 b
| b
;
r: r1 b
|b
;
b: ONE
| ZERO
| error
;
%%
#include "lex.yy.c"
void yyerror (char *string){
printf ("%s",string);
}
main(){
yyparse();
}
Lex Файл
%{
#include <stdio.h>
#include <math.h>
#include "y.tab.h"
%}
BINARY [0-1]
%%
"1" {return ONE;}
"0" {return ZERO;}
"." {return DOT;}
%%
Ударьте меня в него :) Я просто делал одно, но со значением типа 'struct {int val; int pos;}; 'который немного оптимизирует OP. Но продолжайте ... – rici
В любом случае, звучит как ваш лучше. Я ленился. Я не очень хорошо разбираюсь в вещах. Вы могли бы оценивать l и r как два раза на лету. Возможно, из обоих ответов OP сможет это выяснить. –