2012-10-31 41 views
2

下面是一個Flex程序的代碼片段Echo和拒絕FLEX

%% 
a  | 
ab | 
abc | 
abcd ECHO; REJECT; 
.|\n printf("xx%c", *yytext); 
%% 

輸入:

abcd 

輸出:

abcdabcabaxxaxxbxxcxxdxx 

有人能解釋如何得到這個輸出?

+0

您是否想要標記此w/gnu-Flex或Lex?它似乎不是Adobe/Apache Flex的問題。 – JeffryHouser

+0

這個程序是使用unix – sc1013

+0

命令'flex ***。lex'和'gcc'編譯的,我繼續爲你重新標記它。適當的標記可以幫助你解答你的問題。 – JeffryHouser

回答

4

REJECT有效地使flex備份到下一個更好的匹配,在銘記的優先級規則flex

  1. 匹配儘可能長的令牌。
  2. 具有相同長度的標記中,優先選擇源文件中較早的模式。

在你的情況,該字符串abcd將匹配aababcabcd;首選的是最長的一個(abcd)。

由於您在REJECT操作之前執行了ECHO操作,因此即使匹配稍後會被拒絕,也會發生ECHO。最後,flex將回退到默認規則(它也匹配a,但後來在源文件中),它將打印xxa並接受該字符。現在,除了默認規則外,沒有任何內容匹配,所以接下來的三個字符每次匹配一個。

如果您將'\n'寫入標準輸出,這可能會更清晰。