编辑我的问题。 在表达式规则中: exp 不会缩减为表达式 例如:标识符(exp) - 标识符(exp)
运行测试:http://www.interload.co.il/upload/2528784.png 在图像中,您可以看到yacc由于某种原因正在等待更多输入。 表达规则有什么问题? ----------------------------- yacc code ------------------- ------------
offline
--------------- lex code:----------------------------- ---
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
char* token;
struct node* left;
struct node* right;
}node;
node* mknode(char* token,node* left, node* right);
void printtree(node* tree);
#define YYSTYPE struct node*
%}
%start s
%token WHILELOOP
%token STATIF
%token ELSE
%token MAIN
%token POINTERERR
%token COMMENT
%token POINTER
%token GREATEREQUAL
%token LESSEREQUAL
%token DBLAND
%token GREATER
%token LESSER
%token LESSER
%token POWER
%token MULTIPLY
%token MINUS
%token PLUS
%token AND
%token OR
%token NOT
%token NOTEQUAL
%token CHARERROR
%token STRINGERROR
%token POINTER
%token INTEGER
%token BOOLEAN
%token DEVIDE
%token ASSIGN
%token EQUAL
%token TYPE
%token IDENTIFIER
%token HEX IF
%token LITERCHAR
%token OCTAL
%token BINARYINT
%token LTRLSTRING
%token COMMA COLON SEMICOLON VAR RETURN RPARENC LPARENC
%left COMMA LPAREN RPAREN
%left PLUS
%left MINUS DEVIDE
%left MULTIPLY EQUAL NOTEQUAL OR AND LESSEREQUAL GREATEREQUAL GREATER LESSER
%right IDENTIFIER
%%
s: expression|operator|var_declare|if_stnt;
{
printf("blaAA bla/n");
};
expression: exp {printtree($1);}
exp: exp PLUS exp {$$=mknode("+",$1,$3);}
|exp MINUS exp {$$=mknode("-",$1,$3);}
|exp DEVIDE exp {$$=mknode("/",$1,$3);}
|exp MULTIPLY exp {$$=mknode("*",$1,$3);}
| MINUS exp {$$=mknode("-",NULL,$2);}
|IDENTIFIER {$$= mknode(yytext,NULL,NULL);}
operator: op{printtree($1);}
op: exp EQUAL exp {$$=mknode("=",$1,$3);}
|exp NOTEQUAL exp {$$=mknode("!=",$1,$3);}
|exp OR exp {$$=mknode("||",$1,$3);}
|exp AND exp {$$=mknode("&&",$1,$3);}
|exp GREATER exp {$$=mknode(">",$1,$3);}
|exp GREATEREQUAL exp {$$=mknode(">=",$1,$3);}
|exp LESSER exp {$$=mknode("<",$1,$3);}
|exp LESSEREQUAL exp {$$=mknode("<=",$1,$3);}
var_declare: var {printtree($1);}
var: VAR ident_list COLON TYPE SEMICOLON{$$=mknode("var",$2,$4);}
ident_list: ident_list COMMA ident_list {$$=mknode(",", $1, $3);}
|IDENTIFIER {$$= mknode(yytext,NULL,NULL);}
if_stnt:IF LPAREN exp RPAREN
%%
#include "lex.yy.c"
main()
{
return yyparse();
}
node* mknode(char* token,node*left,node* right)
{
node* newnode=(node*)malloc(sizeof(node));
char* newstr=(char*)malloc(sizeof(token)+1);
newstr[sizeof(token)]='\0';
strcpy(newstr,token);
newnode->left=left;
newnode->right=right;
newnode->token=newstr;
return newnode;
}
void printtree(node* tree)
{
printf("%s\n",tree->token);
if(tree->left)printtree(tree->left);
if(tree->right)printtree(tree->right);
}
int yyerror()
{
printf("bla bla\n");
return 0;
}
答案 0 :(得分:0)
为了进行最终缩减s: expression
并返回,yacc需要在输入结束时看到EOF。如果您正在读取文件,那么EOF会自动出现,但终端输入没有 end ,所以当来自终端的输入时,您需要给它一个明确的EOF通过在Windows上按 ctrl D ( ctrl Z )来指示。