1

我想你写一些简单的编译器,检测未声明的变量,并做一些额外的东西。问题是,我不能在我的野牛文件中使用“$$”,它说“$$'$$'没有声明类型”。这里是我的flex和野牛文件的相关部分:从flex返回属性到野牛

flx file: 

int[ \t\n]+matrix {yylval.type_id.Type = 4;return tINTMATRIXTYPE; } 

bison file: 

%} 

%union semrec 
{ 
struct 
{ 
    int Type; 
    char *id; 
}type_id; 
} 

%start prog 



%% 
prog: stmtlst 
; 

stmtlst : stmt 
    | stmt stmtlst 
; 

tmt : decl //baktım 
    | asgn 
    | if 
; 

decl : type vars '=' expr ';' 
; 

type : tINTTYPE  
    | tINTVECTORTYPE  
    | tINTMATRIXTYPE {$$.Type=$1.Type;} 
    | tREALTYPE   
    | tREALVECTORTYPE  
    | tREALMATRIXTYPE  
; 




%% 

写作$ 1.型号野牛文件的工作,但$$类型不起作用。 任何人都可以帮忙吗?谢谢

回答

1

您需要明确告诉野牛每个令牌是什么类型(终端和非终端),你计划分配一个值。它也看起来像你没有任何你的标记声明。

%type <Type> type 

让你开始。但是现在您必须确保$$为所有其他类型(tINTTYPE等)设置。

这里有一个简单的例子,应该给你如何野牛工作的一般要点:http://www.gnu.org/software/bison/manual/bison.html

+0

是的,这工作。谢谢! – yrazlik 2013-04-10 15:58:25

+0

flex/bison是有趣且功能强大的小工具,但首先要弄清楚它们可能非常棘手。如果你还有其他问题,肯定会发布。出于好奇,这个项目的背景是什么? – Josh 2013-04-10 16:01:20

+0

谢谢,实际上ii还有一个问题。关于你的问题,项目的背景是,我们为基本的数学操作编写了扫描仪和语义分析器。我们在上一步中做了句法问题,现在我们必须检测语义错误。 1)未声明的变量2)矩阵或向量与整数,实数等比较。我的另一个问题是,我可以做这样的事情:%token tIDENT,但我不能做以下几点: %类型变量。我的意思是,如果它是一个令牌,那么我可以将它与2个属性相关联,但是如果它是我不能的类型。 – yrazlik 2013-04-10 17:25:36