2012 华为编程大赛 语法分析

  • 问题描述:

编译器通过语法分析来检测程序的一些语法问题。要求实现一个简单的语法分析程序,判断输入的字符串是否有符合要求的语法组合。

需要判断的语法组合有:

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;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值