모든 접미사의 길이가 같은 경우 문제가 없습니다. 토큰의 길이를 줄이면됩니다. 예를 들어 :
[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는이 작업에 가장 적합한 도구 일 수도 있고 아닐 수도 있습니다.