如何在lex中获取给定单词的词根

时间:2014-10-15 08:55:38

标签: lex

我们怎样才能找到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。

1 个答案:

答案 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可能是也可能不是这项工作的最佳工具。