Bison 需要帮助确定“的原因”;键入“默认操作时碰撞”;

Bison 需要帮助确定“的原因”;键入“默认操作时碰撞”;,bison,flex-lexer,Bison,Flex Lexer,我一直在做一个学校作业,很难找出是哪个问题导致了下面的“默认操作类型冲突”的多个警告。任何帮助都将不胜感激 收到的警告: parser.y:62.9-23: warning: type clash on default action: <value> != <> parser.y:71.9-16: warning: type clash on default action: <value> != <> parser.y:82.5-23: warni

我一直在做一个学校作业,很难找出是哪个问题导致了下面的“默认操作类型冲突”的多个警告。任何帮助都将不胜感激

收到的警告:

parser.y:62.9-23: warning: type clash on default action: <value> != <> parser.y:71.9-16: warning: type clash on default action: <value> != <> parser.y:82.5-23: warning: type clash on default action: <value> != <iden> parser.y:83.5-27: warning: type clash on default action: <value> != <iden> parser.y:104.5-55: warning: type clash on default action: <value> != <> parser.y:105.5-60: warning: type clash on default action: <value> != <> parser.y:108.5-37: warning: type clash on default action: <value> != <> parser.y:122.49-53: warning: type clash on default action: <oper> != <> parser.y:122.57-60: warning: type clash on default action: <oper> != <> parser.y:127.5-14: warning: type clash on default action: <value> != <iden> parser.y:157.9-35: warning: type clash on default action: <value> != <iden> parser.y:160.9-20: warning: type clash on default action: <value> != <> parser.y:161.9-21: warning: type clash on default action: <value> != <oper> parser.y:62.9-23:警告:在默认操作中键入clash:!= parser.y:71.9-16:警告:在默认操作中键入clash:!= parser.y:82.5-23:警告:在默认操作中键入clash:!= parser.y:83.5-27:警告:在默认操作中键入clash:!= parser.y:104.5-55:警告:在默认操作中键入clash:!= parser.y:105.5-60:警告:在默认操作中键入clash:!= parser.y:108.5-37:警告:在默认操作中键入clash:!= parser.y:122.49-53:警告:在默认操作中键入clash:!= parser.y:122.57-60:警告:在默认操作中键入clash:!= parser.y:127.5-14:警告:在默认操作中键入clash:!= parser.y:157.9-35:警告:在默认操作中键入clash:!= parser.y:160.9-20:警告:在默认操作中键入clash:!= parser.y:161.9-21:警告:在默认操作中键入clash:!= 语法分析器

%{

#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

#include "values.h"
#include "listing.h"
#include "symbols.h"

int yylex();
void yyerror(const char* message);

Symbols<int> symbols;

int result;

%}

%error-verbose

%union
{
    CharPtr iden;
    Operators oper;
    int value;
}

%token <value> INT_LITERAL REAL_LITERAL INTEGER REAL 
%token <iden> IDENTIFIER
%token ARROW 
%token ANDOP OROP 

%token <oper> NOTOP EXPOP MULOP REMOP ADDOP RELOP

%token BOOL_LITERAL BOOLEAN 
%token IF THEN ELSE ENDIF CASE OTHERS ENDCASE WHEN 
%token BEGIN_ END ENDREDUCE FUNCTION  IS REDUCE RETURNS

%type <value>  function_header_ body  variable_ parameter cases case statements statement_ statement reductions exponent expression logical relation term
    factor power primary

%type <oper> operator

%%


function:   
    function_header_ variables body {result = $3;} ;


function_header:    
    FUNCTION IDENTIFIER parameters RETURNS type ';' ;

function_header_:
    function_header |
    error ';' {$$ = 0;} ;


statement_:
    statement ';' |
    error ';' {$$ = 0;} ;

variable_:
    variable |
    error ';' {$$ = 0;} ;

variable:
    IDENTIFIER ':' type IS statement_ {symbols.insert($1, $5);} ;

variables:
    variables variable_ |
    ;

parameter: 
    IDENTIFIER ':' type |
    IDENTIFIER ':' type ',' ;

parameters:
    parameters parameter |
    ;

type:
    INTEGER | REAL |
    BOOLEAN ;

body:
    BEGIN_ statement_ END ';' {$$ = $2;} ;

statements:
    statements statement_ |
    statement_ ;


statement:
    expression |
    REDUCE operator reductions ENDREDUCE {$$ = $3;} |
    IF expression THEN statements ELSE statements ENDIF  | 
    CASE expression IS cases OTHERS ARROW statement_ ENDCASE ; 

case:
    WHEN INT_LITERAL ARROW statement_;

cases:
    cases case |
    case 
    ;


reductions:
    reductions statement_ {$$ = evaluateReduction($<oper>0, $1, $2);} |
    {$$ = $<oper>0 == ADD ? 0 : 1;} ;

