LINUX.ORG.RU

Не получатся выловить ошибку flex/bison


0

1

есть лексер и парсер, лексер отзывается и работает вроде ровно, а вот парсер не откликается ваще, никак не могу понять в чём проблема, уже просто сил не осталось. Пожалуйста помогите! вот код лексера: %{ #include <stdio.h> #include «vhdlTest.tab.h»

%} %option reentrant noyywrap %option noansi-definitions

%% var {ECHO;printf(«\n»);return TVAR;} entity return TENTITY; is return TIS; of {ECHO;return TOF;} end {ECHO;printf(«\n»);return TEND;} if {ECHO;return TIF;} begin {ECHO;return TBEGIN;} architecture {ECHO;return TARCHITECTURE;} then {ECHO;return TTHEN;} port {ECHO;return TPORT;} not {ECHO;return TNOT;} and {ECHO;return TAND;} or {ECHO;return TOR;} nand {ECHO;return TNAND;} nor {ECHO;return TNOR;} xor {ECHO;return TXOR;} [a-zA-Z][_a-zA-Z0-9]* {yylval=strdup(yytext); return TSOMEWORD;} ":=" {ECHO;return TASSIGNS;} «/=» {ECHO;return TNOTEQUAL;} «<=» {ECHO;return TAPPOINTMENTSIGNAL;} «>=» {ECHO;return TMOREOREQUAL;} [0-9]+ {ECHO;return TNUMBER;} \n ; " " ; \t ; "." {ECHO;} %%

а вот парсера: %{ #include <stdlib.h> #define YYSTYPE char * char words[10]; %}

%token TVAR TENTITY TIS TOF TIF TEND TBEGIN TARCHITECTURE TTHEN TPORT TSOMEWORD TASSIGNS TNOTEQUAL TAPPOINTMENTSIGNAL TMOREOREQUAL TNOT TAND TOR TNAND TNOR TXOR TNUMBER

%debug

%% input: /*empty*/ |input line ; line: entity /*|entity architecture*/ ;

entity: name_entity end_entity /*|name_entity body_entity end_entity*/ ; name_entity: TENTITY TSOMEWORD TIS { $$ = $2; strcpy(words,$2); printf(«ENTITY name is -->%s»,words); } ;

/*body_entity: port_expression;*/

/*port_expression: TPORT TLBRACKET ToDo TRBRACKET TSEMICOLON;*/

end_entity: TEND name_entity; %% #include <stdio.h> #include <ctype.h>

main() { yyparse(); }

int yywrap(void) { return 1; }

yyerror(const char *str) { fprintf(stderr, «ERROR: %s\n», str); }



Последнее исправление: Mitya_Potemkin (всего исправлений: 1)

вот код лексера:

%{ 
#include <stdio.h>
 #include "vhdlTest.tab.h"

%}
%option reentrant noyywrap
%option noansi-definitions

%%
 var {ECHO;printf("\n");return TVAR;} 
entity return TENTITY; 
is return TIS; 
of {ECHO;return TOF;} 
end {ECHO;printf("\n");return TEND;} 
if {ECHO;return TIF;}
begin {ECHO;return TBEGIN;} 
architecture {ECHO;return TARCHITECTURE;} 
then {ECHO;return TTHEN;} 
port {ECHO;return TPORT;} 
not {ECHO;return TNOT;} 
and {ECHO;return TAND;} 
or {ECHO;return TOR;} 
nand {ECHO;return TNAND;} 
nor {ECHO;return TNOR;} 
xor {ECHO;return TXOR;} 
[a-zA-Z][_a-zA-Z0-9]* {yylval=strdup(yytext); return TSOMEWORD;} 
":=" {ECHO;return TASSIGNS;} 
"/=" {ECHO;return TNOTEQUAL;} 
"<=" {ECHO;return TAPPOINTMENTSIGNAL;} 
">=" {ECHO;return TMOREOREQUAL;} 
[0-9]+ {ECHO;return TNUMBER;} 
\n ; 
" " ; 
\t ; 
"." {ECHO;} 
%%

а вот парсера:

%{ 
#include <stdlib.h> 
#define YYSTYPE char * 
char words[10]; 
%}

%token TVAR TENTITY TIS TOF TIF TEND TBEGIN TARCHITECTURE TTHEN TPORT TSOMEWORD TASSIGNS TNOTEQUAL TAPPOINTMENTSIGNAL TMOREOREQUAL TNOT TAND TOR TNAND TNOR TXOR TNUMBER

%debug

%% 
input: /*empty*/ |input line ; 
line: entity /*|entity architecture*/ ;

entity: name_entity end_entity /*|name_entity body_entity end_entity*/ ; 
name_entity: TENTITY TSOMEWORD TIS { $$ = $2; strcpy(words,$2); printf("ENTITY name is -->%s",words); } ;


end_entity: TEND name_entity; 
%% 
#include <stdio.h> 
#include <ctype.h>

main() { yyparse(); }

int yywrap(void) { return 1; }

yyerror(const char *str) { fprintf(stderr, "ERROR: %s\n", str); } 

Mitya_Potemkin
() автор топика
Ответ на: комментарий от Mitya_Potemkin

В чем проблема-то вообще, можете вы сказать? Или мы тут сами должны все это скомпилировать, протестировать, обнаружить её, и ответить вам?

Типа - «разберитесь чё с кодом, парни»? Поконкретнее пожалуйста - что должно делать, и на каких тестах валится?

anonymous
()
Ответ на: комментарий от anonymous

В качестве примеров приводите пожалуйста не текстовые строки, а последовательности терминалов - коль скоро здесь вопрос про парсер стоит. И указывайте - в чем конкретно ошибка выражается.

Грамматика простая - её и устно можно отдебажить. Не заставляйте людей лишние действия производить за вас.

anonymous
()
Ответ на: комментарий от anonymous

Простите, пожалуйста, вопрос уже решил, в следующий раз буду более конкретизировать проблему)

Mitya_Potemkin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.