用C语言编写的英语语法分析器(FLEX-LEXAR)用于句子分类
我正在开发一个英语语法分析器,它将一个句子作为用户的输入,并执行3项任务用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
%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用户:绿线表示语法错误…)