完整word版实验四 编译 用Yacc工具构造语法分析器Word文档下载推荐.docx
《完整word版实验四 编译 用Yacc工具构造语法分析器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《完整word版实验四 编译 用Yacc工具构造语法分析器Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
stdlib.h>
#include"
myYacc.tab.h"
%}
delim[\t\n]
ws{delim}+
letter[A-Za-z]
digit[0-9]
%%
{ws}{}
"
if"
{printf("
IF"
);
return(IF);
}
else"
ELSE"
return(ELSE);
int"
INT"
return(BASIC);
float"
FLOAT"
break"
BREAK"
return(BREAK);
do"
DO"
return(DO);
while"
WHILE"
return(WHILE);
true"
TRUE"
return(TRUE);
index"
INDEX"
return(INDEX);
bool"
BOOL"
char"
CHAR"
real"
return(REAL);
false"
FLASE"
return(FALSE);
[a-zA-Z_][a-zA-Z0-9_]*{printf("
ID"
return(ID);
[+-]?
[0-9]+{printf("
NUM"
return(NUM);
[0-9]*[.][0-9]+{printf("
<
LT"
return('
'
="
LE"
return(LE);
="
='
=="
EQ"
return(EQ);
!
NE"
return(NE);
>
GT"
GE"
return(GE);
+"
+"
+'
-"
-"
-'
["
["
['
]"
]"
]'
{"
{'
}
}"
}'
("
('
)"
)'
;
"
'
&
return(AND);
||"
return(OR);
Myyacc.y
externintyylex();
externintyyerror();
%tokenNUM
%tokenID
%tokenIFWHILEDOBREAKREALTRUEFALSEBASICELSEINDEXGELENEEQANDOR
program:
block{printf("
program-->
block\n"
}
;
block:
'
declsstmts'
{printf("
block-->
{declsstmts}\n"
decls:
|declsdecl{printf("
decls-->
declsdecl\n"
decl:
typeID'
decl-->
typeid;
\n"
type:
type'
NUM'
type-->
type[num]\n"
|BASIC{printf("
basic\n"
stmts:
|stmtsstmt{printf("
stmts-->
stmtsstmt\n"
stmt:
matched_stmt{printf("
stmt-->
matched_stmt\n"
|open_stmt{printf("
open_stmt\n"
open_stmt:
IF'
booL'
stmt{printf("
open_stmt-->
if(bool)stmt\n"
|IF'
matched_stmtELSEopen_stmt{printf("
if(bool)matched_stmtelseopen_stmt\n"
matched_stmt:
matched_stmtELSEmatched_stmt{printf("
matched_stmt-->
if(bool)matched_stmtelsematched_stmt\n"
|other{printf("
other\n"
other:
loc'
loc=bool;
|WHILE'
while(bool)stmt\n"
|DOstmtWHILE'
dostmtwhile(bool);
|BREAK'
break;
|block{printf("
loc:
loc-->
loc[bool]\n"
|ID{printf("
id\n"
booL:
booLORjoin{printf("
bool-->
bool||join\n"
|join{printf("
join\n"
join:
joinANDequality{printf("
join-->
join&
equality\n"
|equality{printf("
equality:
equalityEQrel{printf("
equality-->
equality==rel\n"
|equalityNErel{printf("
equality!
=rel\n"
|rel{printf("
rel\n"
rel:
expr'
expr{printf("
rel-->
expr<
expr\n"
|exprLEexpr{printf("
=expr\n"
}
|exprGEexpr{printf("
expr>
|expr'
|expr{printf("
expr:
term{printf("
expr-->
expr+term\n"
expr-term\n"
|term{printf("
term\n"
term:
term'
*'
unary{printf("
term-->
term*unary\n"
|term'
/'
term/unary\n"
|unary{printf("
unary\n"
unary:
unary-->
|'
-unary\n"
|factor{printf("
factor\n"
factor:
{