2013-03-25 83 views
1

正在嘗試構建NLP。但事情是,我無法在其中得到一些東西。例如:如果在行動中我說LEX和YACC:NLP中的語法實現

printf(「打印第三個參數%s」,$ 3);

那麼它不會給我的第三個參數,而不是它顯示

打印第三個參數(NULL)

,因爲我試圖建立一個NLP,重要的是我包括參數。所以我該怎麼做 。下面我包括一些示例代碼和輸出的:

pro.yacc文件:

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "y.tab.h" 

int yylex(void) ; 
static void yyerror(char *str) 
{ 
    printf("yyerror : %s " , str) ; 
} 
%} 

%error-verbose 
%token ASK 
%token FIELD 
%token QUALIFIER 
%token MOJ 
%token WORD 
%token TOTAL 
%token TABLE 
%token EOL 


%% 

translate : select 
     | count 
      ;                                      


select : ASK QUALIFIER TABLE EOL  { printf("SELECT * FROM %s",$3) ;} 
    | ASK FIELD QUALIFIER TABLE EOL { printf("SELECT DISTINCT %s FROM %s ", $2, $4) ;} 
    | ASK QUALIFIER TABLE FIELD EOL { printf("SELECT DISTINCT %s FROM %s ", $4, $3) ;} 
    | ASK QUALIFIER FIELD WORD FIELD QUALIFIER TABLE EOL { printf("SELECT DISTINCT %s , %s FROM %s", $3, $5, $7) ;}   
    ; 

count  : MOJ TABLE EOL { printf("SELECT COUNT(*) FROM %s", $2) ;} 
    ; 


%% 


#include "lex.yy.c" 
extern int yylex() ; 
extern int yyparse() ; 
extern FILE *yyin ; 
int main() 
{ 
    FILE *myfile = fopen("sample.txt" , "r") ; 
    if(!myfile) 
    { 
     printf("Can't open the file ") ; 
     return -1 ; 
    } 
    yyin = myfile ; 
    do 
    { 
     yyparse(); 
    }while(!feof(yyin)) ; 
    yylex_destroy() ; 
    return 0 ; 
} 

pro.lex:

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "y.tab.h" 
#include "pro.tab.h" 

void yyerror(char *str) ; 





int line_num = 1 ; 
%} 




%% 

[\t] ; 

"reply" { return ASK ; } 

"display" { return ASK ; } 

"and" { return WORD ; } 

"of every" { return QUALIFIER ; } 

"all" { return QUALIFIER ; } 

"the" { return QUALIFIER ; } 

"every" { return QUALIFIER ; }  

"name" { return FIELD ; } 

"id" { return FIELD ; } 

"how many" { return MOJ ; } 

"book" { return TABLE ; } 

"." { return EOL ; } 



%%   

,其中i在這個運行輸入文件sample.txt後/ p:「讀每本書」。 (行情不包括我得到的O/P

      SELECT * FROM (null) 

我應該實際到位(空)來獲取本書..我如何做到這一點

PS:?我得到這個空值每次我嘗試打印這樣的說法。在所有的語法

回答

1

您的詞法分析器不保留單詞的拼寫 - 它只是返回一個數字,而不確定該單詞是否可用,而不是yytext。當令牌到達時,您的語法不復制yytext。因此,如果您需要保留字符串(例如,您可以區分「回覆」和「顯示」,則可以使用兩種替代拼寫方式來表示記號),則必須確保信息已保存,複製和發佈。在語法規則運行的時候,它可能已經讀了更多的標記 - 甚至可能遇到過EOF。因此,對於YYSTYPE(和%union),您通常需要更復雜的結構,以便您可以掌握稍後需要的信息。

+0

感謝您詳細解釋 – jose 2013-03-25 16:25:13

+0

宣佈要解決的問題...謝謝大家 – jose 2013-03-25 21:03:15

1

你的詞法分析器返回一個令牌數(TABLE),但你的解析器正試圖將其解釋爲一個字符串。您解析規則更改爲

select : ASK QUALIFIER TABLE EOL  { printf("SELECT * FROM %d",$3) ;} 

,我認爲你會看到區別。

+0

先生它返回SELECT * FROM 0沒有幫助 – jose 2013-03-25 15:16:38

+0

這絕對是在正確的軌道上... – 2013-03-25 16:03:00