2015-05-26 184 views
0

我嘗試使用柔性/野牛由下一個模式設置語法:故障使用Flex /野牛

DATA: 1,2,3,4,5 PROGRAM: add,mult,div,read 

該輸入必須被轉移到

4 add mult div read 5 1 2 3 4 5 

其中:圖4是後一數量的命令「PROGRAM」 和5是「DATA」之後的一些數據。 目前我有下一個代碼。

在asm.y(野牛):

%{ 
#include<stdio.h> 

int comm[100]; 
int data[100]; 
int ncomm=0; 
int ndata=0; 
%} 

%token NUMBER 

%% 

PROGR:"DATA: "INPUT" PROGRAM: "COMMANDS 
; 

COMMANDS: 
| INSTR","COMMANDS 
; 

| NUMBER","INPUT {data[ndata]=$1; ndata++;} 
; 

INSTR:NUMBER {comm[ncomm]=$1; ncomm++;} 
|"add" {comm[ncomm]=-10000; ncomm++;} 
|"mult" {comm[ncomm]=-10001; ncomm++;} 
|"div" {comm[ncomm]=-10002; ncomm++;} 
|"minus" {comm[ncomm]=-10003; ncomm++;} 
//and so on 
; 

%% 
int main(int argc, char** argv) 
{ 

yyparse(); 

printf("\n%d ",ncomm); 
int i; 
for(i=0; i<ncomm; i++) 
{ 
    printf("%d ",comm[i]); 
} 
printf("%d ",ndata); 
for(i=0; i<ndata; i++) 
{ 
    printf("%d ",data[i]); 
} 

} 

yyerror(char* s) 
{ 
printf("error: %s\n",s); 
} 

而且在asm.l(柔性):

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

%% 

[0-9]+ {return NUMBER;} 

%% 

所以,畢竟,程序不正確的打印數據,但是,例如

對於

DATA: PROGRAM: add 

它打印

DATA: PROGRAM: add 

並等待下一個輸入。

在另一方面,對於

DATA: 5 PROGRAM: add 

它打印

DATA: error: syntax error 

0 0 

而且我不知道我做錯了。

回答

1

你還有很多工作要做。當你說它適用於DATA: PROGRAM: add時,它並沒有:你被Lex的一個「功能」咬住了:在標準輸出上打印了無法識別的字符。

所以:

  • 告訴的Flex你不想未知字符爲通透。

    %option nodefault 
    
  • 你需要教野牛該令牌如"DATA:"將被使用。喜歡的東西:

    %token ADD "add" 
    %token DATA "DATA:" 
    

    然後一定要準確"DATA:"或文件的其餘部分DATA,不要使用"DATA: "例如。

  • 您需要掃描儀/詞法分析器認出你需要的所有令牌:不只是數字,但也關鍵字(或標識),如addmult等喜歡的東西:

    "+" return ADD; 
    

    而且"DATA:"

    ​​
  • 請一定要告訴你解析器生成一個NUMBER有一個值:

    %token <int> NUMBER 
    
  • ,並告訴你掃描儀來計算它。

你有很多東西要學。在嘗試完成所有這些之前,請務必嘗試基本的examples from Bison's documentation,並完全理解它們。

+0

非常感謝你的幫助 – Gcinbax

+0

@Gcinbax那麼,你可以點擊我的答案來接受它。 – akim