我们怎样才能找到lex中给定单词的根词?例如:当我们确定作为输入给出的单词时,输出应为"根单词决定"
%{
#include<stdio.h>
%}
[a-zA-Z]*"ed"|[a-zA-Z]*"ly" {printf("the root word is %s",yytext);}
%%
main()
{
yyin=fopen("a.c","r");
yylex();
}
此代码实际打印给定的单词。但我希望输出作为根词而没有ed或ly。
答案 0 :(得分:1)
如果所有后缀长度相同,则没有问题;你只需要减少令牌的长度。例如:
[a-zA-Z]*("ed"|"ly") { printf("the root word is %.*s",
yyleng-2, yytext);
}
或者,将结果存储在某处
[a-zA-Z]*("ed"|"ly") { sval = strndup(yytext, yyleng-2); }
但是,一般情况下,您可能会有不同长度的后缀。在这种情况下,一种解决方案是分离规则:
[a-zA-Z]*("ed"|"ly") { sval = strndup(yytext, yyleng-2); }
[a-zA-Z]*"ing" { sval = strndup(yytext, yyleng-3); }
你可以将动作重构为一个以后缀长度为参数的函数(或替换模式,见下文。)
在英语中(和大多数语言一样),你实际上不能只删除后缀并得到根:⇒
dotted ⇒ dot
darted ⇒ dart
dated ⇒ date
dried ⇒ dry
所以你可能不想删除后缀;您可能希望删除更多(如dotted
)或更少(如dated
中),甚至删除和修改(如dried
中所示)。即便如此,您还需要一本例外词典。 Flex可能是也可能不是这项工作的最佳工具。