我是靠谱客的博主 落后帽子,最近开发中收集的这篇文章主要介绍用Yacc做语法分析YACC简介YACC实验内容,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

用Yacc做语法分析

YACC简介

Yacc 全称 Yet Another Compiler Compiler
Yacc是一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
Yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
Yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。

YACC实验内容

1.实验环境配置
安装Parser Generator。并编译lex和yacc函数库
2.编写Lex程序
 题目:编写一个Yacc程序。改程序以布尔表达式作为输入,并计算这个表达式的值。
布尔表达式为:
bexpr ->bexpr or bterm | bterm
bterm -> bterm and bfactor | bfactor
bfactor-> not bfactor | (bexpr) | true | false

编写Yacc程序如下:
myparser.y*
%{
#include "mylexer.h"
%}
//定义
%include{
#ifndef YYSTYPE
#define YYSTYPE int
#endif
}
%token TRUE
%token FALSE
%%
//规则
line : bexpr 'n' {if($1==1){printf("true");}else{printf("false");}}
| 'n' {printf("n");}
;
bexpr: bexpr '&' bterm {if(($1==1)&&($3==1)){$$=1;}else{$$=0;}}
| bterm
bterm: bterm '|' bfactor {if(($1==0)&&($3==0)){$$=0;}else{$$=1;}}
| bfactor
;
bfactor: '~'bfactor {if($2==1){$$=0;}else{$$=1;}}
| '('bexpr')' {$$=$2;}
|TRUE
|FALSE
;
%%
//程序段
#pragma comment(lib,"yl.lib")
extern FILE *yyin;
int main(void)
{
yyin=stdin;
return yyparse();
}

编写Lex程序如下:
//mylexer.l
%{
#include "myparser.h"
#include<stdlib.h>
extern int yylval;
%}
//声明
%%
//规则部分
true {yylval=1;return TRUE;}
false {yylval=0;return FALSE;}
.|n {return yytext[0];}
%%

然后可以通过输入一些布尔表达式进行测试。

最后

以上就是落后帽子为你收集整理的用Yacc做语法分析YACC简介YACC实验内容的全部内容,希望文章能够帮你解决用Yacc做语法分析YACC简介YACC实验内容所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部