需要帮助确定“默认操作类型冲突"的原因. [英] Need help identifying cause of "type clash on default action"

查看:72
本文介绍了需要帮助确定“默认操作类型冲突"的原因.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在做学校作业,很难弄清楚是哪个问题导致默认操作类型冲突"下的多个警告.任何帮助将不胜感激.

收到的警告:

parser.y:62.9-23:警告:在默认操作上输入冲突:< value>!=<>parser.y:71.9-16:警告:默认操作上输入冲突:< value>!=<>parser.y:82.5-23:警告:在默认操作上输入冲突:< value>!=< iden>parser.y:83.5-27:警告:在默认操作上输入冲突:< value>!=< iden>parser.y:104.5-55:警告:在默认操作上输入冲突:< value>!=<>parser.y:105.5-60:警告:默认操作上输入冲突:< value>!=<>parser.y:108.5-37:警告:在默认操作上输入冲突:< value>!=<>parser.y:122.49-53:警告:在默认操作上输入冲突:< oper>!=<>parser.y:122.57-60:警告:在默认操作上输入冲突:< oper>!=<>parser.y:127.5-14:警告:默认操作上输入冲突:< value>!=< iden>parser.y:157.9-35:警告:默认操作上输入冲突:< value>!=< iden>parser.y:160.9-20:警告:默认操作上输入冲突:< value>!=<>parser.y:161.9-21:警告:默认操作上输入冲突:< value>!=< oper>

