高分求救:如何bison

xuelihuang 2004-05-05 05:14:22
现急需用bison语法生成器生成一固定文法的.output文件,现在已有一个bison.exe但是不知如何使用,请高手指点迷津
...全文
144 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowWind 2004-07-19
  • 打赏
  • 举报
回复
mark
yueleixinghan 2004-06-08
  • 打赏
  • 举报
回复
使用方法
bison 输入文件名 -o *.output [回车]
如果有其他问题发邮件到pass@bit.edu.cn
xuelihuang 2004-05-05
  • 打赏
  • 举报
回复
上面是tiny语言的固定文法的一个bison说明文件,由于我也不会用flex只好将词法分析,也写到c语言例程中去,包含在了yylex()中,因为,yylex()返回的是记号的类型,所以不得在定义部分又用枚举类型将记号又记录了一下,不知道这和下面的用%token定义的记号是否有冲突,再者如何用bison.exe来选择-v选项,来执行这一文件,来生成一文档式的分析表,即:.output文件
xuelihuang 2004-05-05
  • 打赏
  • 举报
回复
%{
#define MAXTOKEN 40
#define FALSE 0
#define TRUE 1
#define BUFLEN 256
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
FILE * source;
FILE * listing;
FILE * lineno;
char tokenString[MAXTOKENLEN+1];
typedef emum
{
IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,
ID,NUM,
ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPARENT,RPARENT,SEMI,
ERROR ,ENDFILE
}tokenType;
typdef enum
{
START,INASSIGN,INCOMMENT,INNUM,INID,DONE
}stateType;
static struct
{
char *str;
tokenType tok;
}reservedWords[8]={{"if",IF},{"then",THEN},{"else",ELSE},{"end",END},{"repeat",REPEAT},{"until",UNTIL},{"read",READ},{"write",WRITE}};
static char lineBuf[BUFLEN];
static int linepos=0;
static int bufsize=0;
%}

%token IF THEN ELSE END REPEAT UNTIL READ WRITE
%token ID NUM
%token ASSIGN EQ LT PLUS MINUS TIMES OVER LPARENT RPARENT SEMI
%token ERROR
%%
program: stmt_seq
;
stmt_seq:stmt_seq SEMI stmt
|stmt
;
stmt:if_stmt
|repeat_stmt
|assign_stmt
|read_stmt
|write_stmt
;
if_stmt:IF exp THEN stmt_seq END
|IF exp THEN stmt_seq ELSE stmt_seq END
;
repeat_stmt:REPEAT stmt_seq UNTIL exp
;
assign_stmt:ID ASSIGN exp
;
read_stmt:READ ID
;
write_stmt:WRITE exp
;
exp:simple_exp LT simple_exp
|simple_exp EQ simple_exp
|simple_exp
;
simple_exp:simple_exp PLUS term
|simple_exp MINUS term
|term
;
term:term TIMES factor
|term OVER factor
|factor
;
factor:LPARENT exp RPARENT
|NUM
|ID
;
%%

main()
{
return yyparse();
}
static char getNextChar()
{
if(!(linepos<bufsize))
{
lineno++;
if(fgets(lineBuf,BUFLEN-1,source))
{
fprintf(listing,"%4d:%s",lineno,lineBuf);
bufsize=strlen(lineBuf);
linepos=0;
}
else
return EOF;
}
else
return lineBuf[linepos++];
}

static void ungetNextChar()
{
linepos--;
}



static tokenType reservedLookup(char *s)
{
int i;

for(i=0;i<8;i++)

if(!strcmp(s,reservedWords[i].str))

return reservedWords[i].tok;

return ID;


}

tokenType yylex()
{
int tokenStringIndex=0;
tokenType currentToken;
stateType state=START;
int save;
while(state!=DONE)
{
char c=getNextChar();
save=TRUE;
switch(state)
{
case START:
if(isdigit(c))
state=INNUM;
else if(isalpha(c))
state=INID;
else if(c==':')
state=INASSIGN;
else if((c==' ')||(c=='\t')||(c=='\n'))
save=FALSE;
else if(c=='{')
{
save=FALSE;
state=INCOMMENT;
}
else
{
state=DONE;
switch(c)
{
case EOF:
save=FALSE;
currentToken=ENDFILE;
break;
case '=':
currentToken=EQ;
break;
case '<':
currentToken=LT;
break;
case '+':
currentToken=PLUS;
break;
case '-':
currentToken='MINUS';
break;
case '*':
currentToken='TIMES';
break;
case '/':
currentToken='OVER';
break;

case '(':
currentToken = LPAREN;
break;
case ')':
currentToken = RPAREN;
break;
case ';':
currentToken = SEMI;
break;
default:
currentToken = ERROR;
break;
}
}
break;
case INCOMMENT:
save = FALSE;
if(c == '}')
state = START;
break;
case INASSIGN:
state = DONE;
if(c =='=')
currentToken = ASSIGN;
else
{
ungetNextChar();
save = FALSE;
currentToken = ERROR;
}
break;
case INNUM:
if(!isdigit (c))
{
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = NUM;
}
break;
case INID:
if(!isalpha(c))
{
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = ID;
}
break;
case DONE:
break;
default:
fprintf(listing, "Scanner Bug: state = %d\n",state);
state = DONE;
currentToken = ERROR;
break;
}
if((save) && (tokenStringIndex <= MAXTOKENLEN))
tokenString[ tokenStringIndex++] = c;
if(state == DONE)
{
tokenString[ tokenStringIndex] = '\0';
if( currentToken == ID)
currentToken = resenvedLookup(tokenString);
}
}

return currentToken;
}

2,163

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 UNIX文化
社区管理员
  • UNIX文化社区
  • 文天大人
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