english grammer system
根据提供的文件信息,我们可以推断出这是一篇与英语语法检查相关的程序代码分析。尽管标题为 "English Grammar System" 并且描述为 "程序和词性",但是具体的内容涉及到了一个C++程序,该程序旨在对英语句子进行语法错误检测。下面我们将详细解释这个程序中的关键知识点。 ### 一、程序结构 该程序使用了多个标准库,包括 `<iostream>`(用于输入输出操作)、`<fstream>`(用于文件读写操作)、`<sstream>`(用于字符串流处理)、`<string>`(用于字符串操作)和 `<vector>`(用于动态数组)。这些库在C++编程中非常常见,可以方便地实现各种功能。 ### 二、函数定义 #### 1. `evaluate(string line)` 此函数接收一个字符串参数 `line`,并返回一个整数,表示语法错误的数量。该函数首先初始化了一些变量来记录特定类型的错误数量,并检查输入行是否为空。如果输入行为空,则输出一条消息并退出函数。接下来,函数调用 `sepString()` 函数将输入行分割成一系列子字符串,并存储在一个名为 `abstract` 的向量中。 #### 2. `sepString(string str)` 这是一个未给出具体实现细节的函数,其功能是将输入的字符串 `str` 分割成多个子字符串,并返回一个包含这些子字符串的向量。可以推测,此函数可能是通过识别特定的分隔符(如空格或括号等)来进行字符串分割的。 #### 3. `countWrong(vector<string>& abstract, int pos, int loc)` 此函数用于计算在特定位置 `pos` 和 `loc` 处出现的错误数量。具体的错误类型没有详细说明,但根据上下文推测,可能是与名词短语(NP)相关的错误。 #### 4. `findMaxNP(vector<string>& abstract, int pos)` 该函数用于查找最大的名词短语(NP)的位置。具体实现细节未知,但可以根据名称推测,它可能是在传入的向量 `abstract` 中寻找最长的连续的 `(NP)` 标记序列。 ### 三、错误检测逻辑 1. **情态动词后跟非行为动词**:程序检查情态动词(如 "can" 或 "may")后面是否紧跟非行为动词或副词。如果在情态动词后面跟的是其他类型的词,则标记为错误。 2. **行为动词使用错误**:程序还检查 `(VBZ)` 和 `(VBP)` 标签的行为动词使用情况。当这些标签出现在不合适的名词短语前时,会被视为错误。 3. **冠词使用错误**:程序还会检查冠词 `(DT)` 的使用情况,确保它们被正确放置在名词短语前。 ### 四、错误计数 - `canWrong`:记录情态动词 "can" 后面使用错误的情况。 - `VBZWrong` 和 `VBPWrong`:记录行为动词 `(VBZ)` 和 `(VBP)` 使用错误的情况。 - `articleWrong`:记录冠词使用错误的情况。 ### 五、总结 这个程序通过对输入的英语句子进行语法分析,检查特定类型的语法错误。通过使用C++的各种标准库,程序能够有效地处理文本数据,并执行复杂的语法检查任务。虽然提供的代码片段不完整,但从现有的信息可以看出,这是一套较为复杂且功能强大的英语语法检查系统的一部分。
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
//function declaration
int evaluate(string line);
vector<string> sepString(string str);
int countWrong(vector<string> &abstract,int pos,int loc);
int findMaxNP(vector <string> &abstract,int pos);
int evaluate(string line)
{
int num = 0;
//string line;
vector <string> abstract;
int k = 4;//for can may ?
int M=0; //for may can ?
int canWrong = 0;
int VBZWrong = 0;
int VBPWrong = 0;
int articleWrong = 0;
int VBZ = 0;
int VBP = 0;
int article = 0;//record num of the whole abstract记录全部抽象数
num++;
if(line == "")
{
cout<<"句子为空"<<endl;
//continue;
}
// outFile<<"wrong of the abstract number:"<<num<<endl;
abstract = sepString(line);//调用向量函数
for(int i = 0; i < abstract.size();i++)
{
M = 0;//init
if(abstract[i] =="(VBZ"){VBZ++;}
if(abstract[i] =="(VBP"){VBP++;}
if(abstract[i] =="(DT"){article++;}
if(abstract[i] == "can)" || abstract[i] == "may)")//用规则判断类拟的情态动情后面是否是原型
{
for(int j = 1;j < k;j++)
{
if(i+j < abstract.size())
{
if(abstract[i+j] != "(VB" && abstract[i+j] != "(RB")
{
M++;
}
else
{
break;
}
}
剩余13页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助