yacc不打印AST

时间:2017-01-21 18:41:20

标签: yacc

编辑我的问题。 在表达式规则中: 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;
            }

1 个答案:

答案 0 :(得分:0)

为了进行最终缩减s: expression并返回,yacc需要在输入结束时看到EOF。如果您正在读取文件,那么EOF会自动出现,但终端输入没有 end ,所以当来自终端的输入时,您需要给它一个明确的EOF通过在Windows上按 ctrl D ctrl Z )来指示。