首页 > 解决方案 > YACC 表达式语法不会执行

问题描述

我正在尝试使用以下语法生成中间代码,但我得到的输出好像我的解析器没有根据此语法评估输入。

下面是我的 lex.l 文件:

%{
    #include "y.tab.h"
    extern char yyval;
%}


NUMBER      [0-9]       
ALPHABET    [a-zA-Z]

%%

{NUMBER}+   { strcpy(yylval.str, yytext); return ID; }
{ALPHABET}  { strcpy(yylval.str, yytext); return ID; }
\n;

%%

这是我的 yacc.y 文件:

%{
    #include <stdio.h>
    #include <string.h>


    char result_gen();
    char quadruple_entry(char a[], char b, char c[]);
    void three_address_code();

    int q_index = 0;
    char result[3] = {'t','0','\0'};
    char temp[3];
    char temp2[3];

    struct QuadrupleStructure {
        char arg1[10];
        char op;
        char arg2[10];
        char rslt[3];
    }quadruple[25];

    
 
%}

%union {
    char str[10];
    char symbol;
}

%token <str> ID
%type  <str>    expr 

%left '+' '-'
%left '/' '*'


%%


stmt    :   ID '=' expr  { quadruple_entry($1, '=', $3); }
    ;
expr    :   expr '+' expr { quadruple_entry($1, '+', $3); strcpy($$,temp); printf("add"); }

    |   expr '-' expr { quadruple_entry($1, '-', $3); strcpy($$,temp); printf("sub"); }

    |   expr '/' expr { quadruple_entry($1, '/', $3); strcpy($$,temp); printf("mul");}

    |   expr '*' expr { quadruple_entry($1, '*', $3); strcpy($$,temp); printf("div");}

    |   '(' expr ')'  { strcpy($$,$2); }

    |   ID        { strcpy($$,$1); }

%%


char result_gen() {
    strcpy(temp,result);
    result[1]++;
}

char quadruple_entry(char a[], char b, char c[]) {
    result_gen();

    strcpy(quadruple[q_index].arg1, a);
    quadruple[q_index].op = b;
    strcpy(quadruple[q_index].arg2, c);
    strcpy(quadruple[q_index].rslt, temp);

    q_index++;
}

void three_address_code() {
    int i;
    for(i=0 ; i<q_index ; i++) 
    printf("\n%s := %s %c %s", quadruple[i].rslt, quadruple[i].arg1, quadruple[i].op, quadruple[i].arg2);
}

void yyerror(char *s) {
    printf("Error %s, s");
}

int yywrap() {
    return 1;
}

int main() {
    yyparse();
    three_address_code();
    return 0;
} 

我输入的输入:

a=(b+c)-10

输出:

=(

尽管预期的输出类似于中间代码。

我对 YACC 的概念不是很强,所以在此之前为愚蠢的错误道歉。如果有人可以帮助我弄清楚我做错了什么,那将非常有帮助

标签: cgrammarbisonyacclex

解决方案


推荐阅读