Bison - 语法中无用的非终结符
Bison - nonterminals useless in grammar
0
我正在做家庭作业,我在 bison 文件中有一些错误。我收到类似 'blabla' 没有声明类型的错误。我的代码和错误如下。我正在尝试做一个类型检查器,我有一个 header、flex 和一个 bison 文件。 Flex 返回我需要的令牌。我写了一个函数来制作一个属性,然后我检查两个属性类型是否相同。如果不一样,我会给出一个错误输出,但是当我编译它时,我得到了这些错误。我没有弄清楚。我做错了什么?
在野牛文件中:
%{
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 ';' {$$ = ;}
| relational_expression ';' {$$ = ;};
relational_expression: expression ESITTIR expression ';' { $$ = == ;}
|expression KUCUKTUR expression ';' { $$ = < ;}
|expression KUCUKESIT expression ';' { $$ = <= ;}
|expression BUYUKTUR expression ';' { $$ = > ;}
|expression BUYUKESIT expression ';' { $$ = => ;}
|expression ANCAKVEANCAK expression ';' { $$ = <=> ;}
|expression DEMEK expression ';' { $$ = => ;}
|expression VE expression ';' { $$ = && ;}
|expression VEYA expression ';' { $$ = || ;}
|expression DEGIL expression ';' { $$ = != ;};
assignment_expression: conditional_expression ';' {$$ = ;}
|assignment ';' {$$ = ;};
assignment: left_hand_side ESITTIR assignment_expression ';'{$$ = = };
%%
/* 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;
}
我从 yacc 收到关于语法中无用规则的警告:
corona.y: uyarı: 4 nonterminals useless in grammar [-Wother]
corona.y: uyarı: 15 rules useless in grammar [-Wother]
corona.y:57.107-116: uyarı: nonterminal useless in grammar: expression [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^
corona.y:57.36-56: uyarı: nonterminal useless in grammar: relational_expression [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^^^^^^^^^^^^
corona.y:57.14-34: uyarı: nonterminal useless in grammar: assignment_expression [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^^^^^^^^^^^^
corona.y:57.58-67: uyarı: nonterminal useless in grammar: assignment [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^
corona.y:66.13-48: uyarı: rule useless in grammar [-Wother]
expression: assignment_expression ';' {$$ = ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:67.13-48: uyarı: rule useless in grammar [-Wother]
| relational_expression ';' {$$ = ;};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:69.24-81: uyarı: rule useless in grammar [-Wother]
relational_expression: expression ESITTIR expression ';' { $$ = == ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:70.24-80: uyarı: rule useless in grammar [-Wother]
|expression KUCUKTUR expression ';' { $$ = < ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:71.24-81: uyarı: rule useless in grammar [-Wother]
|expression KUCUKESIT expression ';' { $$ = <= ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:72.24-80: uyarı: rule useless in grammar [-Wother]
|expression BUYUKTUR expression ';' { $$ = > ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:73.24-81: uyarı: rule useless in grammar [-Wother]
|expression BUYUKESIT expression ';' { $$ = => ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:74.24-82: uyarı: rule useless in grammar [-Wother]
|expression ANCAKVEANCAK expression ';' { $$ = <=> ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:75.24-81: uyarı: rule useless in grammar [-Wother]
|expression DEMEK expression ';' { $$ = => ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:76.24-81: uyarı: rule useless in grammar [-Wother]
|expression VE expression ';' { $$ = && ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:77.24-81: uyarı: rule useless in grammar [-Wother]
|expression VEYA expression ';' { $$ = || ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:78.24-81: uyarı: rule useless in grammar [-Wother]
|expression DEGIL expression ';' { $$ = != ;};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:80.24-60: uyarı: rule useless in grammar [-Wother]
assignment_expression: conditional_expression ';' {$$ = ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:81.24-60: uyarı: rule useless in grammar [-Wother]
|assignment ';' {$$ = ;};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:84.13-75: uyarı: rule useless in grammar [-Wother]
assignment: left_hand_side ESITTIR assignment_expression ';'{$$ = = };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Yacc/bison(实际上,大多数解析器生成器)假设文件中第一个生成的目标是解析器应该匹配的非终端。但是你的第一个非终结符是
type : YAZIDIZISI |
SAYI
其中 bison/yacc 表示输入可以是标记 YAZIDIZISI
或标记 SAYI
,除此之外别无其他。这意味着 none 你的其他非终端是有用的,所以 bison 会警告你。
如果您不想bison/yacc猜测从哪里开始,您可以明确指定开始规则:
%start expression
否则,您可以移动规则,使顶级规则排在第一位。
0
我正在做家庭作业,我在 bison 文件中有一些错误。我收到类似 'blabla' 没有声明类型的错误。我的代码和错误如下。我正在尝试做一个类型检查器,我有一个 header、flex 和一个 bison 文件。 Flex 返回我需要的令牌。我写了一个函数来制作一个属性,然后我检查两个属性类型是否相同。如果不一样,我会给出一个错误输出,但是当我编译它时,我得到了这些错误。我没有弄清楚。我做错了什么?
在野牛文件中:
%{
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 ';' {$$ = ;}
| relational_expression ';' {$$ = ;};
relational_expression: expression ESITTIR expression ';' { $$ = == ;}
|expression KUCUKTUR expression ';' { $$ = < ;}
|expression KUCUKESIT expression ';' { $$ = <= ;}
|expression BUYUKTUR expression ';' { $$ = > ;}
|expression BUYUKESIT expression ';' { $$ = => ;}
|expression ANCAKVEANCAK expression ';' { $$ = <=> ;}
|expression DEMEK expression ';' { $$ = => ;}
|expression VE expression ';' { $$ = && ;}
|expression VEYA expression ';' { $$ = || ;}
|expression DEGIL expression ';' { $$ = != ;};
assignment_expression: conditional_expression ';' {$$ = ;}
|assignment ';' {$$ = ;};
assignment: left_hand_side ESITTIR assignment_expression ';'{$$ = = };
%%
/* 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;
}
我从 yacc 收到关于语法中无用规则的警告:
corona.y: uyarı: 4 nonterminals useless in grammar [-Wother]
corona.y: uyarı: 15 rules useless in grammar [-Wother]
corona.y:57.107-116: uyarı: nonterminal useless in grammar: expression [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^
corona.y:57.36-56: uyarı: nonterminal useless in grammar: relational_expression [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^^^^^^^^^^^^
corona.y:57.14-34: uyarı: nonterminal useless in grammar: assignment_expression [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^^^^^^^^^^^^
corona.y:57.58-67: uyarı: nonterminal useless in grammar: assignment [-Wother]
%type <num> assignment_expression relational_expression assignment conditional_expression left_hand_side expression
^^^^^^^^^^
corona.y:66.13-48: uyarı: rule useless in grammar [-Wother]
expression: assignment_expression ';' {$$ = ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:67.13-48: uyarı: rule useless in grammar [-Wother]
| relational_expression ';' {$$ = ;};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:69.24-81: uyarı: rule useless in grammar [-Wother]
relational_expression: expression ESITTIR expression ';' { $$ = == ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:70.24-80: uyarı: rule useless in grammar [-Wother]
|expression KUCUKTUR expression ';' { $$ = < ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:71.24-81: uyarı: rule useless in grammar [-Wother]
|expression KUCUKESIT expression ';' { $$ = <= ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:72.24-80: uyarı: rule useless in grammar [-Wother]
|expression BUYUKTUR expression ';' { $$ = > ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:73.24-81: uyarı: rule useless in grammar [-Wother]
|expression BUYUKESIT expression ';' { $$ = => ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:74.24-82: uyarı: rule useless in grammar [-Wother]
|expression ANCAKVEANCAK expression ';' { $$ = <=> ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:75.24-81: uyarı: rule useless in grammar [-Wother]
|expression DEMEK expression ';' { $$ = => ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:76.24-81: uyarı: rule useless in grammar [-Wother]
|expression VE expression ';' { $$ = && ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:77.24-81: uyarı: rule useless in grammar [-Wother]
|expression VEYA expression ';' { $$ = || ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:78.24-81: uyarı: rule useless in grammar [-Wother]
|expression DEGIL expression ';' { $$ = != ;};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:80.24-60: uyarı: rule useless in grammar [-Wother]
assignment_expression: conditional_expression ';' {$$ = ;}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:81.24-60: uyarı: rule useless in grammar [-Wother]
|assignment ';' {$$ = ;};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
corona.y:84.13-75: uyarı: rule useless in grammar [-Wother]
assignment: left_hand_side ESITTIR assignment_expression ';'{$$ = = };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Yacc/bison(实际上,大多数解析器生成器)假设文件中第一个生成的目标是解析器应该匹配的非终端。但是你的第一个非终结符是
type : YAZIDIZISI |
SAYI
其中 bison/yacc 表示输入可以是标记 YAZIDIZISI
或标记 SAYI
,除此之外别无其他。这意味着 none 你的其他非终端是有用的,所以 bison 会警告你。
如果您不想bison/yacc猜测从哪里开始,您可以明确指定开始规则:
%start expression
否则,您可以移动规则,使顶级规则排在第一位。