0

再び私のコードのNLP実装にいくつかの問題があります..pro.lファイルにいくつかのパターンとそのアクションがあります...Pro.l

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

lexファイルの現在のパターンに表されていないジャンクワードに対応する方法をいくつか提案してください。

エラーstmts:i/p- >名前がxyzと等しい本を表示します。

エラー->yyerror:構文エラー、予期しないINPUT、QUALIFIERまたはTABLEまたはFIELDが必要です。

PS:ジャンクワード:xyz、abc、fgfhg、jhyjg898など

4

1 に答える 1

0

あなたは[a-zA-Z]+最初のルールとして(ジョナサンのキャッチオール)を置きました。あいまいな場合、lexは一致する最長のパターンを取ります。2つのパターンが同じ長さの文字列に一致する場合、最初のパターンが使用されます。したがって、キャッチオールを最初に配置することで、。などの他のキーワードとも一致しwhoseます。そのため、ジョナサンはこのキャッチオールルールを最後に置くと言いました。そうすれば、すべてのキーワードが最初に一致し、キャッチオールと一致しない場合にのみ使用されます。

于 2013-03-27T12:37:41.320 に答える