特定の文字列が言語に含まれているかどうかを確認するために flex と bison を使用する必要がある課題に取り組んでいます。これは、読み込まれたものを基本的に吐き出すために flex が使用された基本的な例を見た後にのみ発生します。
たとえば、{a^nb^nc^n} 形式で n > 0 の文字列は言語に含まれます。したがって、文字列 aabbcc は有効です。
フレックスが読み取った特定の文字をカウントする方法はありますか? 例として、文字列 aaabbbcc が指定されている場合、a が 3 つ、b が 3 つ、c が 3 つカウントされますか? または、単純に flex を使用して入力文字列が適切な形式であることを確認し、bison で文法規則を使用して言語であるかどうかを確認する必要がありますか?
編集
私はしばらくそれに取り組んできましたが、半作業バージョンがあるようです。私が現在直面している問題は、yyparse() が終了しないように見え、無効な文字列が指定されると構文エラーが発生することです。例として:
文字列「aabbcc」は、L2 と呼んでいるものにあるはずです。次の出力が得られます。
grammar recognizer result:
L2 recognized
その後、停止し、完了しません。さらに、文字列「hjnkll」は認識されないはずですが、そのようなものを入力すると構文エラーが発生するだけです。
フレックス
...
A [a]*
B [b]*
C [c]*
D [d]*
E [e]*
Z [^a-e\n][.]*
%%
{A} {a = yyleng;} return A;
{B} {b = yyleng;} return B;
{C} {c = yyleng;} return C;
{D} {d = yyleng;} return D;
{E} {e = yyleng;} return E;
{Z} {z = yyleng;} return Z;
\n return NL;
%%
バイソン スニペット
%token A
%token B
%token C
%token D
%token E
%token Z
%token NL
%%
/*grammer rules*/
transunit: L1 | L2 | L5 | L6
{
printf("\n*****Congratulations; Parse Successful*****\n");
}
;
L2: A B C NL
{
/*Language 2 : L(G2) = {a^nb^nc^n} with n > 0*/
if(a==b && b==c && d==0 && e==0 && a!=0 && z==0){
printf("\nLG2 recognized\n");
} else {
printf("\nSorry language not recognized\n");
}
}
;
/*None of the above : not recognized*/
L6: Z NL
{
printf("\nSorry language not recognized\n");
}
;