operator:
    NOTOP | MULOP | REMOP | ADDOP | RELOP | ANDOP | OROP ; 

exponent:
    INT_LITERAL |
    REAL_LITERAL |
    IDENTIFIER ;

expression:
    expression OROP logical {$$ = $1 || $3;} |
    logical ;

logical:
    logical ANDOP relation {$$ = $1 && $3;} |
    relation ;

relation:
    relation RELOP term {$$ = evaluateRelational($1, $2, $3);} |
    term ;

term:
    term ADDOP factor {$$ = evaluateArithmetic($1, $2, $3);} |
    factor ;

factor:
    factor MULOP power {$$ = evaluateArithmetic($1, $2, $3);} |
    factor REMOP power {$$ = evaluateArithmetic($1, $2, $3);} |
    power ;

/* right-associative */
power:
  primary EXPOP exponent {$$ = evaluateArithmetic($1, $2, $3);} 
  ;

primary:
    IDENTIFIER {if (!symbols.find($1, $$)) appendError(UNDECLARED, $1);} |
    IDENTIFIER '('expression')' |
    INT_LITERAL |
    REAL_LITERAL |
    BOOL_LITERAL |
    NOTOP primary |
    '(' expression ')' {$$ = $2;}
    ;
%%

void yyerror(const char* message)
{
    appendError(SYNTAX, message);
}

int main(int argc, char *argv[])    
{
    firstLine();
    yyparse();
    if (lastLine() == 0)
        cout << "Result = " << result << endl;
    return 0;
} 
%{
#包括
#包括
#包括
#包括
使用名称空间std;
#包括“values.h”
#包括“listing.h”
#包括“符号.h”
int-yylex();
无效错误(常量字符*消息);
符号;
int结果;
%}
%错误详细
%联合
{
CharPtr iden;
操作人员;
int值;
}
%标记整数\文字实数\文字整数实数
%令牌标识符
%记号箭
%代币
%令牌NOTOP EXOP MULOP REMOP ADDOP RELOP
%标记布尔布尔值
%标记IF THEN ELSE ENDIF CASE OTHERS ENDCASE WHEN
%令牌开始\结束结束减少函数为减少返回
%类型函数\头\体变量\参数用例用例语句\语句缩减指数表达式逻辑关系项
一次功率因数
%类型运算符
%%
功能:
函数头变量体{result=$3;};
功能单元标题:
函数标识符参数返回类型“;”;
函数\u头\u:
函数头|
错误“;”{$$ = 0;} ;
声明:
语句“;”|
错误“;”{$$ = 0;} ;
可变参数:
变数|
错误“;”{$$ = 0;} ;
变量:
标识符“:”类型是语句{symbols.insert($1,$5);};
变量:
变量|
;
参数:
标识符“:”类型|
标识符':'类型',';
参数:
参数|
;
类型:
整数|实|
布尔型;
正文:
开始语句结束语句{$$ = $2;} ;
声明:
声明|
声明;;
声明:
表情|
REDUCE运算符缩减ENDREDUCE{$$=$3;}|
IF表达式THEN语句ELSE语句ENDIF|
CASE表达式为cases-OTHERS-ARROW语句uucase;
案例:
当INT_文字箭头语句u;
案例:
案例|
案例
;
减少:
减少报表{$$=evaluateReduction($0,$1,$2);}|
{$$=$0==ADD?0:1;};
接线员:
不可移动| MULOP | REMOP | ADDOP | RELOP |和op | OROP ;;
指数:
整数文字|
实数|
标识符;
表达方式:
表达式OROP逻辑{$$=$1 | |$3;}|
逻辑的;
逻辑:
逻辑ANDOP关系{$$=$1&&$3;}|
关系
关系:
关系重新计算项{$$=evaluateRelational($1,$2,$3);}|
学期
术语:
术语添加因子{$$=evaluateArtihmetic($1,$2,$3);}|
因素
因素:
因子MULOP power{$$=评估算术($1,$2,$3);}|
移除功率因数{$$=EvaluateArthmetic($1,$2,$3);}|
权力
/*右联想*/
权力:
主指数{$$=EvaluateArthmetic($1,$2,$3);}
;
主要:
标识符{if(!symbols.find($1,$$))appendError(未声明,$1);}|
标识符“('expression')”|
整数文字|
实数|
布尔卢文字|
诺托普小学|
“(“表达式”)”{$$=$2;}
;
%%
无效错误(常量字符*消息)
{
追加错误(语法、消息);
}
int main(int argc,char*argv[])
{
第一行();
yyparse();
如果(lastLine()==0)

cout这些是来自没有显式操作的规则的默认操作的类型不匹配。第一个来自规则

function_header_: function_header
在第62行。由于这里没有操作,它获取操作
{$$=$1;}
,但是
$
有类型
(从
%type function\u header\u
声明),而
$1
没有类型(因此
,因为
function\u header
没有
%type
声明)

function_header_: function_header