- 问题描述:
编译器通过语法分析来检测程序的一些语法问题。要求实现一个简单的语法分析程序,判断输入的字符串是否有符合要求的语法组合。
需要判断的语法组合有:
if then
if ( ) then
switch case end
switch ( ) case end
switch ( ) case default end
do while
- 要求实现函数:
void analysis(char *str,int *num)
【输入】 char *str,待分析字符串
【输出】 int num,匹配的组合个数
【返回】 无
注:输入字符串中关键字以空格隔开,"if"、"("、")"、"case"等均表示关键字,从左向右,找到匹配的组合即可,组合一定是相互分离,不会嵌套,不会有交叉情况出现。
- 示例
1) 输入:str = if then,
输出:num = 1
2) 输入:str = switch case aaa ,
输出:num = 0
3) 输入:str = if ( aaa ) then dobbb while switch cas ,
输出:num = 2
问题分析:
由于输入的关键字不会嵌套,所以可以一次匹配每个单词。 如果一个单词匹配了if 只要寻找 then 就行了,不用考虑中间的括号。对于switch ( ) case default end 只要考虑switch case end就行。
void analysis(char *str,int *num)
{
int mycompare(char *first, char *second, const char *str);
char *find(char *second, const char *str);
char *first;
char *second;
first = second = str;
*num = 0;
while(*second != '\0')
{
while(*second != ' '&& *second != '\0')
second++;
if(mycompare(first, second, "if"))
{
second++;
if(second = find(second, "then"))
{
*num+= 1;
}
else
return;
}
else if(mycompare(first, second, "switch"))
{
second++;
if(second = find(second, "case"))
{
if(second = find(second, "end"))
*num+=1;
else
return;
}
else
return;
}
else if(mycompare(first, second, "do"))
{
second++;
if(second = find(second, "while"))
*num += 1;
else
return;
}
else
{
second++;
first = second;
}
}
}
int mycompare(char *first, char *second, const char *str)
{
while(first < second && *first == *str)
{
first++;
str++;
}
return (first == second && *str == '\0') ? 1 : 0;
}
char *find(char *temp, const char *str)
{
const char *first;
char *second;
second = temp;
first = str;
while(*second != '\0')
{
while(*second != ' ' && *second != '\0' && *str == *second)
{
str++;
second++;
}
if((*second == ' ' || *second == '\0') && *str == '\0')//找到了这个单词
return second;
else
{
while(*second != ' ' && *second != '\0')//没有找到 寻找下一个单词
second++;
}
str = first;
if(*second == ' ')
second++;
}
return NULL;
}