Я пытаюсь настроить грамматику с помощью flex / bison по следующему шаблону:
DATA: 1,2,3,4,5 PROGRAM: add,mult,div,read
Этот ввод необходимо передать в
4 add mult div read 5 1 2 3 4 5
Где: 4 - это количество команд после «PROGRAM», а 5 - это количество данных после «DATA». На данный момент у меня следующий код.
В asm.y (бизон):
%{
#include<stdio.h>
int comm[100];
int data[100];
int ncomm=0;
int ndata=0;
%}
%token NUMBER
%%
PROGR:"DATA: "INPUT" PROGRAM: "COMMANDS
;
COMMANDS:
| INSTR","COMMANDS
;
| NUMBER","INPUT {data[ndata]=$1; ndata++;}
;
INSTR:NUMBER {comm[ncomm]=$1; ncomm++;}
|"add" {comm[ncomm]=-10000; ncomm++;}
|"mult" {comm[ncomm]=-10001; ncomm++;}
|"div" {comm[ncomm]=-10002; ncomm++;}
|"minus" {comm[ncomm]=-10003; ncomm++;}
//and so on
;
%%
int main(int argc, char** argv)
{
yyparse();
printf("\n%d ",ncomm);
int i;
for(i=0; i<ncomm; i++)
{
printf("%d ",comm[i]);
}
printf("%d ",ndata);
for(i=0; i<ndata; i++)
{
printf("%d ",data[i]);
}
}
yyerror(char* s)
{
printf("error: %s\n",s);
}
И в asm.l (flex):
%{
#include "asm.tab.h"
%}
%%
[0-9]+ {return NUMBER;}
%%
В конце концов, программа выводит не правильные данные, а, например,
За
DATA: PROGRAM: add
Он печатает
DATA: PROGRAM: add
и ждем следующего ввода.
С другой стороны, для
DATA: 5 PROGRAM: add
Он печатает
DATA: error: syntax error
0 0
И я понятия не имею, что делаю не так.