YACC使用总结

本文介绍了如何使用Lex进行词法分析,包括基本使用、新手框架以及lex和yacc的联合使用。同时,详细解释了在定义优先级时的重要规则。
摘要由CSDN通过智能技术生成

一、基本使用

1.lex的使用
    flex test.l     //会生成C文件lex.yy.c
    gcc lex.yy.c    //编译生成可执行文件

2.lex和yacc联合使用
    bison -d test.y        //会生成test.tab.h test.tab.c
    flex test.1            //会生成C文件lex.yy.c
    gcc lex.yy.c test.tab.c //编译生成可执行文件

二、新手框架

单独使用lex的新手框架

%{

%}

%%

%%
int main(int argc, char **argv)
{
  yylex()
  return 0;
}
int yywrap()
{
    return 1;
}

联合使用时lex的新手框架

%{
#include "y.tab.h"
void yyerror(char *);
%}

%%

%%

联合使用时yacc的新手框架

%{
int yylex(void);
void yyerror(char *);
%}
%token 

%%

%%
void yyerror(char *str){
    fprintf(stderr,"error:%s\n",str);
}

int yywrap(){
    return 1;
}
int main()
{
    yyparse();
}

三、优先级

1.词法定义中,先定义的token优先级 > 后定义的token优先级

2.在Yacc/Bison中使用 %left 指令时,后定义的运算符会具有更高的优先级,这是因为Yacc/Bison解析器根据指令出现的顺序来确定运算符的优先级。

  具体来说,当我们定义 %left '+' '-' 时,加法和减法的优先级相同且较低。然后,当我们定义 %left '*' '/' 时,乘法和除法的优先级比加法和减法高。这意味着在解析表达式时,乘法和除法的优先级更高,会先被处理。

如果我们反过来定义 %left '*' '/' 和 %left '+' '-',那么加法和减法的优先级将会比乘法和除法高。所以,定义 %left 指令时,后定义的运算符具有更高的优先级

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值