Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言编写的英语语法分析器(FLEX-LEXAR)用于句子分类_C_Flex Lexer_Lex_Lexical Analysis_Lexical - Fatal编程技术网

用C语言编写的英语语法分析器(FLEX-LEXAR)用于句子分类

用C语言编写的英语语法分析器(FLEX-LEXAR)用于句子分类,c,flex-lexer,lex,lexical-analysis,lexical,C,Flex Lexer,Lex,Lexical Analysis,Lexical,我正在开发一个英语语法分析器,它将一个句子作为用户的输入,并执行3项任务 检查句子是否包含规则部分中我定义的规则中的单词(动词、名词、字词等) 将单个单词标记为名词、动词、代词,并与规则进行比较 做句子分类 我已经完成了前两部分,有人能指导我如何修改我的程序,以在flex中完成第三部分吗?这很简单,也很容易实现 %option noyywrap %{ #include<stdio.h> %} extern FILE * yyin; %% [\t ]+ /* ignore

我正在开发一个英语语法分析器,它将一个句子作为用户的输入,并执行3项任务

  • 检查句子是否包含规则部分中我定义的规则中的单词(动词、名词、字词等)
  • 将单个单词标记为名词、动词、代词,并与规则进行比较
  • 做句子分类
  • 我已经完成了前两部分,有人能指导我如何修改我的程序,以在flex中完成第三部分吗?这很简单,也很容易实现

    %option noyywrap
    %{
    #include<stdio.h>
    
    %}
    extern FILE * yyin;
    %%
    
    [\t ]+      /* ignore white space */ ;
    
    is |
    am |
    are |
    were |
    was |
    be |
    being |
    been |
    do |
    does |
    did |
    will |
    would |
    should |
    can |
    could |
    has |
    have |
    had |
    go      { printf("%s: is a verb\n", yytext); }
    
    
    very |
    simply |
    gently |
    quietly |
    calmly |
    angrily     { printf("%s: is an adverb\n", yytext); }
    
    
    
    to |
    from |
    behind |
    above |
    below |
    between |
    below       { printf("%s: is a preposition\n", yytext); }
    
    work |
    play |
    help |
    loves |
    runs    { printf("%s: is a noun\n", yytext); }
    
    if |
    then |
    and |
    but |
    or      { printf("%s: is a conjunction\n", yytext); }
    
    their |
    my |
    your |
    his |
    her |
    its     { printf("%s: is an adjective\n", yytext); }
    
    I |
    you |
    he |
    she |
    we |
    they        { printf("%s: in a pronoun\n", yytext); }
    
    
    [a-zA-Z]+ {
         printf("%s:  don't recognize, it's not a correct word\n", yytext);
        }
    
    \&.|\n      { ECHO; /* normal default anyway */ }
    
    %%
    
    main()
    {
        char fn[25];
        printf("Enter a file name ");
        gets(fn);
        yyin=fopen(fn,"r");
        yylex();
    
    
    }
    
    %选项noyywrap
    %{
    #包括
    %}
    外部文件*yyin;
    %%
    [\t]+/*忽略空白*/;
    是|
    上午|
    是|
    是|
    是|
    是|
    存在|
    曾经|
    做|
    做|
    做过|
    意志|
    会|
    应该|
    能|
    可能|
    有|
    有|
    有|
    go{printf(“%s:是动词\n”,yytext);}
    非常|
    简单地|
    轻轻地|
    悄悄地|
    平静地|
    愤怒地{printf(“%s:是副词,\n”,yytext);}
    到|
    从|
    背后|
    在上面|
    下面|
    中间|
    在{printf(“%s:是介词\n”,yytext);}
    工作|
    玩|
    帮助|
    爱|
    运行{printf(“%s:是一个名词\n”,yytext);}
    如果|
    然后|
    及|
    但是|
    或{printf(“%s:是连词,\n”,yytext);}
    他们的|
    我的|
    你的|
    他的|
    她|
    它的{printf(“%s:是一个形容词,\n”,yytext);}
    我|
    你|
    他|
    她|
    我们|
    它们{printf(“%s:在代词中,yytext);}
    [a-zA-Z]+{
    printf(“%s:无法识别,它不是正确的单词\n”,yytext);
    }
    \&.|\n{ECHO;/*正常默认值*/}
    %%
    main()
    {
    char-fn[25];
    printf(“输入文件名”);
    获取(fn);
    yyin=fopen(fn,“r”);
    yylex();
    }
    

    请告诉我,我只想要flex中简单易用的解决方案

    你说的“句子分类”是什么意思?(对不起,我不是母语人士。)嗯,您的示例代码只是打印调试输出。下一步应该是让它返回令牌。然后,您必须制定一个语法(类似于简化的英语语法)来定义规则,哪些标记可能出现在哪个序列中,以形成有效的句子。基于此语法,您可以开发解析器。解析器可能是递归下降解析器(例如,用C或C++编写)。或者,您可以使用yacc或bison(lex或flex的“兄弟”)。我对你为人类语言编写语法分析器的胆小鬼印象深刻。即使对于形式语言,解析器构造也很困难,但人类语言更难。不过,你很幸运能用英语表达出来。恐怕对德国人来说更难。这就是为什么我总是对Word for Windows中的绿线感到好笑(也就是说,我从不相信)。。。(对于非MS Office用户:绿线表示语法错误…)