2013-03-26 104 views
0

再次在NLP執行我的代碼一些問題,一個小錯誤.. 在pro.l文件我有幾個模式和他們的行動... Pro.l建議在lex和yacc

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
void yyerror(char *str); 
%} 
%% 

[\t] ; 
[a-zA-Z]+ { yylval = strdup(yytext) ; return INPUT ; } /* may be this line is source of error . It has been written so as to include Junk words */ 
"is equal to" { return CONDITION ; } 
"whose" { return WHOSE ; } 
"by"  { return PREP ; } 
"any" { return QUALIFIER ; } 
"our" { return QUALIFIER ; } 
"show" { return ASK ; } 
"list" { return ASK ; } 
"display us" { return ASK ; } 
"and" { return WORD ; } 
"every" { printf("%s \n", yylval) ; return QUALIFIER ; } 
"of every" { return QUALIFIER ; } 
"all" { printf("%s \n", yylval) ; return QUALIFIER ; } 
"name" { yylval = strdup(yytext) ; printf("%s \n", yylval) ; return FIELD ; } 
"id" { yylval = strdup(yytext) ; return FIELD ; } 
"the" { return QUALIFIER ; }  
"how many" { return MOJ ; } 
"count" { return MOJ ; } 
"book" { yylval = strdup(yytext) ; printf("%s \n", yylval) ; return TABLE ; } 
"?" { return EOL ; } 
"." { return EOL ; } 
%% 

上面給出的是pro.l,我想要包括一個模式[a-zA-Z]+ action但它不允許我這樣做,並給出錯誤。我想包括這種模式,以便我可以容納我的程序中的任何垃圾詞。

下面給出的是pro.y

%{ 
#include <stdio.h> 
#include <stdio.h> 
#include <string.h> 
#define YYSTYPE char *   
extern char *yytext ; 

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

%error-verbose 
%token ASK 
%token PREP 
%token QUALIFIER 
%token MOJ 
%token WORD 
%token TOTAL 
%token EOL 
%token TABLE 
%token FIELD 
%token WHOSE 
%token CONDITION 
%token INPUT 

%% 

translate : select 
      | count 
      ;                                     


select : ASK QUALIFIER TABLE EOL { printf("SELECT DISTINCT * FROM %s",$3) ;} 
     | ASK FIELD QUALIFIER TABLE EOL  { printf("SELECT %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) ;} 
     | ASK QUALIFIER TABLE WHOSE FIELD CONDITION INPUT EOL { printf("SELECT DISTINCT * FROM %s WHERE %s =", $3, $5); } 
     |  
     ; 

count : MOJ TABLE EOL { printf("SELECT COUNT(*) FROM %s", $2) ;} 
     | ASK TABLE MOJ EOL { printf("SELECT COUNT(*) FROM %s", $2); } 
     | MOJ TABLE PREP FIELD EOL {printf("SELECT COUNT(*) FROM %s WHERE %s = ",$2 ,$4) ;} 
     ; 
%% 

#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 ; 
} 

請建議我一些方法,以適應在法文件的當前模式不是代表的垃圾話。

Errors stmts:i/p - >向我們顯示名稱等於xyz的書。

錯誤 - > yyerror:語法錯誤,意外的INPUT,期望QUALIFIER或TABLE或FIELD。

附::垃圾這樣的詞:xyz,abc,fgfhg,jhyjg898等

+0

歡迎登機。請包括您收到的未經編輯的錯誤消息,並附上您的問題。謝謝。 – 2013-03-26 16:54:40

+0

已將錯誤包含在問題語句以及我想包含的命令/模式中 – jose 2013-03-26 17:31:06

+2

將其他規則放在一起。 – 2013-03-26 21:26:59

回答

0

您已經把[a-zA-Z]+(Jonathan的全部)作爲第一條規則。如果含糊不清,lex會採用最長的匹配模式。如果兩個模式匹配一​​個相同長度的字符串,那麼將採用第一個模式。因此,通過首先放置全部,它也將匹配其他關鍵字,如whose。這就是爲什麼喬納森說這是最後一條通用規則。這樣所有的關鍵字將首先匹配,只有當它們不匹配時纔會被使用。

+0

謝謝你,得到它......感謝喬納森 – jose 2013-03-27 13:27:36