Witam.
Mam problem z napisaniem programu i parsera (to właśnie parser jest głównym celem) który wczyta dane i wykona proste operacje na macierzach - mnorzenie/dodawanie/odejmowanie skalaru, mnorzenie/odejmowanie/dodawanie macierzy (max 3x3, wraz ze sprawdzeniem czy wymiary się zgadają) oraz transponowanie.

Co nie co już napisałem ale mam problemy bo pojawiają się niby proste błedy (unexpected czy undefined) których nie potrafię usunąć.

Wszystko co na razie zrobiłem ponieżej.

Oto kod flex'a (nazwa pliku m_v2.l)

%{
    #include "m_v2.tab.h"
    #include <stdlib.h>
    void yyerror(char *);
%}
%%
MTXST	"MS"	// znacznik początku macierzy
MTXKN	"MK"	// znacznik konca macierzy
DIGIT	[0-9]+\.[0-9]+	| [0-9]+  
DANE	{DIGIT}{1}[ ]{1} | {DIGIT}{1}[;]{1}	// liczba odzielona spacją lub liczba odzielona średnikiem
MATRIX	{MTXST}{1}{DANE}* {MTXKN}{1}


MATRIX	return MACIERZ;	// zwraca "wykryta" macierz bisonowi jako token MACIERZ
DIGIT	yylval = atof(yytext); return NUM;	// zwraca liczbe jesli jest to "wolna" liczba (skalar) nie znajdująca się pomiędzy  MTXST i MTXKN
[\t ]		;
[a-s]		;
[u-z]		;	// opuszczanie nie potrzebnych znaków (mam nadzieje że rónież pomiedzy  MTXST i MTXKN
[A-S]		;
[U-Z]		;
"t"		return 'T';	// znak transpozycji
"T"		return 'T';	// jw
"exit"		return 'x';	// znak nie obslugiwany przez bisona - wywoluje blad i konczy prace programu (stoworzone z myslą o podawaniu danych z std inp)
\n    	return *yytext;  
"+"             return '+';
"-"             return '-';
"*"             return '*';
.               yyerror("Unknown character");
<<EOF>>         {yyterminate();}		// jak "exit" ale z kulturą (bez błędu) i dla podawania danych z pliku
%%

int yywrap(void) {
    return 1;
}

problem w tym że pojawia się kilka niby prostych błędów ale nie wiem jak je zlikwidować (błędy poniżej)

BŁĘDY

In file included from m_v2.y:37:
lex.yy.c: In function 'yylex':
lex.yy.c:759: error: expected ';' before 'break'
m_v2.l:10: error: expected ';' before 'break'
m_v2.l:9: error: expected expression before '[' token
m_v2.l:9: error: stray '\' in program
m_v2.l:9: error: expected expression before '.' token
m_v2.l:10: error: 'DIGIT' undeclared (first use in this function)
m_v2.l:10: error: (Each undeclared identifier is reported only once
m_v2.l:10: error: for each function it appears in.)
m_v2.l:10: error: expected ';' before '}' token
m_v2.l:10: error: expected ';' before '}' token
m_v2.l:10: error: expected expression before '[' token
m_v2.l:11: error: 'MTXST' undeclared (first use in this function)
m_v2.l:11: error: expected ';' before '}' token
m_v2.l:11: error: expected ';' before '}' token
m_v2.l:11: error: 'DANE' undeclared (first use in this function)
m_v2.l:11: error: expected ';' before '}' token
m_v2.l:11: error: expected expression before '{' token
make: *** [run2] Error 1

i kod dla Bison'a (nazwa pliku m_v2.y) - nie gotowy nie testowany ze względu na powyższe błędy.

%{
    #include <stdio.h>
    void yyerror(char *);
    int yylex(void);

%}

%token NUM MACIERZ 
%left '+' '-'
%left '*'

%%

program:
        program statement '\n' | /* NULL */ ;
statement:
        exp  { printf("%d\n", $$); } /* | mtx { printf("%d\n", $$); } */;

exp: NUM	
	| exp '+' exp    	{ $$ = $1 + $3; }     
	| exp '-' exp   	{ $$ = $1 - $3; }
	| exp '*' exp    	{ $$ = $1 * $3; }
	| exp 'T'		{ $$ = 0; }
	| {$$ = 0;}
    ;
/*	ta czesc to tylko moje pobozne zyczenia 
mtx: MACIERZ
	| MACIERZ '+' MACIERZ { //sprawdzenie wymiaru, wykonanie }
	| MACIERZ '-' MACIERZ { //sprawdzenie wymiaru, wykonanie }
	| MACIERZ '*' MACIERZ { //inne sprawdzenie wymiaru, wykonanie }
	| MACIERZ '+' NUM { //petla wykonujaca dzialanie dla kazdego elemntu macierzy }
	| MACIERZ '-' NUM { //petla wykonujaca dzialanie dla kazdego elemntu macierzy }
	| MACIERZ '*' NUM { //petla wykonujaca dzialanie dla kazdego elemntu macierzy }
	| MACIERZ 'T' { //transponowanie macierzy }
*/
%%
#include "lex.yy.c"

void yyerror(char *s) {
	printf("Program zakonczyl dzialanie\n"); 
}
main() {
	printf("Aby zakonczyc wpisz exit\n"); 
	yyparse(); 
}

"makefile" - może problem jest w kompilacji ?
bison -d m_v2.y
flex m_v2.l
cc -lm -o m_v2 m_v2.tab.c
./m_v2

i przykładowe dane wejściowe:

dodawanie macierzy 2x2
MS 2 8; 0 5; MK + MS 3 -5; 1 -3; MK
transponowanie macierzy
MS 2 8; 0 5; MK t
mnożenie przez skalar
MS 2 8; 0 5; MK * 4

zatwierdzanie enter.

Mam jeszcze pytania co do Flex'a i Bison'a.

Jak z poziomu F/B wywalić znacznik początku i końca macierzy - czym mam zastąpić tę linię
MATRIX {MTXST}{1}{DANE}* {MTXKN}{1}

aby uzyskać efekt jak dla takiej linii MATRIX {DANE}* ale nie spowodować kolizji z tokenem NUM ?

Kwestie dotyczące dopisania kodu w C

Np. ta linia MACIERZ '+' MACIERZ { //sprawdzenie wymiaru, wykonanie }
będzie wymagała sprawdzenia wymiaru obu macierzy i pewnie jakiejś pętelki do wyliczenia. W C żaden problem - czy mogę tu wsadzić kawałek kodu w C (wydaje mi się że tak ale jak ?) ?

Poza tym wiesze macierzy rozdzielone są znakiem ';' zamierzam to wykorzystać przy dzieleniu string'a na sub stringi potem atof i wpisanie danych w tablice - czy to dobry pomysł czy macie lepsze ?

Czy ktoś może wie jak mam deklarować taką tablice - normalnie czy w bisonie robi się to jakoś "ekstra" ?

Z góry dziękuje za pomoc.