次のlexコードでは、山括弧の使用を理解していません。 < newstate> {DEFINITION}構文はどのように機能しますか?lex codeの構文を理解する
%{
#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);
}
`
有限状態機械のオートマトン理論について知っているかどうかは分かりません。この場合、答えは簡単です。BEGINは、通常の状態遷移のように特定の状態を設定します。角括弧構文は "現在の状態がこの状態であるときこれらを認識する"を意味します。初期状態は0なので、 'BEGIN 0'に戻ります。 https://stackoverflow.com/q/15540944/1256452も参照してください。 – torek