Как я могу присвоить значение переменной с помощью этого кода? Лекс и Як - PullRequest
1 голос
/ 19 апреля 2019

Я пишу код в lex и yacc и пытаюсь присвоить значение переменной, например:

x = 5;

мои переменные [A-Za-z0-9]и мои числа являются целыми числами [0-9] или с плавающей точкой [0-9]+[.]?[0-9]*

Я пытался записать это в файле lex:

alpha [A-Za-z0-9]

, а затем

{alpha} {yylval.id = (char *) strdup(yytext); return ID;}

и в файле yacc я написал: %union{char *id, int num} и я также определил его как токен, затем я попытался написать ID '=' expr { $$=$3 }, но это не сработало.

код lex:

%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "y.tab.h" 
extern YYSTYPE yylval;
%}
%option noyywrap
delim [ \t]
white {delim}+
integer [0-9]
float [0-9]+[.]?[0-9]*

%%
{integer} {printf("got INTEGER token\n"); sscanf(yytext,"%lf",&yylval); 
return INTEGER;}
{float} {printf("got FLOAT token\n"); sscanf(yytext,"%lf",&yylval); return FLOAT;}

"add" {printf("got ADDITION token\n"); return ADDITION;}
"sub" {printf("got SUBTRACTION token\n"); return SUBTRACTION;}
"mul" {printf("got MULTIPLICATION token\n"); return MULTIPLICATION;}
"div" {printf("got DIVISION token\n"); return DIVISION;}
"="   {printf("got ASSIGN token\n"); return ASSIGN;}
";"   {printf("got SEMI token\n); return SEMI;}
"(" {return LPAREN;}
")" {return RPAREN;}
"\n" {return NEWLINE;}
{white} {}
%%

код yacc:

%{
#include <stdio.h>
#define YYSTYPE double
#include <malloc.h>
#include <stdlib.h>
%}
%token NEWLINE INTEGER FLOAT ADDITION SUBTRACTION MULTIPLICATION DIVISION LPAREN RPAREN ASSIGN SEMI 
%%
input:
 | input line
 ;
line: NEWLINE
 | expr NEWLINE { printf("\t%.10g\n",$1); }
;
expr: expr ADDITION term { $$ = $1 + $3; }
| expr SUBTRACTION term { $$ = $1 - $3; }
| expr MULTIPLICATION term { $$ = $1 * $3; } 
| expr DIVISION term { $$ = $1 / $3; }
| term 
;
;
term: LPAREN expr RPAREN { $$ = $2; }
| INTEGER 
| FLOAT 
;
%%
int yyerror(char *s)
{
printf("%s\n",s);
return(0);
}
int main()
{
yyparse();
exit(0);
}
...