在bison的堆栈变量中赋值

时间:2018-06-12 16:57:05

标签: c++ string char

如果这个问题听起来很愚蠢我事先道歉。 我如何连接输入说,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

1 个答案:

答案 0 :(得分:0)

所以我的朋友终于调试了它。实际上有很多愚蠢的错误。

  1. 在flex文件中,我将yylval.sym的值设置为SymbolInfo * arr

    {id}    {
    
    SymbolInfo *arr = new SymbolInfo();
    arr->setName(string(strdup(yytext)));
    yylval.sym = arr;   
    
    return ID;
    
    }
    
  2. 在野牛档案中,我做了

        program : variable ADDOP variable {
        printf("program : variable ADDOP variable\n");
    
        string str = $1 ->getName() + $2 -> getName() + $3 ->getName();
        $$ ->setName(str);
        cout<<$$ -> getName()<<endl;
    
    }
    
  3. 设置启动非终结类型时出错。应该是%type< sym >start