Я пытаюсь построить очень простой язык, используя Лекса и Yacc Это может быть только одна переменная Int через присвоение как этотLex & Yacc разборе заявления
a = 1
Он может печатать переменную, как это
print a
он должен выводить значение только если имя переменной совпадает иначе он должен напечатать сообщение об ошибке
Мой закон файл
%{
#include "y.tab.h"
#include <stdlib.h>
void yyerror(char *);
%}
letter [A-z]
digit [0-9]
%%
"print" {return PRINT;}
{letter}+ { yylval.id = yytext;return IDENTIFIER;}
{digit}+ { yylval.num = atoi(yytext);return NUMBER; }
[=\n] return *yytext;
[ \t] ; /* skip whitespace */
. yyerror("invalid character");
%%
int yywrap(void) {
return 1;
}
И мой файл Yacc является
%{
#include <stdio.h>
#include <string.h>
int yylex(void);
void yyerror(char *);
int value;
char *key;
void print_var(char *s);
%}
%union {char *id;int num;}
%start exp
%token <id> IDENTIFIER
%token <num> NUMBER
%token PRINT
%%
exp: IDENTIFIER '=' NUMBER '\n' {key = $1;value = $3;}
|PRINT IDENTIFIER '\n' {print_var($2);}
|exp IDENTIFIER '=' NUMBER '\n' {key = $2;value = $4;}
|exp PRINT IDENTIFIER '\n' {print_var($3);}
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
void print_var(char *s){
if(strcmp(s,key) == 0){
printf("%s:%d\n",key,value);
}else{
printf("%s not found\n",s);
}
}
int main(void) {
yyparse();
return 0;
}
Но когда я типа что-то вроде этого
a = 1
print a
Я получаю следующую ошибку не найден
Как освободить память? –
Это сложнее. Вы должны изучить грамматику yacc, чтобы узнать, где вам больше не понадобится значение, а затем освободите его. Вы можете только освободить строку один раз (без того, чтобы ваша программа умерла). –