2013-04-22 69 views
0

我有表達撓曲詞法分析器不重複

[A-E]|[A-E]{3}|[A-E]{4} 

其作出識別角度(A,B,C,D,E)或三角形(ABC,BCD) ECT或矩形(ABCD,EDCB) ECT

BUT

的名稱我想更改表達式,以便用戶CANT輸入一個具有相同字母的名稱2次,名稱如AAC或ABAE不應該是三角形或矩形的有效名稱。

我見過這種類型的問題的正則表達式解決方案here,但不能看到我怎麼能做到這一點在flex和無法找到一種方法來解決這個flex手冊的模式。任何幫助/指導將有所幫助。

感謝

回答

1

Flex中要做到這一點,最簡單的方法可能是用REJECT

[A-E]|[A-E]{3}|[A-E]{4} { for (int i = 0; i < yyleng-1; i++) { 
           if (strchr(yytext+i+1, yytext[i])) { 
            /* duplicate letter in string */ 
            REJECT; } } 
          return whatever...; } 
[A-Z]+     { return something_else...; } 

有了這個,如果你有一個像ABA輸入,它將匹配的模式,但由於重複A,它會拒絕那場比賽,並去匹配下一個最佳模式(在這種情況下爲[A-Z]+),並返回something_else ...

另請注意,從flex文檔:

'REJECT'在掃描儀性能方面是一項特別昂貴的功能; 如果在中使用任何的掃描器動作,它會減慢全部的掃描器匹配。此外, 「拒絕」不能用「-Cf」或「-CF」選項

+0

感謝您的幫助,我會嘗試爲了弄清楚如何讓它工作,具有拒絕循環的代碼應該放在我的lex的定義,規則或用戶代碼部分上? – 2013-04-23 08:13:59

+0

好吧,我做了它的工作,btw聲明我在循環之外,以避免「'爲'循環初始聲明使用外部C99模式」錯誤, 它適用於AAC使它A,A,C,但不適用於CAA ...它認爲它是CAA,它不是三角形的有效名稱...... – 2013-04-23 10:36:10

0

我已經這樣做了

names [A-E]{4}|[A-E]{3}|[A-E] 
%% 

{names} {int i; for (i = 0; i < yyleng-1; i++) { 
           if (strchr(yytext+i+1, *yytext)) { 
            /* duplicate letter in string */ 
            REJECT; } } 
          return printf(" %s :VALID NAME \n", yytext); } 
[A-Z]+     { return printf(" %s :INVALID NAME\n", yytext); } 

使用,但它僅適用於重複的字母是在開始的 表達

前 ABA:無效 ABCD:有效 ABCA:無效

BUT

ABBA:有效(應爲無效) ACBC:有效(應爲無效)

我必須找到一種方法,使我適用於所有情況