在野牛中获取错误没有声明类型

时间:2016-03-24 11:17:15

标签: c header bison flex-lexer

我正在做我的家庭作业,我在野牛文件中有一些错误。我得到的错误就像'blabla'没有声明的类型。我的代码和错误如下。我正在尝试做类型检查,我有一个标题,flex和一个野牛文件。 Flex返回我需要的令牌。我写了一个函数来创建一个属性,然后我检查两个属性类型是否相同。如果不一样,我会给出一个错误输出,但是当我编译它时我得到了这些错误。我没弄清楚。我做错了什么?

在野牛档案中:

   AttrNode * makeATTR(char * v, AttrType t);

%union
{
    ValType val; 
    char *text;
    AttrNode *attrPtr;
}
%token <text> tOPEN tCLOSE tSELF tLEND tCOURSE tCLASS ....continue
        day_type:       tMON { $$ = makeATTR ($1,DAY);}
                        | tTUE  { $$ = makeATTR ($1,DAY);}
                        | tWED  { $$ = makeATTR ($1,DAY);}
                        | tTHU  { $$ = makeATTR ($1,DAY);}
                        | tFRI  { $$ = makeATTR ($1,DAY);}
                        ;
        attr_val:       tSTRING {$$= makeATTR($1,STRING);}
                        | tNUM  {$$= makeATTR($2,NUMBER);}
                        | tTIME {$$ = makeATTR($3,TIME);}
                        | day_type { $$ = makeATTR ($1,DAY);}
                        ;
        attr_name:      tNAME {$$= makeATTR($1,STRING);}
                        | tCODE {$$= makeATTR($1,STRING);}
                        | tTYPE {$$= makeATTR($1,STRING);}
                        | tCRN {$$= makeATTR($2,NUMBER);}
                        | tSECTION {$$= makeATTR($1,STRING);}
                        | tCAPACITY {$$= makeATTR($2,NUMBER);}
                        | tSTART {$$ = makeATTR($3,TIME);}
                        | tEND {$$ = makeATTR($3,TIME);}
                        | tDAY { $$ = makeATTR ($1,DAY);}
                        ;
        attribute:      attr_name attr_val  {if($1.type!=$2.type)
                                                printf("Mismatch error");}
    ....

 AttrNode * makeATTR(char * v, AttrType t)
 {
     AttrNode * ret = (AttrNode*) malloc(sizeof(AttrNode));
     result->thisNodeType = Attr;
     result->attrNodePtr = (AttrNode*)malloc(sizeof(AttrNode));
     result->attrNodePtr->AttrNode.value=v;
     result->attrNodePtr->AttrNode.type=t;
    return (result);
 }

在.h文件中

typedef enum {Attr,Tree } NodeType;
typedef enum {STRING,NUMBER,TIME,DAY} AttrType;
//For String
typedef struct AttrNode
{
    char * value; 
    AttrType * type;
}AttrNode;

 typedef struct TreeNode
 {
 NodeType thisNodeType; 
 AttrNode *attrNodePtr; 
 }TreeNode;

AttrNode * makeATTR(char * v, AttrType t);

错误

  

hw4.y:25.24-25:'day_type'的$$没有声明的类型
  hw4.y:26.27-28:'day_type'的$$没有声明的类型
  hw4.y:27.27-28:'day_type'的$$没有声明的类型
  hw4.y:28.27-28:'day_type'的$$没有声明的类型
  hw4.y:29.27-28:'day_type'的$$没有声明的类型
  hw4.y:31.26-27:`attr_val'的$$没有声明的类型
  hw4.y:32.26-27:`attr_val'的$$没有声明的类型
  hw4.y:32.39-40:整数超出范围:`$ 2'
  hw4.y:33.26-27:`attr_val'的$$没有声明的类型
  hw4.y:33.40-41:整数超出范围:`$ 3'
  hw4.y:34.30-31:`attr_val'的$$没有声明的类型
  hw4.y:34.45-46:`attr_val'的$ 1没有声明的类型
  hw4.y:36.24-25:`attr_name'的$$没有声明的类型
  hw4.y:37.26-27:`attr_name'的$$没有声明的类型
  hw4.y:38.32-33:`attr_name'的$$没有声明的类型
  hw4.y:39.26-27:`attr_name'的$$没有声明的类型
  hw4.y:40.25-26:`attr_name'的$$没有声明的类型
  hw4.y:40.38-39:整数超出范围:`$ 2'
  hw4.y:41.29-30:`attr_name'的$$没有声明的类型
  hw4.y:42.30-31:`attr_name'的$$没有声明的类型
  hw4.y:42.43-44:整数超出范围:`$ 2'
  hw4.y:43.27-28:`attr_name'的$$没有声明的类型
  hw4.y:43.41-42:整数超出范围:`$ 3'
  hw4.y:44.25-26:`attr_name'的$$没有声明的类型
  hw4.y:44.39-40:整数超出范围:`$ 3'
  hw4.y:45.26-27:`attr_name'的$$没有声明的类型
  hw4.y:47.41-42:`attribute'的$ 1没有声明的类型
  hw4.y:47.50-51:`attribute'的$ 2没有声明的类型

1 个答案:

答案 0 :(得分:2)

如果你告诉bison / yacc有多个语义类型(带有$n声明),那么你只能使用$$$$作为终端和非终端声明类型。在这种情况下,bison告诉您正在尝试为没有声明类型的非终端设置%type <something> day_type attr_val ... 。这是不可能的,因为在不知道要分配给哪个工会成员的情况下,bison无法生成适当的赋值语句。

所以你需要声明非终端的类型:

$n

此外,您有attr_val: ... | tNUM {$$= makeATTR($2,NUMBER);} 个超出范围的引用。例如,在制作中:

tNUM

右侧只包含一个符号($2),因此没有$1。因此错误消息(&#34;整数超出范围:`$ 2&#39;&#34;)。我认为你的意思是var RIGHT = 1; var LEFT = 0; function moveObj(containerwidth, containerLeft, objectwidth, displacement, bookDirection, howManyTimes) { if (howManyTimes <= 0) { return; // ends } var currentposition = $("#book").position().left; var lDisplacement = displacement; switch (bookDirection) { case RIGHT: if ((currentposition + objectwidth) < (containerwidth + containerLeft)) { if (Math.abs(containerwidth + containerLeft - currentposition - objectwidth) <= displacement) { lDisplacement = Math.abs(containerwidth + containerLeft - currentposition - objectwidth); bookDirection = LEFT; howManyTimes--; // on change direction decrease.. } $("#book").animate({ left: "+=" + lDisplacement }, 1000, function () { moveObj(containerwidth, containerLeft, objectwidth, displacement, bookDirection, howManyTimes); }); } else { bookDirection = LEFT; moveObj(containerwidth, containerLeft, objectwidth, displacement, bookDirection, howManyTimes); } break; case LEFT: if (currentposition > containerLeft) { if (currentposition < displacement) { lDisplacement = currentposition - containerLeft; bookDirection = RIGHT; howManyTimes--; // on change direction decrease.. } $("#book").animate({ left: "-=" + lDisplacement }, 1000, function () { moveObj(containerwidth, containerLeft, objectwidth, displacement, bookDirection, howManyTimes); }); } else { bookDirection = RIGHT; howManyTimes--; moveObj(containerwidth, containerLeft, objectwidth, displacement, bookDirection, howManyTimes); } break; } } $(function () { $('#clickme').on('click', function (e) { moveObj($("#container").width(), $("#container").offset().left, $("#book").width(), 150, RIGHT, $('#hmTimes').val()); }) });