了解 lex 代码语法
Understanding lex code syntax
在下面的 lex 代码中,我不明白尖括号的用法,. {DEFINITION} 语法是如何工作的?
%{
#include<stdio.h>
int c=0;
%}
START "/*"
END "*/"
SIMPLE [^*]
SPACE [ \t\n]
COMPLEX "*"[^/]
%s newstate
%%
"//"(.*[ \t]*.*)*[\n]+ {c++; fprintf(yyout," ");}
{START} {yymore();BEGIN newstate;}
<newstate>{SIMPLE} {yymore();BEGIN newstate;}
<newstate>{COMPLEX} {yymore();BEGIN newstate;}
<newstate>{SPACE} {yymore();BEGIN newstate;}
<newstate>{END} {c++;fprintf(yyout," ");BEGIN 0;}
%%
main()
{//program to remove comment lines
yyin=fopen("file4","r");
yyout=fopen("fileout4","w");system("cat file4");
yylex();system("cat fileout4");
printf("no.of comments=%d",c);
fclose(yyin);
fclose(yyout);
}
`
通过这个“%s newstate”,您声明了一个开始条件名称,在您的例子中,名称是 "newstate";您可以使用 %s 、%S 或 %Start 来声明开始条件。
可以在带有 <> 括号的规则头部引用条件。
例如:引用 newstate 作为第一条规则的开始条件:
<newstate> {SIMPLE} { yymore(); BEGIN newstate; }
只有当 Lex 处于名为 "newstate" 的开始条件时,您的上述规则才会被识别。您正在通过执行操作语句
进入此启动条件
BEGIN newstate;
让我给你一个示例来理解它的用法:
在这个例子中,我将使用三个开始条件,每个条件代表一些东西,AN= animals,PT=Planets 和 BR=Birds。
这个 flex 示例将帮助您判断您输入的名称后跟 "is?" 属于哪个类别。我们分为三类:动物、行星和鸟类。 (为简单起见,我只处理猴子、马、木星和天鹅)。
%{
#include<stdio.h>
%}
%START AN PT BR
%%
^monkey {ECHO; BEGIN AN;}
^horse {ECHO; BEGIN AN;}
^Jupiter {ECHO; BEGIN PT ;}
^swan {ECHO; BEGIN BR;}
\n {ECHO; BEGIN 0;}
<AN>is? printf(" is an Animal.!");
<PT>is? printf(" is a Planet in our solar system.!");
<BR>is? printf(" is a Bird.!");
. ;
%%
main()
{
yylex();
}
对于以下输入,我们将根据前缀替换 "is ?":
input -> monkey is ?
output -> monkey is an Animal.!
这里我们要替换“是?”与“是一个动物。!”通过将词法分析器重定向到 "AN" 开始条件,因此关联的规则“is?printf("is an Animal.!");”将被执行。
input -> swan is ?
output -> swan is Bird.!
这里我们要替换“是?”与“是一只鸟。!”通过将词法分析器重定向到 "BR" 开始条件,因此关联规则“is?printf("is a Bird.!");”将被执行。
input -> horse is ?
output -> horse is an Animal.!
这里我们要替换“是?”与“是一个动物。!”通过将词法分析器重定向到 "AN" 开始条件,因此关联的规则“is?printf("is an Animal.!");”将被执行。
input -> Jupiter is ?
output -> Jupiter is a Planet in our solar system.!
这里我们要替换“是?”与“是我们太阳系中的一颗行星。!”通过将词法分析器重定向到 "PT" 开始条件,因此关联规则“is?printf("is a Planet in our solar system.!");”将被执行。
所以在这个例子中你看到我们正在替换“是?”基于前缀。如果前缀是 Jupiter,我们回显 "Jupiter" 并将词法分析器重定向到 "PT" 开始条件,因此将执行关联的规则。
我希望这能帮助你理解,如果你对解释有任何疑问,请告诉我!
在下面的 lex 代码中,我不明白尖括号的用法,.
%{
#include<stdio.h>
int c=0;
%}
START "/*"
END "*/"
SIMPLE [^*]
SPACE [ \t\n]
COMPLEX "*"[^/]
%s newstate
%%
"//"(.*[ \t]*.*)*[\n]+ {c++; fprintf(yyout," ");}
{START} {yymore();BEGIN newstate;}
<newstate>{SIMPLE} {yymore();BEGIN newstate;}
<newstate>{COMPLEX} {yymore();BEGIN newstate;}
<newstate>{SPACE} {yymore();BEGIN newstate;}
<newstate>{END} {c++;fprintf(yyout," ");BEGIN 0;}
%%
main()
{//program to remove comment lines
yyin=fopen("file4","r");
yyout=fopen("fileout4","w");system("cat file4");
yylex();system("cat fileout4");
printf("no.of comments=%d",c);
fclose(yyin);
fclose(yyout);
}
`
通过这个“%s newstate”,您声明了一个开始条件名称,在您的例子中,名称是 "newstate";您可以使用 %s 、%S 或 %Start 来声明开始条件。
可以在带有 <> 括号的规则头部引用条件。
例如:引用 newstate 作为第一条规则的开始条件:
<newstate> {SIMPLE} { yymore(); BEGIN newstate; }
只有当 Lex 处于名为 "newstate" 的开始条件时,您的上述规则才会被识别。您正在通过执行操作语句
进入此启动条件 BEGIN newstate;
让我给你一个示例来理解它的用法: 在这个例子中,我将使用三个开始条件,每个条件代表一些东西,AN= animals,PT=Planets 和 BR=Birds。
这个 flex 示例将帮助您判断您输入的名称后跟 "is?" 属于哪个类别。我们分为三类:动物、行星和鸟类。 (为简单起见,我只处理猴子、马、木星和天鹅)。
%{
#include<stdio.h>
%}
%START AN PT BR
%%
^monkey {ECHO; BEGIN AN;}
^horse {ECHO; BEGIN AN;}
^Jupiter {ECHO; BEGIN PT ;}
^swan {ECHO; BEGIN BR;}
\n {ECHO; BEGIN 0;}
<AN>is? printf(" is an Animal.!");
<PT>is? printf(" is a Planet in our solar system.!");
<BR>is? printf(" is a Bird.!");
. ;
%%
main()
{
yylex();
}
对于以下输入,我们将根据前缀替换 "is ?":
input -> monkey is ?
output -> monkey is an Animal.!
这里我们要替换“是?”与“是一个动物。!”通过将词法分析器重定向到 "AN" 开始条件,因此关联的规则“is?printf("is an Animal.!");”将被执行。
input -> swan is ?
output -> swan is Bird.!
这里我们要替换“是?”与“是一只鸟。!”通过将词法分析器重定向到 "BR" 开始条件,因此关联规则“is?printf("is a Bird.!");”将被执行。
input -> horse is ?
output -> horse is an Animal.!
这里我们要替换“是?”与“是一个动物。!”通过将词法分析器重定向到 "AN" 开始条件,因此关联的规则“is?printf("is an Animal.!");”将被执行。
input -> Jupiter is ?
output -> Jupiter is a Planet in our solar system.!
这里我们要替换“是?”与“是我们太阳系中的一颗行星。!”通过将词法分析器重定向到 "PT" 开始条件,因此关联规则“is?printf("is a Planet in our solar system.!");”将被执行。
所以在这个例子中你看到我们正在替换“是?”基于前缀。如果前缀是 Jupiter,我们回显 "Jupiter" 并将词法分析器重定向到 "PT" 开始条件,因此将执行关联的规则。
我希望这能帮助你理解,如果你对解释有任何疑问,请告诉我!