linux下的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++的接口
Linux服务器安装GRUB步骤
在本篇文章中我们给大家整理了Linux服务器安装GRUB的详细步骤以及相关注意事项,有需要的朋友们参考下。
centos 源码安装:iftop
iftop是linux下的一个流量监控工具,用于查看实时网络流量,反向解析IP,显示端口信息 源码安装包 源码安装iftop,需要基于Flex,Bison,libpcap环境,不然安装过程中会报错。 flex -V bison -V tcpdump --version
LNMP环境搭建和报错处理
lnmp环境搭建报错处理 lnmp环境搭建报错处理 lnmp环境搭建报错处理


