?? parse.y
字號:
%{
/****************************************************************************
parse.y
ParserWizard generated YACC file.
BY:計算機科學與技術系 0610386 蒲凌君
Date: 2008年12月22日 星期一
****************************************************************************/
#define YYPARSER
#include "globals.h"
#include "util.h"
#include "scan.h"
#include "parse.h"
static char * savedFunName; //保存函數(shù)名
static char * savedIdName; //保存變量名
static int savedLineNo; //保存行號
static TreeNode * savedTree; //保存語法樹的根結點
%}
/////////////////////////////////////////////////////////////////////////////
// declarations section
%token ENDFILE ERROR
%token INT CHAR DOUBLE VOID //類型(PS:匯編程序可以完成INT CHAR的翻譯,DOUBLE可以識別,翻譯還不太會)
%token IF ELSE WHILE ASSIGN RETURN FOR INPUT OUTPUT //語句(IF ELSE;WHILE;FOR;賦值;輸入;輸出;函數(shù)返回;)
%token ID NUM FNUM SCHAR //定義變量
%token SEMI COMMA LP RP LSP RSP LFP RFP //定義一些輔助符號(; , ( ) [ ] { })
%token PLUS SUB MUT DIV MOD INC DEC B_AND B_OR B_NOT B_XOR B_LEFT B_RIGHT //算術運算(+,-,*,/,%,++,--,&,|,^,~,<<,>>)
%token EQ GT LT GE LE NEQ //關系運算(==,>,<,>=,<=,!=)
%token AND OR NOT //邏輯運算(&&,||,!)
%union { TreeNode * ptree; //定義樹結點
Type type; //定義類型
}
%type <ptree> program dec_list dec var_dec fun_dec fun_def params param_list param comp_stmt local_dec stmt_list stmt
exp_stmt sele_stmt iter_stmt return_stmt exp var simple_exp factor call args arg_list
id_list input_stmt output_stmt
%type <type> type_spec
%left COMMA //按照優(yōu)先級的關系進行先后定義(優(yōu)先級從上到下依次增加)
%right ASSIGN
%left OR
%left AND
%left B_AND B_XOR B_OR
%left EQ NEQ
%left LT LE GT GE
%left B_LEFT B_RIGHT
%left PLUS SUB
%left MOD
%left MUT DIV
%left NOT B_NOT
%left INC DEC
%left LP RP LSP RSP LFP RFP
%right ELSE
%include {
void yyerror(const char * message);
TreeNode * parse(void);
}
%%
/////////////////////////////////////////////////////////////////////////////
// rules section
program : dec_list //程序由聲明表組成
{ savedTree = $1;}
;
dec_list : dec_list dec //用兄弟結點表示不同的聲明語句
{ TreeNode * t = $1;
if (t != NULL)
{ while (t->sibling != NULL)
t = t->sibling;
t->sibling = $2;
$$ = $1; }
else $$ = $2;
}
| dec
{ $$ = $1; }
;
dec : var_dec { $$ = $1; } //聲明由三種的情況(變量定義;函數(shù)聲明;函數(shù)定義)組成
| fun_dec { $$ = $1; }
| fun_def { $$ = $1; }
;
id : ID { savedIdName = copyString(tokenString); }
;
fid : { savedFunName = savedIdName; } //保存函數(shù)名
;
var_dec : type_spec id_list SEMI //變量定義
{ if($1 == Void)
;
// err
else
{
$$ = newDecNode(VarK);
$$ -> type = $1;
$$ -> child[0] = $2;
}
}
;
id_list : id_list COMMA var //用兄弟結點表示不同的變量名
{
TreeNode * t = $1;
if (t != NULL)
{ while (t->sibling != NULL)
t = t->sibling;
t->sibling = $3;
$$ = $1; }
else $$ = $3;
} // i,str[5],j
| var { $$ = $1; }
| id_list COMMA id ASSIGN simple_exp //在聲明時還可以對其進行賦值
{
TreeNode * new_node = newStmtNode(AssignK);
TreeNode * t = $1;
if (t != NULL)
{ while (t->sibling != NULL)
t = t->sibling;
t->sibling = new_node;
$$ = $1; }
else $$ = new_node;
}
| id ASSIGN simple_exp
{
$$ = newStmtNode(AssignK);
$$ -> child[0] = newExpNode(IdK);
$$ -> child[0] -> attr.name = savedIdName;
$$ -> child[1] = $3;
}
;
type_spec : INT { $$ = Integer; } //類型定義(int;char;double;void)
| DOUBLE { $$ = Double; }
| CHAR { $$ = Char; }
| VOID { $$ = Void; }
;
fun_def : type_spec id fid LP params RP comp_stmt //函數(shù)定義
{ $$ = newDecNode(FunDefK);
$$ -> attr.name = savedFunName;
$$ -> type = $1;
$$ -> child[0] = $5;
$$ -> child[1] = $7;
}
| id fid LP params RP comp_stmt
{ $$ = newDecNode(FunDefK);
$$ -> attr.name = savedFunName;
$$ -> type = Void;
$$ -> child[0] = $4;
$$ -> child[1] = $6;
}
;
fun_dec : type_spec id fid LP params RP SEMI
{ $$ = newDecNode(FunDecK);
$$ -> attr.name = savedFunName;
$$ -> type = $1;
$$ -> child[0] = $5;
$$ -> child[1] = NULL;
}
| id fid LP params RP SEMI
{ $$ = newDecNode(FunDecK);
$$ -> attr.name = savedFunName;
$$ -> type = Void;
$$ -> child[0] = $4;
$$ -> child[1] = NULL;
}
;
params : param_list //函數(shù)的參數(shù)列表
{ $$ = $1; }
|
{ $$ = NULL; }
;
param_list : param_list COMMA param
{ TreeNode * t = $1;
if (t != NULL)
{ while (t->sibling != NULL)
t = t->sibling;
t->sibling = $3;
$$ = $1; }
else $$ = $3;
}
| param
{ $$ = $1; }
;
param : type_spec
{ $$ = newDecNode(ParamK);
$$ -> type = $1;
}
| type_spec id
{ $$ = newDecNode(ParamK);
$$ -> type = $1;
$$ -> attr.name = savedIdName;
}
;
comp_stmt : LFP local_dec stmt_list RFP //復合語句定義
{ $$ = newDecNode(CompK);
$$ -> child[0] = $2;
$$ -> child[1] = $3;
}
;
local_dec : local_dec var_dec //臨時變量的定義
{ TreeNode * t = $1;
if (t != NULL)
{ while (t->sibling != NULL)
t = t->sibling;
t->sibling = $2;
$$ = $1; }
else $$ = $2;
}
|
{ $$ = NULL; }
;
stmt_list : stmt_list stmt //語句表
{ TreeNode * t = $1;
if (t != NULL)
{ while (t->sibling != NULL)
t = t->sibling;
t->sibling = $2;
$$ = $1; }
else $$ = $2;
}
|
{ $$ = NULL; }
;
stmt : exp_stmt { $$ = $1; } //語句的類型(條件語句,循環(huán)語句,輸入輸出語句等)
| sele_stmt { $$ = $1; }
| iter_stmt { $$ = $1; }
| return_stmt { $$ = $1; }
| comp_stmt { $$ = $1; }
| input_stmt { $$ = $1; }
| output_stmt{ $$ = $1; }
;
exp_stmt : exp SEMI
{ $$ = $1; }
| SEMI
{ $$ = NULL; }
;
sele_stmt : IF LP exp RP stmt %prec ELSE //IF語句的兩種形式
{ $$ = newStmtNode(IfK);
$$ -> child[0] = $3;
$$ -> child[1] = $5;
}
| IF LP exp RP stmt ELSE stmt
{ $$ = newStmtNode(IfK);
$$ -> child[0] = $3;
$$ -> child[1] = $5;
$$ -> child[2] = $7;
}
;
iter_stmt : WHILE LP exp RP stmt //循環(huán)語句(WHILE,FOR)
{ $$ = newStmtNode(WhileK);
$$ -> child[0] = $3;
$$ -> child[1] = $5;
}
| FOR LP exp_stmt exp_stmt exp RP stmt
{
$$ = newStmtNode(ForK);
$$ -> child[0] = $3;
$$ -> child[1] = $4;
$$ -> child[2] = $7;
$$ -> child[3] = $5;
}
;
input_stmt : INPUT LP id RP SEMI //輸入語句
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -