不是学校相关的问题,但它出现在Dragon Book(编译器:原理,技术和工具)中的一个练习中:
语法:
S ::= aSa | 啊
生成除空字符串外的所有偶数长度字符串。
a) 构造一个带有回溯的递归下降解析器,用于在 aa 之前尝试替代 aSa 的语法。证明 S 的过程在 2、4 或 8 个 a 上成功,但在 6 个 a 上失败。b) 你的解析器能识别什么语言?
我难住了。似乎如果 4 个 a 被识别为 S,并且一个 S 之间的两个 a 被识别,那么 6 个 a 应该被识别。我尝试在 C 中实现解析器,但这个解析器也可以识别所有偶数的 a。识别 6 a 并不是失败。这个练习的目的是什么?
/* A C implementation of Exercise 4.13 in the Dragon Book */
/* The grammar:
S ::= aSa | aa
*/
/* Construct a recursive-descent parser with backtracking for this grammar
that tries the alternative aSa before aa. Show that the procedure for S
succeeds on 2, 4, or 8 a's, but fails on 6 a's.
*/
#include <string.h>
#include <stdio.h>
int S(const char *str, int start, int end);
int aSa(const char *str, int start, int end);
int aa(const char *str, int start, int end);
/* returns 1 if a match, 0 otherwise */
int S(const char *str, int start, int end)
{
if(aSa(str, start, end))
return 1;
else
if(aa(str, start, end))
return 1;
return 0;
}
/* returns 1 if a match, 0 otherwise */
int aSa(const char *str, int start, int end)
{
int len = end - start;
if (len < 3)
return 0;
if(str[0] != 'a')
return 0;
if (!S(str, start+1, end-1))
return 0;
if(str[len-1] != 'a')
return 0;
return 1;
}
/* returns 1 if a match, 0 otherwise */
int aa(const char *str, int start, int end)
{
int len = end - start;
if(len != 2)
return 0;
if(str[0] == str[1] && str[0] == 'a')
return 1;
return 0;
}
int main()
{
char str[20];
printf("Enter a string: \n");
scanf("%s", str);
int match = S(str, 0, strlen(str));
if(match)
printf("The string %s matches\n", str);
else
printf("The string %s does not match\n", str);
return 0;
}