2016-10-07 9 views
1

最近私はlexの学習を始め、いくつかの例を試しました。 私は 'a'で始まり、数字と1D配列の数で終わる変数の数を数えようとしています。lex/flexの配列変数を数えよう

%{ 
#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(); 
} 

Iは、(1)変数の数「A」で始まり、数字で終わると(2)1Dアレイの数をカウントしようとしています。入力は "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]; 

} 

、どのように私は、カテゴリの両方に該当し、これらの変数を数えるのですか?

答えて

2

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); 
} 

utput

111 char a123 
222 int ab[5] 
222 int bc[2] 
222 int ca[7] 
222 int ds[4] 
1 4 
関連する問題