代码拉取完成,页面将自动刷新
%{
#include<stdio.h>
#include "syntax_tree.h"
#include "symbol_table.h"
#include"interpreter.h"
int yylex(void);
void yyerror(char*);
symbol_table st=NULL;
extern FILE* yyin;
%}
%union{
char * istring;
int iValue;
struct syntax_table * stValue;
// syntax_t stValue;
};
%token <iValue> INT
%token <istring> ID
%token IF ELSE
%token PRINT
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS
%type <iValue> expr
%type <stValue> statement selection_statement statement_block var
%%
program:
statement_list {return 0;}
;
statement_list:
| statement_list statement { itpt_ret_free(interpreter($2));}
|
;
statement :
ID '=' expr ';' { $$=syntax_t_new('=',2,syntax_t_id($1),syntax_t_const($3)); }
| selection_statement {$$=$1;}
| '{' statement_block '}' {$$=$2;}
| PRINT '(' var ')' ';' { $$=syntax_t_new(PRINT,1,$3);}
| ';' { $$=syntax_t_new(';',2,NULL,NULL);}
;
selection_statement:
IF '(' var ')' statement ELSE statement {$$=syntax_t_new(IF,3,$3,$5,$7);}
| IF '(' var ')' statement {$$=syntax_t_new(IF,2,$3,$5);}
;
statement_block:
statement {$$=$1;}
| statement_block statement {$$=syntax_t_new(';',2,$1,$2);}
;
var :
ID { $$ = syntax_t_id($1); }
| INT { $$ = syntax_t_const($1); }
;
expr:
INT { $$ = $1;}
| expr '+' expr { $$= $1 + $3; }
| expr '-' expr { $$ =$1 - $3; }
| expr '/' expr {
if($3==0)
yyerror("div by zero!\n");
else
$$ =$1 / $3; }
| expr '*' expr { $$ =$1 * $3; }
| '-' expr %prec UMINUS { $$ =-$2; }
| '(' expr ')' { $$= $2; }
;
%%
void yyerror(char *s){
fprintf(stderr,"%s\n",s);
}
int main(int argc, char *argv[])
{
int i=0;
st=symbol_table_init();
if(argc >= 2)
{
for (i = 1; i < argc; ++i)
{
if((yyin=fopen(argv[i],"r"))==NULL)
continue;
yyparse();
fclose(yyin);
}
}
else{
yyparse();
}
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。