linux下的bison报错,求高手指教!急

蜗蜗牛快跑 蜗蜗牛快跑 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
想用flex+bison写个简单的编译器,生成三地址中间代码。结果bison的编译就一堆警告。。。大概是说定义的文法没有用之类的。

这个是flex文件

%option noyywrap nodefault yylineno

%{
#include "compiler.h"
#include "parsing.tab.h"
%}

%%
"+" |
"-" |
"*" |
"/" |
"=" |
";" |
"(" |
")" |
"{" |
"}" { return yytext[0];}

">" { yylval.cmp = 1; return CMP; }
"<" { yylval.cmp = 2; return CMP; }
"!=" { yylval.cmp = 3; return CMP; }
"==" { yylval.cmp = 4; return CMP; }
">=" { yylval.cmp = 5; return CMP; }
"<=" { yylval.cmp = 6; return CMP; }

"if" { return IF; }
"else" { return ELSE; }
"while" { return WHILE; }
"do" { return DO; }
"break" { return BREAK;}

"&&" { return AND;}
"||" { return OR;}

"int" { yylval.type=1; return TYPE;}
"float" { yylval.type=2; return TYPE;}
"bool" { yylval.type=3; return TYPE;}

[0-9]+ { yylval.i=atoi(yytext); return INTEGER;}
[0-9]+"."[0-9]* { yylval.d=atof(yytext); return FLOAT;}
"true" |
"false" { yylval.b=strdup(yytext); return BOOLEAN;}

[a-zA-Z][a-zA-Z0-9]* { yylval.s = lookup(yytext); return ID; }

"//".*
[ \t\n]

. { yyerror("error input %c\n",*yytext);}
%%




这个是bison文件,所有的警告都在这里


%{
#include <stdio.h>
#include <stdlib.h>
#include "compiler.h"
%}

%union{
struct ast *a;

double d;
int i;
char * b;

struct symbol *s;

int cmp;
int type;
}


%token <i> INTEGER
%token <d> FLOAT
%token <b> BOOLEAN
%token <s> ID
%token EOL

%token IF ELSE WHILE DO BREAK
%token AND OR

%token <type> TYPE

%nonassoc <cmp> CMP
%right '='
%left '+' '-'
%left '*' '/'

%type <a> block
%type <a> decls decl type
%type <a> stmts stmt loc bool
%type <a> join equality expr term unary factor

%start calclist

%%

block: '{' decls stmts '}' { $$=$3;}
;

decls: decls decl
;
decl: type ID ';'
;
type: type '[' INTEGER ']'
| TYPE { $$=newast('X',S1,NULL);}
;

stmts: stmts stmt { $$=newast('C',$1,$2);}
;
stmt: loc '=' bool ';' { $$=newast('=',$1,$3);}
| IF '(' bool ')' stmt { $$=newflow('I',$3,$5,NULL);}
| IF '(' bool ')' stmt ELSE stmt { $$=newflow('I',$3,$5,$7);}
| WHILE '(' bool ')' stmt { $$=newflow('W',$3,$5,NULL);}
| DO stmt WHILE '(' bool ')' ';' { $$=newflow('D',$5,$2,NULL);}
| BREAK ';' { $$=newast('B',NULL,NULL);}
| block
;

loc: loc '[' bool ']' { $$=newast('[',$1,$3);}
| ID { $$=newref($1);}
;
bool: bool OR join { $$=newast('|',$1,$3);}
| join
;
join: join AND equality { $$=newast('&',$1,$3);}
| equality
;
equality: equality CMP expr { $$=newcmp($2,$1,$3);}
| expr
;
expr: expr '+' term { $$=newast('+',$1,$3);}
| expr '-' term { $$=newast('-',$1,$3);}
| term
;
term: term '*' unary { $$=newast('*',$1,$3);}
| term '/' unary { $$=newast('/',$1,$3);}
| unary
;
unary: '!' unary { $$=newast('!',$2,NULL);}
| '-' unary { $$=newast('M',$2,NULL);}
| factor
;
factor: '(' bool ')' { $$=$2;}
| loc
| INTEGER { $$=newint($1);}
| FLOAT { $$=newflo($1);}
| BOOLEAN { $$=newbol($1);}
;

calclist:
| calclist block EOL { $2;printf("end\n");}
;
%%



警告大概如下:
parsing.y: 警告: 14 nonterminals useless in grammar
parsing.y: 警告: 36 rules useless in grammar
parsing.y:38.11-15: 警告: nonterminal useless in grammar: block
...(省略)
parsing.y:47.8-41: 警告: rule useless in grammar: block: '{' decls stmts '}'
...(省略)

求高手分析上面定义的文法是否不可以用在bison中,还是我哪里写错了。。。
...全文

相关推荐

Linux环境中使用Flex、Bison进行SQL语法分析.pdf

Linux环境中使用Flex、Bison进行SQL语法分析.pdf

结冰架构

flex & bison pdf 英文

《flex 与 bison(影印版)》内容简介:如果你需要分析或处理Linux或Unix中的文本数据,这本有用的书籍就向你讲解了如何使用flex和bison迅速解决问题。《flex与bison》被期待已久,是经典O’Reilly系列书籍《lex & yacc》的续篇。在原书出版以来的近20年中,flex和bison已被证明比原来的Unix工具更可靠、更强大。 《flex与bison》一书涵盖了Linux和Unix程序开发中相同的重要核心功能,以及一些重要的新主题。你会找到适用于新手的修订教程和适用于高级用户的参考资料,以及对每个程序的基本用法的解释,并且运用它们创建简单、独立的应用程序。有了《flex与bison》,你会发现这些灵活的工具提供的广泛用途。 包括的主题有: 正则表达式工具无法处理的地址语法挤压(address syrltax crunching) 生成编译器和解释器,并运用大范围的文本处理功能 解释代码、配置文件或任何其他结构化的格式 学习关键编程技术,包括抽象语法树和符号表 用完整的示例代码实现一个完善的SQI一语法 使用新的功能,如纯(可重入)词法分析器(Iexer)和语法分析器(parser)、功能强大的JGLR分析器和C++的接口

babyaries

Linux服务器安装GRUB步骤

在本篇文章中我们给大家整理了Linux服务器安装GRUB的详细步骤以及相关注意事项,有需要的朋友们参考下。

weixin_38667581

centos 源码安装:iftop

iftop是linux下的一个流量监控工具,用于查看实时网络流量,反向解析IP,显示端口信息 源码安装包 源码安装iftop,需要基于Flex,Bison,libpcap环境,不然安装过程中会报错。 flex -V bison -V tcpdump --version

voaycc

LNMP环境搭建和报错处理

lnmp环境搭建报错处理 lnmp环境搭建报错处理 lnmp环境搭建报错处理

qq_20979961
评论 5
收藏 已收藏
分享
返回顶部
蜗蜗牛快跑
C语言 70,039 成员 243,237 内容