1

NLPを構築しようとしています。しかし、問題は、私がそれにいくつかのものを入れることができないということです。例:実際に動作している場合

printf( "3番目の引数%sを出力"、$ 3);

それからそれは私に3番目の引数を与えません代わりにそれは示します

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/pを使用して入力ファイルsample.txtを実行した後、「すべての本を読んでください。」(引用符は含まれていません私はo/pを取得します

                            SELECT * FROM (null)

。私は実際に(null)の代わりに本を取得する必要があります。.. それ、どうやったら出来るの ?

PS:すべての文法でその引数を出力しようとするたびにこのnull値を取得します..

4

2 に答える 2

1

レクサーはトークン番号(TABLE)を返していますが、パーサーはそれを文字列として解釈しようとしています。解析ルールを次のように変更します

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

違いがわかると思います。

于 2013-03-25T14:51:16.427 に答える
1

字句解析プログラムは単語のスペルを保持していません。単語がとして以外に使用可能であることを確認せずに、単に数字を返していyytextます。yytextトークンが到着したときに文法がコピーされていません。したがって、文字列を保持する必要がある場合(たとえば、「返信」と「表示」を区別できるようにするため、トークンASKの2つの代替スペル)、情報が保存、コピー、リリースされていることを確認する必要があります。文法規則が機能するまでに、さらに多くのトークンを読み取った可能性があります。おそらくEOFに遭遇したことさえあります。%unionしたがって、後で必要な情報を取得できるように、通常はYYSTYPE(および)のより複雑な構造が必要です。

于 2013-03-25T16:06:37.050 に答える