如果这个问题听起来很愚蠢我事先道歉。
我如何连接输入说,a+b
并将其分配给$$变量。
基本上我想做$$ = $ 1 + $ 2 + $ 3。
我尝试了很多方法但没有任何作用。
demo.y文件
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "SymbolTable.h"
#include "SymbolInfo.h"
#include "ScopeTable.h"
//#define yydebug 1
int yyparse(void);
int yylex(void);
extern char * yytext;
extern FILE * yyin;
extern int tableSize;
SymbolTable *table;
void yyerror (const char *s)
{
fprintf(stderr,"%s\n",s);
return;
}
%}
%debug
%verbose
%error-verbose
%union tag {
SymbolInfo *sym;
char *s;
}
%token <sym> ID ADDOP
%type <s> start
%type <sym> program variable
%%
start : program {
printf("start : program\n");
printf("%s\n",$$);
}
program : variable ADDOP variable {
printf("program : variable ADDOP variable\n");
string str = " ";
string str1 = $1 -> getName().c_str();
int len = str.length();
for(int itr = 0; itr < str1.length(); itr++)
{
str[len++] = str1[itr];
}
str1 = $2 -> getName().c_str();
for(int itr = 0; itr < str1.length(); itr++)
{
str[len++] = str1[itr];
}
str1 = $3 -> getName().c_str();
for(int itr = 0; itr < str1.length(); itr++)
{
str[len++] = str1[itr];
}
$$ -> setName(str);
printf("%s\n",$$ );
}
variable : ID {
}
%%
int main(int argc, char *argv[])
{
table = new SymbolTable();
FILE *fp;
if((fp = fopen(argv[1],"r")) == NULL)
{
printf("cannot open file");
exit(1);
}
yyin = fp;
yyparse();
return 0;
}
为什么分配$$ -> setName(str)
错误?
$$是SymbolInfo *类型,正如我声明的那样,setName(string s)
是该类的函数。
SymbolInfo.h
#ifndef SYMBOLINFO_H
#define SYMBOLINFO_H
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;
extern int tableSize;
extern FILE *logout;
class SymbolInfo
{
string Name;
string Type;
SymbolInfo *next;
public:
SymbolInfo();
void setName(string name);
void setType(string type);
string getName();
string getType();
SymbolInfo* getNext();
void setNext(SymbolInfo *ob);
};
#endif // SYMBOLINFO_H
SymbolInfo构造函数
SymbolInfo::SymbolInfo()
{
Name = NULL;
Type = NULL;
next = NULL;
cout<<"in constructor of SymbolInfo\n"<<endl;
}
原始错误消息
program : variable ADDOP variable
./script.sh: line 11: 8172 Segmentation fault (core dumped) ./demo.out input.txt
调用$$.sym ->setName(str)
时的错误消息。
demo.y: In function ‘int yyparse()’:
demo.y:68:16: error: request for member ‘sym’ in ‘yyval.tag::sym’, which is of pointer type ‘SymbolInfo*’ (maybe you meant to use ‘->’ ?)
$$.sym-> setName(str);
program : variable ADDOP variable
./script.sh: line 11: 8049 Segmentation fault (core dumped) ./demo.out input.txt
答案 0 :(得分:0)
所以我的朋友终于调试了它。实际上有很多愚蠢的错误。
在flex文件中,我将yylval.sym
的值设置为SymbolInfo * arr
{id} {
SymbolInfo *arr = new SymbolInfo();
arr->setName(string(strdup(yytext)));
yylval.sym = arr;
return ID;
}
在野牛档案中,我做了
program : variable ADDOP variable {
printf("program : variable ADDOP variable\n");
string str = $1 ->getName() + $2 -> getName() + $3 ->getName();
$$ ->setName(str);
cout<<$$ -> getName()<<endl;
}
设置启动非终结类型时出错。应该是%type< sym >start