因此,我環顧四周尋找答案,但我唯一能夠收集的是我有一個範圍問題。Yacc範圍問題
錯誤讀取ch3-05.y:54:錯誤:預期 '=', ' ' ';', 'ASM' 或' 屬性' 前 '{' 令牌
這裏是我的代碼逐字
%{
#include <stdio.h>
#include "ch3hdr2.h"
#include <string.h>
#include <math.h>
%}
%union {
double dval;
struct symtab *symp;
}
%token <symp> NAME
%token <dval> NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS
%type <dval> expression
%%
statement_list : statement '\n'
| statement_list statement '\n'
;
statement : NAME '=' expression {$1->value = $3;}
| expression { printf("= %g \n", $1); }
expression : expression '+' expression { $$ = $1 + $3;}
| expression '-' expression { $$ = $1 - $3;}
| expression '*' expression { $$ = $1 * $3;}
| expression '/' expression {
if($3 == 0.0)
yyerror("divide by zero");
else
$$ = $1/$3;
}
| '_' expression %prec UMINUS {$$ = -$2;}
| '(' expression ')' { $$ = $2;}
| NUMBER
| NAME {$$ = $1->value; }
| NAME '(' expression ')' {
if($1 ->funcptr)
$$ = ($1->funcptr) ($3);
else {
printf("%s not a function\n", $1->name);
$$ = 0.0;
}
}
;
%%
struct symtab *
symlook(s)
char *s;
{ // this is where the error is
char *p;
struct symtab *sp;
for(sp = symtab; sp < &symtab[NSYMS]; sp++){
if(sp -> name && !strcmp(sp->name, s))
return sp;
if(!sp->name) {
sp->name = strdup(s);
return sp;
}
}
yyerror("TOO MANY SYMBOLS");
exit(1);
}
addfunc(name, func)
char *name;
double (*func)();
{
struct sumtab *sp = symlook(name);
sp->funcptr = func;
}
main()
{
extern double sqrt(), exp(), log();
addfunc("sqrt", sqrt);
addfunc("exp", exp);
addfunc("log", log);
yyparse();
}
我一直在盯着屏幕,但沒有工作。任何幫助將不勝感激。
此外,我稍後再發現一些錯誤,但我認爲這可能是因爲我還沒有解決這個問題。
以下是我對ch3hdr2.h
#define NSYMS 20 /* max number of symbols */
struct symtab {
char *name;
double (*funcptr)();
double value;
} symtab [NSYMS];
struct symtab *symlook();
你不應該寫/使用使用非原型函數聲明的代碼。代碼從哪裏來的? – 2011-03-30 13:58:41