Bison中的致命错误:启动符号can';不要派生任何句子

Bison中的致命错误:启动符号can';不要派生任何句子,bison,semantic-analysis,Bison,Semantic Analysis,J'ai ce信息-关于野牛的信息-d项目: 致命错误:开始符号S没有从您的输入中派生出任何句子bison-d: %token ENTIER REEL VECTOR INTEGER FLOAT CONST READ DISPLAY IF ELSE FOR END AND OR NOT G L GE LE EQ DI ACOUV AT %token ACFER AFFEC PLUS MOIN MUL DIV CROOUV CROFER PAROUV PARFER SEP VERG PVERG

J'ai ce信息-关于野牛的信息-d项目:


致命错误:开始符号S没有从您的输入中派生出任何句子

bison-d

 %token ENTIER REEL VECTOR INTEGER FLOAT CONST READ DISPLAY IF ELSE FOR END AND OR NOT G L GE LE EQ DI ACOUV AT
 %token ACFER AFFEC PLUS MOIN MUL DIV CROOUV CROFER PAROUV PARFER SEP VERG PVERG DEUXPT ESPACE ID CAR CHCAR STRING

 %start S 
 %%
S: ID ACOUV DEC CODE ACFER;    
这准确地告诉了您问题所在--您使用的是
code
DEC
,而不是定义它们。将它们添加到一个
%token
行中,它就可以正常工作了

编辑

“开始符号S不派生任何句子”错误告诉您语法中有无限递归,因此没有(有限)输入可以匹配开始符号。在您的情况下,
S
必须包含一个
code
,其中必须包含一个
命令(直接或通过
listcommand
),该命令必须包含一个
boucle
,该boucle反过来必须包含另一个
listcommand
。因此,您最终会得到一个无限扩展的
listcommands
->
command
->
boucle
->
listcommands

问题可能在于你的规则

test.y:6.17-20: symbol CODE is used, but is not defined as a token and has no rules
test.y:6.13-15: symbol DEC is used, but is not defined as a token and has no rules
它只匹配一个命令,加上该命令的一个无用(且不明确)的无边界noop扩展。你可能想要

listcommands: command | listcommands ;
它按顺序匹配0个或多个
命令
s。进行此更改可以修复致命错误,但仍然会留下一系列移位减少冲突,以及无用的规则
dectype:dectype

要跟踪和修复移位/减少冲突,请使用
bison-v
生成一个
.output
文件,详细列出语法、状态和冲突。您的大多数代码都是由于没有
not
的优先级,而另外两个代码则是由于不明确的
dectype
code
规则造成的。

这是我的代码:

listcommands: /*epsilon*/ | listcommands command ;
%{#包括
外部文件*yyin;
外部标签;
%}
%联合
{char*名称;
int-num;
炭车;
}
%token ENTIER Reveel VECTOR INTEGER FLOAT CONST CHAR READ DISPLAY IF ELSE FOR END AND OR NOT G L GE LE EQ DI ACOUV AT
%令牌ACFER AFFEC和MOIN MUL DIV CROUV CROF PAROF SEP VERG PVERG DEUXPT ESPACE ID CAR CHCAR字符串
%左或右
%左和
%左G GE EQ DI LE L
%左加门
%左多功能分区
%开始
%%
S:ID ACOUV DEC代码ACFER{printf(“链更正!”);YYACCEPT;};
DEC:ACOV DEC型ACFER;
dectype:dectype | type DEUXPT listidf PVERG | VECTOR DEUXPT type DEUXPT ID crouv ENTIER VERG ENTIER CROFER PVERG;
listidf:ID SEP listidf | ID;
类型:整数字符串字符浮点常量;
代码:ACOUV命令ACFER | ACOUV列表命令ACFER;
listcommands:command | listcommands;
命令:附加演讲矫揉造作的条件束;
附件:显示Parochcar DEUXPT ID PARFER PVERG;
讲座:在ID PARFER PVERG阅读Parochcar DEUXPT;
矫揉造作:ID-AFFEC表达PVERG;
表达式:expression1 | expressioncond | ID | CONST | PAROUV表达式参数;
表达式二:表达式G表达式|表达式L表达式|表达式GE表达式|表达式EQ表达式|表达式LE表达式|表达式DI表达式|非表达式|表达式或表达式|表达式和表达式;
表达式1:表达式MOIN表达式|表达式加表达式|表达式DIV表达式|表达式MUL表达式;
条件:IF paruv expressioncond PARFER listcommands ELSE listcommands END | IF paruv expressioncond PARFER listcommands END | IF paruv expressioncond PARFER条件END;
boucle:对于PAROUV ID DEUXPT ENTIER conditiondarret PARFER ListCommand END;
conditiondarret:ID;
%%
int yyerror(字符*msg)
{printf(“%s”,msg);
返回1;}
int main(int argc,char*argv[]){
yyin=fopen(argv[1],“r”);
yypase();
词缀();
返回0;
}    

