Flex词法分析器不重复一组字符



我有一个表达式

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

用于识别角(A,B,C,D,E)或三角形(ABC,BCD)等或矩形(ABCD,EDCB)等的名称

,

我想改变表达式,以便用户不能输入具有相同字母的名称2次,名称如AAC或ABAE不应该是三角形或矩形的有效名称。

我在这里看到了这类问题的正则表达式解决方案,但不知道如何在flex上做到这一点,也找不到在flex手册模式上解决这个问题的方法。任何帮助/指南都会有帮助的。

谢谢

在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'在扫描器性能方面是一个特别昂贵的特性;如果在中使用任何的扫描器的动作,它将减慢所有扫描器的匹配。此外,'REJECT'不能与'-Cf'或'-Cf'选项一起使用

我已经这样做了

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 NAMEn", yytext ); }

但是它只适用于开头的重复字母表达式

交货阿坝:无效ABCD:有效ABCA:无效的

,

ABBA:valid(应该是无效的)ACBC:有效(应该无效)

我必须找到一种方法让我在任何情况下都能工作

最新更新