2013-04-22 85 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:有效(应为无效)

我必须找到一种方法,使我适用于所有情况