私は Yacc に慣れていないので、ここで見つけた例を機能させようとしています。でコンパイルしようとするとyacc -d calc.yacc
、次のエラーが発生します。
calc.yacc:42.17-18: `stat' の $1 には型が宣言されていません
calc.yacc:96.22-23: `expr' の $1 には宣言された型がありません
calc.yacc:105.17-18: `number' の $1 には型が宣言されていません
calc.yacc:106.20-21: `number' の $1 には型が宣言されていません
calc.yacc:110.29-30: `number' の $2 には型が宣言されていません
私はグーグルを試してみましたが、私が知る限り、解決策は %type に関係していますが、何を追加すればよいかわかりません。
コードは以下のとおりです。
%{
#include <stdio.h>
int regs[26];
int base;
%}
%start list
%union { int a; }
%type <a> expr number
%token DIGIT LETTER
%left '|'
%left '&'
%left '+' '-'
%left '*' '/' '%'
%left UMINUS /*supplies precedence for unary minus */
%% /* beginning of rules section */
list: /*empty */
|
list stat '\n'
|
list error '\n'
{
yyerrok;
}
;
stat: expr
{
printf("%d\n",$1);
}
|
LETTER '=' expr
{
regs[$1] = $3;
}
;
expr: '(' expr ')'
{
$$ = $2;
}
|
expr '*' expr
{
$$ = $1 * $3;
}
|
expr '/' expr
{
$$ = $1 / $3;
}
|
expr '%' expr
{
$$ = $1 % $3;
}
|
expr '+' expr
{
$$ = $1 + $3;
}
|
expr '-' expr
{
$$ = $1 - $3;
}
|
expr '&' expr
{
$$ = $1 & $3;
}
|
expr '|' expr
{
$$ = $1 | $3;
}
|
'-' expr %prec UMINUS
{
$$ = -$2;
}
|
LETTER
{
$$ = regs[$1];
}
|
number
;
number: DIGIT
{
$$ = $1;
base = ($1==0) ? 8 : 10;
} |
number DIGIT
{
$$ = base * $1 + $2;
}
;
%%
main()
{
return(yyparse());
}
yyerror(s)
char *s;
{
fprintf(stderr, "%s\n",s);
}
yywrap()
{
return(1);
}