繁体   English   中英

Flex/Lex:正则表达式匹配双字符

[英]Flex/Lex: Regular Expression matches double characters

我有一个用 C++ 编写的 flex 程序,需要完成以下规则:

我希望 yytext 接受以下内容:
○ 零个或以下字符之一 ABCDEFGH

例如 - 输入:
“三角形 ABC”是一个有效的形状,我希望程序打印“有效的形状”
“三角形 AAC”不是一个有效的形状,因为它包含一个双 A,我希望程序在这种情况下不打印任何内容
“三角形 ABCD”不是一个有效的形状,因为它包含四个字母,我希望程序在这种情况下也不打印任何内容。

下面的代码以及到目前为止我尝试过的正则表达式:

%{
    /** Methods and Variables initialization **/
   
%}

corner corner" "[A-H]
line line" "[A-H]{2}
triangle triangle" "[A-H]{3}
square rectangle" "[A-H]{4}
poly pentagon" "[A-H]{5}
hexa hexagon" "[A-H]{6}
hepta heptagon" "[A-H]{7}
octa octagon" "[A-H]{8}

/** Below is the rule section -- yytext is the matched string returned to the program **/
%%
{corner} 
{line} |
{triangle} |  
{square}  |
{poly} |
{hexa} |
{hepta} | 
{octa} {   
     printf("Valid shape: %s", yytext);
}
.
%%

int main() {
    yylex();    
    return 0;
}

// yywrap() - wraps the above rule section 
int yywrap(void)
{
   return 1;
}


当前输入:
三角形AAC
当前output:
有效形状:三角形 AAC(我们不想要那个)

当前输入:
三角形 AB
当前output:
有效形状:三角形 ABC

这不是您通常使用 (f)lex 解决的那种问题,因为基本词法分析是微不足道的(可以通过在空格处简单地拆分行来完成)并且详细的错误分析有点超出 (f )lex 的舒适区,特别是因为无法使用正则表达式匹配“包含两次相同字符的字符串”。

尽管如此,正如您的一位同学提出的问题所示,可以通过利用扫描仪的订购规则使用 (f)lex 来完成:

  1. 始终使用最长的匹配。
  2. 如果两个或多个规则符合条件,请选择第一个。

这并没有解决重复字符的问题。 解决这个问题的唯一方法是列举所有可能性,在这种情况下有八种可能性。 比链接问题中提出的更简单的方法是[AH]*A[AH]*A[AH]*|[AH]*B[AH]*B[AH]*|[AH]*C[AH]*C[AH]*...

这让您可以创建一组有序的规则,如下所示:

  1. 匹配具有重复字符的行
  2. 匹配包含太多字符的行
  3. 匹配具有完全正确数量的字符的行
  4. 其他任何事情都是错误。 (字符太少、形状名称无效、字母无效等)

所以这可能包括这个(省略两个宏的定义,这很简单但很乏味):

  /* 1. Dups */
[a-z]+\ {dups}$  { err("Duplicate letter"); }
  /* 2. Too long */
{valid}[A-H]+$   { err("Too long"); }
  /* 3. Just right */
{valid}$         { printf("Valid: %s\n", yytext); }
  /* 4. Anything else */
.+               { err("Too short or invalid character"); }
  /* Ignore newlines */
\n               ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM