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

时间:2013-04-22 22:40:33

标签: lex flex-lexer

我有表达式

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

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

BUT

我想更改表达式,以便用户CANT输入具有相同字母2次的名称,此类AAC或ABAE的名称不应是trianlge或矩形的有效名称。

我已经看到了这类问题here的正则表达式解决方案,但是无法看到我如何在flex上做到这一点,并且无法找到解决这个问题的方法来解决这个问题。任何帮助/指南都会有所帮助。

感谢

2 个答案:

答案 0 :(得分: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'在扫描仪性能方面是一项特别昂贵的功能;    如果它用于扫描仪操作的任何中    将减慢扫描仪匹配的所有。此外,    'REJECT'不能与'-Cf'或'-CF'选项一起使用

答案 1 :(得分: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:有效(应该无效)

我必须找到一种让我适应各种情况的方法