parser.y

 %{#include< iostream>#include< string>#include< vector>#include< map>使用命名空间std;#include"values.h"#include"listing.h"#include"symbols.h"int yylex();无效yyerror(const char *消息);符号< int>符号;结果%}错误详细%联盟{CharPtr iden;操作员oper;整数值}%token< value>INT_LITERAL REAL_LITERAL INTEGER REAL%token< iden>识别码%令牌箭头%token ANDOP OROP%token< oper>NOTOP EXPOP MULOP REMOP ADDOP RELOP%token BOOL_LITERAL BOOLEAN如果在其他情况下以其他方式结束,则%token%token BEGIN_ END减少功能返回%type< value>function_header_主体变量_参数case语句statement_语句约简指数表达式逻辑关系项初级功率%type< oper>操作员%%功能:function_header_variables body {结果= $ 3;};function_header:FUNCTION IDENTIFIER参数返回类型';';function_header_:function_header |错误 ';'{$$ = 0;};陈述_:陈述 ';'|错误 ';'{$$ = 0;};多变的_:变量|错误 ';'{$$ = 0;};多变的:IDENTIFIER':'类型IS statement_ {symbols.insert($ 1,$ 5);};变量:变量variable_ |;范围:IDENTIFIER':'类型|IDENTIFIER':'类型',';参数:参数参数|;类型:整数|真实|布尔;身体:BEGIN_ statement_ END';'{$$ = $ 2;};声明:声明statement_ |陈述_ ;陈述:表达|减少运算符的减少量ENDREDUCE {$$ = $ 3;} |IF表达式THEN语句ELSE语句ENDIF |CASE表达式是case OTHERS ARROW语句_ ENDCASE;案件:当INT_LITERAL ARROW语句_时;情况:案例案件;减少量:减少语句_ {$$ = valuateReduction($&oper; 0,$ 1,$ 2);} |{$$ = $&oper; 0 ==添加?0:1;};操作员:通知|MULOP |删除|添加|释放|ANDOP |OROP;指数:INT_LITERAL |REAL_LITERAL |标识符;表达:表达式OROP逻辑{$$ = $ 1 ||$ 3;} |逻辑上的;逻辑上:逻辑ANDOP关系{$$ = $ 1&&$ 3;} |关系 ;关系:关系RELOP项{$$ = valuateRelational($ 1,$ 2,$ 3);} |学期 ;学期:术语ADDOP因子{$$ = valuateArithmetic($ 1,$ 2,$ 3);} |因素 ;因素:因子MULOP能力{$$ = valuateArithmetic($ 1,$ 2,$ 3);} |系数REMOP功效{$$ = valuateArithmetic($ 1,$ 2,$ 3);} |力量 ;/*右关联*/力量:主要EXPOP指数{$$ = valuateArithmetic($ 1,$ 2,$ 3);};基本的:标识符{if(!symbols.find($ 1,$$))appendError(UNDECLARED,$ 1);} |IDENTIFIER'('表达式')'|INT_LITERAL |REAL_LITERAL |BOOL_LITERAL |初级NOTOP |'('expression')'{$$ = $ 2;};%%无效yyerror(const char *消息){appendError(SYNTAX,消息);}int main(int argc,char * argv []){第一行();yyparse();如果(lastLine()== 0)cout<<结果="<<结果<<恩德尔返回0;} 

scanner.l

 %{#include< cstdio>#include< string>使用命名空间std;#include"values.h"#include"listing.h"#include"tokens.h"整数l = 0,r = 0,cbl = 0,cbr = 0;%}%option noyywrapws [\ t \ r] +注释\-\-.* \ n | \/\/.* \ n亚麻布]箭头=>如果| IF尾箱尾箱| ENDCASE案例|案例endif endif | ENDIF其他| ELSE其他人|其他真实真实| REAL然后| THEN什么时候|什么时候开始开始|开始boolean boolean | BOOLEAN减少|减少|减少结束|结束功能功能|功能整数整数| INTEGER是| IS减少|减少返回|返回和和| AND或或| OR不是|不是bool_lit true | false | TRUE | FALSEbad_underscore [A-Za-z0-9 _] * [_] {2} [A-Za-z0-9 _] * | ^ [_] [A-Za-z0-9 __] * | [A-Za-z0-9 _] * [_] + $数字[0-9]int [\-| \ +] {0,1} {digit} +点子[\(\),:;;]real_lit [\-| \ +] {0,1} [0-9] + [\.] [0-9] + [e | E] [\-| \ +] [0-9] + | [\-| \ +] {0,1} [0-9] * [\.] [0-9] + | [\-| \ +] {0,1} [0-9] + [\.] [0-9] *id [A-Za-z] [A-Za-z0-9 _] *%%{ws} {回声;}{comment} {ECHO;nextLine();}{line} {ECHO;nextLine();}{arrow} {回声;返回(箭头);}<"{ECHO;yylval.oper =少;return(RELOP);}>"{ECHO;yylval.oper =更大;return(RELOP);}> =" {ECHO;yylval.oper = GREATER_OR_EQUALS;return(RELOP);}< =" {ECHO;yylval.oper = LESS_OR_EQUALS;return(RELOP);}"=" {ECHO;yylval.oper =等于;return(RELOP);}"+" {ECHO;yylval.oper =添加;return(ADDOP);}-" {ECHO;yylval.oper = SUBTRACT;return(ADDOP);}"**" {回声;yylval.oper =指数;返回(EXPOP);}"*" {ECHO;yylval.oper = MULTIPLY;返回(MULOP);}"/" {ECHO;yylval.oper =除;返回(MULOP);}"REM" {ECHO;yylval.oper =剩余;返回(REMOP);}"rem" {回声;yylval.oper =剩余;返回(REMOP);}{if} {回显;返回(IF);}{endcase} {ECHO;返回(ENDCASE);}{case} {ECHO;return(CASE);}{endif} {回声;return(ENDIF);}{else} {回声;return(ELSE);}{others} {ECHO;返回(OTHERS);}{real} {ECHO;返回(REAL);}{then} {ECHO;return(THEN);}{何时} {回声;返回(WHEN);}{开始} {回声;return(BEGIN_);}{boolean} {ECHO;return(布尔);}{endreduce} {回声;return(ENDREDUCE);}{end} {回声;返回(END);}{function} {ECHO;return(FUNCTION);}{integer} {ECHO;return(INTEGER);}{是} {回声;退货(IS);}{reduce} {ECHO;返回(减少);}{returns} {ECHO;return(RETURNS);}{and} {回声;返回(ANDOP);}{or} {回声;返回(OROP);}{not} {回声;return(NOTOP);}{real_lit} {回声;返回(REAL_LITERAL);}{bool_lit} {回声;return(BOOL_LITERAL);}{id} {回显;yylval.iden =(CharPtr)malloc(yyleng +1);strcpy(yylval.iden,yytext);return(IDENTIFIER);}{int} {回声;yylval.value = atoi(yytext);return(INT_LITERAL);}{punc} {回声;return(yytext [0]);}.{ECHO;appendError(LEXICAL,yytext);}%% 

解决方案

这些是没有明确操作的规则中默认操作的类型不匹配.第一个来自规则

  function_header_:function_header 

在第62行.由于这里没有任何动作,因此它得到的动作是 {$$ = $ 1;} ,但 $$ 的类型为< value> (来自%type< value> function_header _ 声明) $ 1 没有类型(所以<> ,因为没有 function_header %type 声明)

I've been working a school assignment and am having difficulty figuring out which issue is causing the multiple warnings below "type clash on default action." Any help would be greatly appreciated.

Warnings received:

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

%{

#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;
} 

scanner.l

%{
#include <cstdio>
#include <string>

using namespace std;

#include "values.h"
#include "listing.h"
#include "tokens.h"

int l=0,r=0,cbl=0,cbr=0;

%}

%option noyywrap

ws      [ \t\r]+
comment         \-\-.*\n|\/\/.*\n
line            [\n]
arrow            =>

if               if|IF 
endcase          endcase|ENDCASE 
case             case|CASE 
endif            endif|ENDIF 
else             else|ELSE 
others           others|OTHERS 
real             real|REAL 
then             then|THEN 
when             when|WHEN 
begin            begin|BEGIN 
boolean          boolean|BOOLEAN 
endreduce        endreduce|ENDREDUCE 
end              end|END 
function         function|FUNCTION 
integer          integer|INTEGER 
is               is|IS 
reduce           reduce|REDUCE 
returns          returns|RETURNS 
and              and|AND    
or               or|OR 
not              not|NOT 
bool_lit         true|false|TRUE|FALSE
bad_underscore  [A-Za-z0-9_]*[_]{2}[A-Za-z0-9_]*|^[_][A-Za-z0-9_]*|[A-Za-z0-9_]*[_]+$
digit           [0-9]
int             [\-|\+]{0,1}{digit}+
punc            [\(\),:;]
real_lit        [\-|\+]{0,1}[0-9]+[\.][0-9]+[e|E][\-|\+][0-9]+|[\-|\+]{0,1}[0-9]*[\.][0-9]+|[\-|\+]{0,1}[0-9]+[\.][0-9]*

id              [A-Za-z][A-Za-z0-9_]* 
%%

{ws}        { ECHO; }
{comment}   { ECHO; nextLine();}
{line}      { ECHO; nextLine();}
{arrow}        { ECHO; return(ARROW); }


"<"     { ECHO; yylval.oper = LESS; return(RELOP); }
">"     { ECHO; yylval.oper = GREATER; return(RELOP); }
">="    { ECHO; yylval.oper = GREATER_OR_EQUALS; return(RELOP); }
"<="    { ECHO; yylval.oper = LESS_OR_EQUALS; return(RELOP); }
"="     { ECHO; yylval.oper = EQUALS; return(RELOP); }
"+"     { ECHO; yylval.oper = ADD; return(ADDOP); }
"-"     { ECHO; yylval.oper = SUBTRACT; return(ADDOP); }
"**"    { ECHO; yylval.oper = EXPONENT; return(EXPOP); }
"*"     { ECHO; yylval.oper = MULTIPLY; return(MULOP); }
"/"     { ECHO; yylval.oper = DIVIDE; return(MULOP); }
"REM"   { ECHO; yylval.oper = REMAINDER; return(REMOP); }
"rem"   { ECHO; yylval.oper = REMAINDER; return(REMOP); }


{if}            { ECHO; return(IF); }
{endcase}       { ECHO; return(ENDCASE); }
{case}          { ECHO; return(CASE); }
{endif}         { ECHO; return(ENDIF); }
{else}          { ECHO; return(ELSE); }
{others}        { ECHO; return(OTHERS); }
{real}          { ECHO; return(REAL); }
{then}          { ECHO; return(THEN); }
{when}          { ECHO; return(WHEN); }
{begin}         { ECHO; return(BEGIN_); }
{boolean}       { ECHO; return(BOOLEAN); }
{endreduce}     { ECHO; return(ENDREDUCE); }
{end}           { ECHO; return(END); }
{function}      { ECHO; return(FUNCTION); }
{integer}       { ECHO; return(INTEGER); }
{is}            { ECHO; return(IS); }
{reduce}        { ECHO; return(REDUCE); }
{returns}       { ECHO; return(RETURNS); }
{and}           { ECHO; return(ANDOP); }
{or}            { ECHO; return(OROP); }
{not}           { ECHO; return(NOTOP); }
{real_lit}  { ECHO; return(REAL_LITERAL); }
{bool_lit}  { ECHO; return(BOOL_LITERAL); }


{id}        { ECHO; yylval.iden = (CharPtr)malloc(yyleng + 1); 
            strcpy(yylval.iden, yytext); return(IDENTIFIER);}
{int}       { ECHO; yylval.value = atoi(yytext); return(INT_LITERAL); }
{punc}      { ECHO; return(yytext[0]); }
.       { ECHO; appendError(LEXICAL, yytext); }

%%

解决方案

These are type mismatches on the default action from a rule that has no explicit action. The first one is coming from the rule

function_header_: function_header

on line 62. Since there's no action here, it gets the action { $$ = $1; }, but $$ has type <value> (from the %type <value> function_header_ declaration), while $1 has no type (so <>, as there's no %type declaration for function_header)

这篇关于需要帮助确定“默认操作类型冲突"的原因.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