【问题标题】:Yacc error request for member "Token" in something not a structure or unionYacc 对非结构或联合中的成员“令牌”的错误请求
【发布时间】:2014-05-18 17:26:08
【问题描述】:

我尝试了所有方法,但一直收到以下错误:

(line)20:31: 错误:在不是结构或联合的东西中请求成员“val”

(line)22:38: 错误:在不是结构或联合的东西中请求成员“val”

(line)27:108: 错误:在不是结构或联合的东西中请求成员“val”

%{
#include "y.tab.h"
%}

%option noyywrap
%option yylineno

%%
0|[1-9][0-9]* {yylval.val=atoi(yytext); return NUM;}
\*|\+         {yylval.val=yytext[0]=='+'?0:1; return OP;}
\(|\)          return yytext[0];
[ \t\n]       ;
.             yyerror("caracter invalido");

%%

还有 yacc:

%{
#include<stdio.h>
#include<stdlib.h>
extern int yylineno;
%}

%union {struct nodo{int val; struct nodo *next} *p; int val;}
%start lexp
%token<val> OP NUM
%type<p> larg arg
%type<val> exp

%%

lexp    : lexp exp 
    |   
    ;
exp : '(' OP larg ')' {struct nodo *p=$3->next;int val=$3->val;
              while(p){
                val=$2.val?(val+p->val):(val*p->val);
                p=p->next;}
              printf("R:%d\n", val); $$.val=val;}
    ;
larg    : arg larg {$$=$1; $1->next=$2;}
    | arg arg  {$$=$1; $1->next=$2;}
    ;
arg : NUM {$$= (struct nodo *) malloc(sizeof(struct nodo)); $$->next=0; $$->val=$1.val;}
    | exp {$$= (struct nodo *) malloc(sizeof(struct nodo)); $$->next=0; $$->val=$1.val;}
    ;
%%
int yyerror(char *s){fprintf(stderr, "linha %d: %s\n", yylineno,s); return 0;}
int main(){
yyparse();
return 0;
}

【问题讨论】:

    标签: c yacc lex


    【解决方案1】:

    您是否尝试从$2.val 之类的内容中删除.val?由于您的 %token%type 行和 &lt;tag&gt; 构造,联合的特定字段已经确定。换句话说,您在生成的 C 代码中执行 (yylval.val).val 之类的操作。

    【讨论】:

    • 谢谢你,在你的解释之后现在确实有意义:D
    猜你喜欢
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2015-12-20
    • 2016-03-06
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多