【问题标题】:Counting variables, arrays in lex/flex在 lex/flex 中计算变量、数组
【发布时间】:2016-10-07 01:26:56
【问题描述】:

我最近开始学习 lex 并尝试了一些示例。 我正在尝试计算以“a”开头并以数字结尾的变量数量以及一维数组的数量。

%{
#undef yywrap
#define yywrap() 1
#include<stdio.h>
int count1;
int count2;
%}
%option noyywrap
%%

int|char|bool|float" "a[a-z,A-Z,0-9]*[0-9] {count1++;}
int|char|float|bool" "[a-z,A-Z]+[0-9,a-z,A-Z]*"["[0-9]+"]" {count2++;}

%%

void main(int argc,char** argv){
FILE *fh;
    if (argc == 2 && (fh = fopen(argv[1], "r")))
        yyin = fh;
printf("%d %d",count1,count2);
yylex();
}

我正在尝试计算 (1) 以“a”开头并以数字结尾的变量数量和 (2) 一维数组的数量。输入来自“f.c”文件。

//f.c

#include<stdio.h>
void main(){
    char a;
    char b;
    char c;
    int ab[5];
    int bc[2];
    int ca[7];
    int ds[4];

}

两个计数都显示为零,输出为:

0 0#include<stdio.h>
void main(){
         a;
         b;
         c;
         ab[5];
         bc[2];
         ca[7];
         ds[4];

}

另外,我如何计算同时属于这两个类别的变量?

【问题讨论】:

    标签: c arrays flex-lexer lex


    【解决方案1】:

    您的main 中的订单有误。您还可以使用宏使长正则表达式更具可读性。

    %{
    #undef yywrap
    #define yywrap() 1
    #include<stdio.h>
      int count1 = 0;
      int count2 = 0;
    %}
    TYPE int|char|bool|float
    DIGIT [0-9]
    ID [a-z][a-z0-9A-Z]*
    SPACE " "
    %option noyywrap
    
    %%
    
    {TYPE}{SPACE}a[a-z0-9A-Z]*{DIGIT}  {
                                         printf("111 %s\n",yytext);
                                         count1++;
                                       }
    {TYPE}{SPACE}{ID}"["{DIGIT}+"]"      {
                                         printf("222 %s\n",yytext);
                                         count2++;
                                       }
    %%
    void main(int argc, char **argv)
    {
      FILE *fh;
      if (argc == 2 && (fh = fopen(argv[1], "r"))) {
        yyin = fh;
      }
      yylex();
      printf("%d %d\n", count1, count2);
    }
    

    使用文件运行

    //f.c
    
    #include<stdio.h>
    void main(){
        char a123;
        char a;
        char b123;
        char c;
        int ab[5];
        int bc[2];
        int ca[7];
        int ds[4];
    
    }
    

    输出结果

    //f.c
    
    #include<stdio.h>
    void main(){
        111 char a123
    ;
        char a;
        char b123;
        char c;
        222 int ab[5]
    ;
        222 int bc[2]
    ;
        222 int ca[7]
    ;
        222 int ds[4]
    ;
    
    }
    1 4
    

    如果您想将输出限制为仅标记,则需要额外处理换行符,所以

    %{
    #undef yywrap
    #define yywrap() 1
    #include<stdio.h>
      int count1 = 0;
      int count2 = 0;
    %}
    TYPE int|char|bool|float
    DIGIT [0-9]
    ID [a-z][a-z0-9A-Z]*
    SPACE " "
    %option noyywrap
    
    %%
    
    {TYPE}{SPACE}a[a-z0-9A-Z]*{DIGIT}  {
                                         printf("111 %s\n",yytext);
                                         count1++;
                                       }
    {TYPE}{SPACE}{ID}"["{DIGIT}+"]"      {
                                         printf("222 %s\n",yytext);
                                         count2++;
                                       }
    .
    \n
    %%
    void main(int argc, char **argv)
    {
      FILE *fh;
      if (argc == 2 && (fh = fopen(argv[1], "r"))) {
        yyin = fh;
      }
      yylex();
      printf("%d %d\n", count1, count2);
    }
    

    输出结果

    111 char a123
    222 int ab[5]
    222 int bc[2]
    222 int ca[7]
    222 int ds[4]
    1 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多