需要帮助确定“默认操作类型冲突"的原因. [英] Need help identifying cause of "type clash on default action"
问题描述
我一直在做学校作业,很难弄清楚是哪个问题导致默认操作类型冲突"下的多个警告.任何帮助将不胜感激.
收到的警告:
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屋!