2014-10-15 3 views
0

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

모든 접미사의 길이가 같은 경우 문제가 없습니다. 토큰의 길이를 줄이면됩니다. 예를 들어 :

[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 

것은 그래서 당신은 아마 그냥 suffi을 삭제하지 않으을 엑스; (dotted처럼) 더 많이 삭제하거나 (dated처럼) 삭제하거나 수정할 수도 있습니다 (dried에서와 같이). 그렇다면 예외 사전이 필요합니다. Flex는이 작업에 가장 적합한 도구 일 수도 있고 아닐 수도 있습니다.

관련 문제