我正在做我的家庭作业,我在野牛文件中有一些错误。我得到的错误就像'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没有声明的类型
答案 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());
})
});
。