1

我正在尝试构建 NLP 。但问题是我无法在其中获得一些东西。例如:如果在行动中我说

printf("打印第三个参数 %s", $3) ;

然后它没有给我第三个论点而是它显示

打印第三个参数(空)

由于我正在尝试构建 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)

. 我实际上应该用 book 代替 (null) 。.. 我怎么做 ?

PS:每次我尝试在所有语法中打印该参数时都会得到这个空值

4

2 回答 2

1

您的词法分析器正在返回一个标记号 ( TABLE),但您的解析器正试图将其解释为一个字符串。将您的解析规则更改为

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

我认为你会看到不同之处。

于 2013-03-25T14:51:16.427 回答
1

您的词法分析器没有保留单词的拼写——它只是返回一个数字,而没有确保该单词除了 as 之外可用yytextyytext当令牌到达时,您的语法没有复制。因此,如果您需要保留字符串(以便您可以区分“回复”和“显示”,例如,令牌 ASK 的两种替代拼写),那么您必须确保信息被保存、复制、发布。到语法规则运行时,它很可能已经读取了更多的标记——甚至可能遇到了 EOF。因此,您通常需要一个更复杂的 YYSTYPE(和%union)结构,以便您可以在以后获得所需的信息。

于 2013-03-25T16:06:37.050 回答