处理需要使用 flex 和 bison 来检查给定字符串是否为某种语言的作业。这只有在看到基本示例之后才会出现,其中使用 flex 基本上吐出读入的内容。
例如,格式为 {a^nb^nc^n} 且 n > 0 的字符串将在该语言中。所以字符串 aabbcc 是有效的。
flex 有没有办法计算读取的特定字符?例如,如果给定字符串 aaabbbcc,它将计算 3 个 a、3 个 b 和 3 个 c?或者我应该简单地使用 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");
}
;