正在嘗試構建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:?我得到這個空值每次我嘗試打印這樣的說法。在所有的語法
感謝您詳細解釋 – jose 2013-03-25 16:25:13
宣佈要解決的問題...謝謝大家 – jose 2013-03-25 21:03:15