linux - 针对 lex 和 yacc 中的小错误的建议

标签 linux nlp yacc lex

我的代码的 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]+操作但它不允许我这样做并给出错误。我想包含此模式,以便我可以在程序中容纳任何垃圾词。

下面给出的是 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 文件当前模式中未表示的垃圾词。

Errors stmts : i/p --> 显示名称等于 xyz 的书。

错误 --> yyerror :语法错误,意外的 INPUT ,需要 QUALIFIER 或 TABLE 或 FIELD 。

P.S.:垃圾词,如:xyz、abc、fgfhg、jhyjg898 等

最佳答案

您已将 [a-zA-Z]+ (Jonathan 的全部内容)作为第一条规则。如果出现歧义,lex 将采用最长的匹配模式。如果两个模式与相同长度的字符串匹配,则采用第一个模式。因此,通过将 catch-all 放在第一位,它还将匹配其他关键字,例如 whose。这就是为什么乔纳森说要把这个包罗万象的规则放在最后。这样,所有关键字都会首先匹配,并且只有当它们不匹配时才会使用包罗万象的关键字。

关于linux - 针对 lex 和 yacc 中的小错误的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15640874/

相关文章:

linux - 用于 SSL 的 Arangod.conf

linux - 在 Linux 中创建新线程是否复制文件描述符和套接字描述符?

linux - #!/bin/bash --login vs #!/bin/bash

go - 如何在 HTTP 请求中发送多部分表单数据(用于 Watson NLC 培训)?

c++ - 制作可重入解析器的错误

linux - 在单个命令中使用前缀重命名文件夹中的所有文件

python - 使用 Spacy 计算多个文档相似度的有效方法

python - Word2Vec 和 Gensim 参数等价

c - 段错误(核心转储) Yacc/C

c++ - 解析 C 头文件