c - 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 的概念不是很强,所以在此之前为愚蠢的错误道歉。如果有人可以帮助我弄清楚我做错了什么,那将非常有帮助
解决方案
推荐阅读
- android - Firebase 的 Crashlytics 迁移破坏了 Fabric 的 Twitter 功能
- keras - SVM Scikit-learn - 数据增强可能吗?
- node.js - 为什么使用 react.js 中的 axios 发送多部分表单数据时 req.body 未定义?
- java - 为什么@Transactional 不回滚在此集成测试中保存实体?
- java - 空指针异常和 getMapAsync 错误
- oop - 在 Kotlin 中传递方法与传递接口
- java - 出现错误 java.lang.NullPointerException:尝试在空对象引用上调用接口方法“int java.util.List.size()”
- docker - 我的 EC2 实例上的 var/run/docker.sock 权限问题
- python - 如何获取用户输入列表,通过随机计数器运行它,然后输出结果
- javascript - 如何连接netmiko和django应用程序