我知道这一点,因为我没有把我所有的代码都寄给你。”CODE'和'DEC'是非终端,所以我在下面的代码中定义了它们,但这不是问题,唯一的问题是StartWell,问题是您没有共享的其他代码中的某个地方——当我将CODEDEC添加到上面的示例中时,它工作正常,没有bison或其他方面的错误。如果你不能发布你的全部代码,你至少需要发布一些重现问题的东西。请Chris Dodd查看我的代码这在下面的答案中
 %{#include<stdio.h>
extern FILE* yyin;    
extern tab;    
%}
%union
{char *name;
int num;
 char car;
 }
 %token ENTIER REEL VECTOR INTEGER FLOAT CONST CHAR READ DISPLAY IF ELSE FOR END AND OR NOT G L GE LE EQ DI ACOUV AT
 %token ACFER AFFEC PLUS MOIN MUL DIV CROOUV CROFER PAROUV PARFER SEP VERG PVERG DEUXPT ESPACE ID CAR CHCAR STRING
 %left OR 
 %left AND
 %left G GE EQ DI LE L 
 %left PLUS MOIN 
 %left MUL DIV 
 %start S
 %%
S: ID ACOUV DEC CODE ACFER {printf("Chaine correcte !");YYACCEPT;};
DEC: ACOUV dectype ACFER;
dectype: dectype | type DEUXPT listidf PVERG | VECTOR DEUXPT type DEUXPT ID CROOUV ENTIER VERG     ENTIER CROFER PVERG;
listidf: ID SEP listidf | ID;
type: INTEGER STRING CHAR FLOAT CONST ; 
CODE:ACOUV command ACFER | ACOUV listcommands ACFER;
listcommands: command | listcommands;
command: affichage lecture affectation condition boucle;
affichage: DISPLAY PAROUV CHCAR DEUXPT ID PARFER PVERG;
lecture: READ PAROUV CHCAR DEUXPT AT ID PARFER PVERG;
affectation: ID AFFEC expression PVERG;
expression: expression1 | expressioncond | ID |CONST | PAROUV expression PARFER; 
expressioncond: expression G expression | expression L expression | expression GE expression | expression EQ expression | expression LE expression | expression DI expression |NOT expression | expression OR expression | expression AND expression;
expression1: expression MOIN expression | expression PLUS expression | expression DIV expression | expression MUL expression ;
condition: IF PAROUV expressioncond PARFER listcommands ELSE listcommands END  | IF PAROUV     expressioncond PARFER listcommands END | IF PAROUV expressioncond PARFER condition END;
boucle: FOR PAROUV ID DEUXPT ENTIER conditiondarret PARFER listcommands END;
conditiondarret:ID;
 %%
 int yyerror(char* msg)
 {printf("%s",msg);
  return 1;}
 int main(int argc,char *argv[]) {
     yyin=fopen(argv[1],"r");
     yypase();
     affiche();
     return 0;
 }