模拟词法分析的过程,编写一个程序,用于统计文件中单词的总数

上机题:

模拟词法分析的过程,编写一个程序,用于统计文件中单词的总数,不同单词的数目。(假设输入文件中只包含字母和空格)

eg: I love Dalian and I love DLUT

单词总数:7

不同单词数目:5

#include <stdio.h>
#include <iostream>
#include <string.h>

int main()
{
	using namespace std;
	string sentence;//输入的字符串
	cout << "Please input the sentence:";
	getline(cin,sentence);
	int countlen = sentence.length();//字符串的长度
	int countchar = 1;//统计有多少个空格,+1即单词数量
	for (int i = 1; i <= countlen; i++) {
		if (sentence[i] == ' ' && sentence[i - 1] != ' ') {
			countchar++;
		}
	}
	cout << "单词总数:" << countchar<<endl;
	char sentencechar[20][20];//句子拆成单词
	int i = 0;//句子长度下标
	int j = 0;//单词下标
	int k = 0;//单词中字母下标
	while ( i <= countlen-1) {
		if (sentence[i] != ' ') {
			sentencechar[j][k] = sentence[i];
			k++;
			i++;
		}
		else if(sentence[i] == ' ') {
			sentencechar[j][k] = '\0';
			k = 0;
			j++;
			i++;
		}
	}
	int countcom[20] = {0};//统计相同单词数量
	int com = 0;
	//检查相同单词
	for (int m = 0; m <= j-1; m++) {
		for (int n = m + 1; n <= j; n++) {
			if (strcmp(sentencechar[m], sentencechar[n]) == 0) {
				countcom[com]++;
				com++;
			}
		}
	}
	int countdiffer = countchar;//不同单词=总词数-相同单词出现次数+1
	for (int m = 0; m < com; m++) {
		countdiffer = countdiffer - countcom[m];
	}
	cout << "不同单词数目:" << countdiffer;
	return 0;
}
完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析。 PL/0语言文法的EBNF描述: 〈程序〉∷= 〈分程序〉。 〈分程序〉∷= [〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈常量说明部分〉∷= CONST〈常量定义〉{。〈常量定义〉}; 〈常量定义〉∷= 〈标志符〉=〈无符号整〉 〈无符号整〉∷= 〈字〉{〈字〉} 〈变量说明部分〉∷= VAR〈标志符〉{,〈标志符〉}; 〈标志符〉∷= 〈字母〉{〈字母〉|〈字〉} 〈过程说明部分〉∷= 〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷= PROCEDURE〈标志符〉; 〈语句〉∷= 〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷= 〈标志符〉:=〈表达式〉 〈复合语句〉∷= BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷= 〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ 〈关系运算符〉∷= =|#|<|>|<=|>= 〈条件语句〉∷= IF〈条件〉THEN〈语句〉 〈过程调用语句〉∷= CALL〈标志符〉 〈当型循环语句〉∷= WHILE〈条件〉DO〈语句〉 〈读语句〉∷= READ‘(’〈标志符〉{,〈标志符〉}‘)’ 〈写语句〉∷= WRITE‘(’〈表达式〉{,〈表达式〉}‘)’ 〈字母〉∷= a|b|…..|X|Y|Z 〈字〉∷= 0|1|2|…..|8|9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值