Bison-语法中无用的非终结符

Bison-语法中无用的非终结符,bison,Bison,0 我正在做家庭作业,野牛档案中有一些错误。我得到了一个错误,比如“blabla”没有声明类型。下面是我的代码和错误。我正在尝试做一个类型检查,我有一个头文件,flex和一个bison文件。Flex返回我需要的代币。我编写了一个函数来生成一个属性,然后检查这两个属性类型是否相同。如果不一样,我将给出一个错误输出,但当我编译它时,我得到了这些错误。我没有弄明白。我做错了什么 在bison文件中: %{ void yyerror(char *s); int yylex(); #incl

0

我正在做家庭作业,野牛档案中有一些错误。我得到了一个错误,比如“blabla”没有声明类型。下面是我的代码和错误。我正在尝试做一个类型检查,我有一个头文件,flex和一个bison文件。Flex返回我需要的代币。我编写了一个函数来生成一个属性,然后检查这两个属性类型是否相同。如果不一样,我将给出一个错误输出,但当我编译它时,我得到了这些错误。我没有弄明白。我做错了什么

在bison文件中:

    %{
 void yyerror(char *s);
 int yylex();
 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
 int symbols[52];
 int symbolVal(char symbol);
 void updateSymbolVal(char symbol, int val);
%}

%union {int num,char id}

%token DOGRULUK
%token PARANTEZ_AC
%token PARANTEZ_KAPA
%token ISE
%token NOKTA
%token EGER
%token YADA
%token YOKSA
%token YORUM
%token YORUM_AC
%token YORUM_KAPA
%token ESITTIR
%token VEYA
%token DEGIL
%token DEMEK
%token ANCAKVEANCAK
%token VE
%token KUCUKESIT
%token KUCUKTUR
%token BUYUKESIT
%token BUYUKTUR

%token EKRANAYAZ
%token TARA
%token DONGU
%token ARTI
%token EKSI
%token BOLU
%token CARPI
%token KALAN
%token CALISTIR
%token BOLUM
%token SAYI
%token YAZIDIZISI
%token conditional_expression
%token identifier
%token left_hand_side


%right ESITTIR BUYUKTUR KUCUKTUR BUYUKESIT KUCUKESIT
%nonassoc ANCAKVEANCAK VE VEYA DEGIL DEMEK

%type <id> identifier
%type <num>  assignment_expression relational_expression assignment conditional_expression left_hand_side expression

%%

type : YAZIDIZISI |
        SAYI



expression: assignment_expression ';' {$$ = $1;}
          | relational_expression ';' {$$ = $1;};

relational_expression: expression  ESITTIR expression  ';'      { $$ = $1 == $3;}
                      |expression  KUCUKTUR expression  ';'     { $$ = $1 < $3;}
                      |expression  KUCUKESIT expression  ';'    { $$ = $1 <= $3;}
                      |expression  BUYUKTUR expression  ';'     { $$ = $1 > $3;}
                      |expression  BUYUKESIT expression ';'     { $$ = $1 => $3;}
                      |expression  ANCAKVEANCAK expression ';'  { $$ = $1 <=> $3;}
                      |expression  DEMEK expression     ';'     { $$ = $1 => $3;}
                      |expression  VE expression    ';'         { $$ = $1 && $3;}
                      |expression  VEYA expression   ';'        { $$ = $1 || $3;}
                      |expression  DEGIL expression  ';'        { $$ = $1 != $3;};

assignment_expression: conditional_expression ';' {$$ = $1;}
                      |assignment           ';'   {$$ = $1;};


assignment: left_hand_side  ESITTIR assignment_expression ';'{$$ = $1 = $3};




%%
/* C Code*/

int computeSymbolIndex(char token)
{
    int idx = -1;
    if(islower(token)) {
        idx = token - 'a' + 26;
    } else if(isupper(token)) {
        idx = token - 'A';
    }
    return idx;
} 

int symbolVal(char symbol)
{
    int bucket = computeSymbolIndex(symbol);
    return symbols[bucket];
}

void updateSymbolVal(char symbol, int val)
{
    int bucket = computeSymbolIndex(symbol);
    symbols[bucket] = val;
}

int main (void) {
    /* init symbol table */
    int i;
    for(i=0; i<52; i++) {
        symbols[i] = 0;
    }

    return yyparse ( );
}

void yyerror(char *s) {
 fprintf(stderr, "%s\n", s);
 return 0;
}
int main(void) {
 yyparse();
 return 0;
} 
%{
无效错误(字符*s);
int-yylex();
#包括
#包括
#包括
整数符号[52];
int-symbolVal(字符符号);
void updateSymbolVal(字符符号,int val);
%}
%联合{int num,char id}
%代币多格鲁克
%代币帕拉尼特斯
%帕拉尼特斯卡帕酒店
%令牌ISE
%令牌NOKTA
%代币
%代币亚达
%代币约克萨
%代币约勒姆
%代币约鲁姆
%约鲁姆卡帕代币
%令牌ESITIR
%token VEYA
%代币脱胶
%代币德梅克
%代币ANCAKVEANCAK
%象征性的
%库库克西特代币
%库库图尔令牌
%代币BUYUKESIT
%代币布尤克图尔
%代币EKRANAYAZ
%代币塔拉
%代币东古
%象征艺术
%令牌EKSI
%令牌博鲁
%代币卡皮
%令牌卡兰
%代币卡里斯蒂尔
%代币丸
%代币SAYI
%代币YAZIDIZISI
%标记条件表达式
%令牌标识符
%令牌左侧
%右图
%非assoc ANCAKVEANCAK VE VEYA DEGIL DEMEK
%类型标识符
%类型赋值\表达式关系\表达式赋值条件\表达式左侧\表达式
%%
类型:YAZIDIZISI|
萨伊
表达式:赋值_表达式“;”{$$ = $1;}
|关系表达式“;”{$$ = $1;};
关系表达式:表达式ESITIR表达式“;”{ $$ = $1 == $3;}
|表达式KUCUKTUR表达式“;”{ $$ = $1 < $3;}
|表达式KUCUKESIT表达式“;”{ $$ = $1  $3;}
|表达式BUYUKESIT表达式“;”{ $$ = $1 => $3;}
|表达式ANCAKVEANCAK表达式“;”{ $$ = $1  $3;}
|表达式“;”{ $$ = $1 => $3;}
|表达式“;”{ $$ = $1 && $3;}
|表达式VEYA表达式';'{ $$ = $1 || $3;}
|表达式DEGIL表达式';'{ $$ = $1 != $3;};
赋值_表达式:条件_表达式';'{$$ = $1;}
|赋值“;”{$$ = $1;};
赋值:左侧ESITIR赋值表达式“;”{$$ = $1 = $3};
%%
/*C代码*/
int computeSymbolIndex(字符标记)
{
intidx=-1;
如果(孤岛(令牌)){
idx=令牌-‘a’+26;
}else if(isupper(令牌)){
idx=令牌-‘A’;
}
返回idx;
} 
int symbolVal(字符符号)
{
int bucket=computeSymbolIndex(符号);
返回符号[桶];
}
void updateSymbolVal(字符符号,int val)
{
int bucket=computeSymbolIndex(符号);
符号[bucket]=val;
}
内部主(空){
/*初始化符号表*/
int i;
对于(i=0;iYacc/bison)(事实上,大多数解析器生成器)假设文件中第一个生成的目标是解析器应该匹配的非终端

type : YAZIDIZISI |
       SAYI
bison/yacc表示输入可以是token
YAZIDIZISI
或token
SAYI
,而不是其他。这意味着您的其他非终端都没有用处,因此bison警告您

如果不希望bison/yacc猜测从何处开始,可以明确指定开始规则:

%start expression
否则,您可以移动您的规则,使顶级规则排在第一位。

Yacc/bison(事实上,大多数解析器生成器)假设文件中第一个产品的目标是解析器应该匹配的非终端。但您的第一个非终端是

type : YAZIDIZISI |
       SAYI
bison/yacc表示输入可以是token
YAZIDIZISI
或token
SAYI
,而不是其他。这意味着您的其他非终端都没有用处,因此bison警告您

如果不希望bison/yacc猜测从何处开始,可以明确指定开始规则:

%start expression
否则,您可以移动您的规则,使顶级规则排在第一位