编译原理——实验叁——基于YACC的TINY语法分析器的构建
一、 實驗要求
運用YACC,針對TINY語言,構造一個語法分析器。給出實驗方案,實施并描述結果。
二、 實驗方案
(1)設計基于YACC的TINY詞法分析器
(2)設計基于LEX的TINY語法分析器
(3)使用兩個分析器分析算數文法
三、 分析表parsing table問題
推導當前非終結符和輸入符號。
四、 內容和步驟
1、針對TINY語言給出 yacc的y文件的代碼
%{#include <ctype.h>
#include<stdio.h>
#define MSDOS
int linecount;
extern int yylex();
extern int yyerror();
%}
%union{
char chr;
char str;
int integer;
float real;
double dbl;
}
%token number
%type expr number
%left ‘+’ ‘-’
%left '’ ‘/’
%right uminus
%%
lines: lines expr’\n’
{
printf(“line %d:%g\n”,linecount++,$2);
}
|lines’\n’
{
linecount++;
}
| ;
expr: expr’+‘expr
{
KaTeX parse error: Can't use function '$' in math mode at position 2: =$?1+$3; } |expr…=$1-$3;
}
|expr ‘’ expr
{
KaTeX parse error: Can't use function '$' in math mode at position 2: =$?1*$3; } | exp…=$1/$3;
}
| ‘(’ expr ‘)’
{
KaTeX parse error: Can't use function '$' in math mode at position 2: =$?2; } | '-' ex…=-$2;
}
| number;
%%
int yyerror(s)
char s;
{
fprintf(stderr,“syntactic error:%s\n”,s);
return 0;
}
2、給出.l文件的代碼
%{
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define ture 1
#define false 0
#include “yacc.tab.h”
extern int lexverbose;
extern int linecount;
%}
digit [0-9]
letter [a-zA-Z]
%%
{digit}+ {
yylval.real=(float)atof(yytext);
if(lexverbose)
printf(“real:%g\n”,yylval.real);
return(number);
}
+ {
yylval.chr=yytext[0];
if(lexverbose)
printf(“opterator:%c\n”,yylval.chr);
return(’+’);
}
- {
yylval.chr=yytext[0];
if(lexverbose)
printf(“oprator:%c\n”,yylval.chr);
return(’-’);
}
* {
yylval.chr=yytext[0];
if(lexverbose)
printf(“oprator:%c\n”,yylval.chr);
return(’’);
}
/ {
yylval.chr=yytext[0];
if(lexverbose)
printf(“oprator:%c\n”,yylval.chr);
return(’/’);
}
“(” {
yylval.chr=yytext[0];
if(lexverbose)
printf(“separator:%c\n”,yylval.chr);
return(’(’);
}
“)” {
yylval.chr=yytext[0];
if(lexverbose)
printf(“separtor:%c\n”,yylval.chr);
return(’)’);
}
;
{
return(’;’);
}
\n {
printf(“line %d\n”,linecount);
/ linecount++; */
return(’\n’);
}
[ \t]+ {
printf(“lexical analyzer error\n”);
}
quit {
printf(“Bye!\n”);
exit(0);
}
%%
int yywrap()
{
return(1);
}
3、實驗具體步驟
3.1、構造main.c
#include"lex.yy.c"
#include"yacc.tab.c"
#include <stdlib.h>
#include <stdio.h>
int lexverbose=1;
extern int yyparse();
int main(int argc, char* argv[])
{
extern FILE yyin;
printf(“Compiling…!\n”);
if((yyin=fopen(“test.c”,“rt”))==NULL){
perror(“can not open file test.txt\n”) ;
exit(1);
}
if (yyparse()==1){
fprintf(stderr,“parser error\n”);
exit(1);
}
printf(“yyparse() completed successfully!\n”);
return 0;
}
3.2、編譯
五、 實驗結果:
2+13
1+1
六、 實驗結論:
1 、實驗結論
(1) yacc需要搭配lex才能發揮編譯作用
(2) lex可以生成一個詞法分析器
(3) yacc和lex結合使用可以完成算數運算分析
2、分析和總結
工具非常小巧便捷,但是高效好用
3、實驗中出現的沖突及解決過程描述
(1)lex和yacc代碼書寫問題
解決方法:多看書并上網學習他人方法
(2)yacc和lex先后問題
解決方案:先執行yacc.y再執行lex.l
總結
以上是生活随笔為你收集整理的编译原理——实验叁——基于YACC的TINY语法分析器的构建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《大数据》2015年第2期“研究”——大
- 下一篇: 数据库系统实训——实验二——单表查询