lex/flex 中的计数变量、数组
Counting variables, arrays in lex/flex
最近开始学习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];
}
此外,如何计算同时属于这两个类别的那些变量?
您 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
最近开始学习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];
}
此外,如何计算同时属于这两个类别的那些变量?
您 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