再次在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等
歡迎登機。請包括您收到的未經編輯的錯誤消息,並附上您的問題。謝謝。 – 2013-03-26 16:54:40
已將錯誤包含在問題語句以及我想包含的命令/模式中 – jose 2013-03-26 17:31:06
將其他規則放在一起。 – 2013-03-26 21:26:59