void input() { cout << "请输入:"; char ch; while ((ch = getchar()) != '\n') { inputToken[tokenNumber].value = ch; if (ch == '(') inputToken[tokenNumber].tokenType = leftBracket; else if (ch == ')') inputToken[tokenNumber].tokenType = rightBracket; else if (ch == '+') inputToken[tokenNumber].tokenType = addop; else if (ch == '*') inputToken[tokenNumber].tokenType = mulop; else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) inputToken[tokenNumber].tokenType = id; else inputToken[tokenNumber].tokenType = undefine; tokenNumber++; } inputToken[tokenNumber++].tokenType = endInput; } TreeNode* E() { TreeNode* node = new TreeNode; node->flag = "E"; switch (inputToken[curPos].tokenType) { case id: case leftBracket: { TreeNode* tNode = node->firstChild = T(); if (error) return node; tNode = tNode->nextSibling = E1(); break; } default: node = errorNode(); error = true; break; } return node;这段代码是什么意思
时间: 2023-10-23 11:10:48 浏览: 71
这段代码是语法分析器中的一部分,实现了对表达式的E部分的语法分析。在这段代码中,input函数用于读取输入的表达式,并将其转换为词法单元序列,存储在inputToken数组中。
E函数是一个递归下降函数,用于对表达式的E部分进行语法分析。在该函数中,首先创建一个新的语法树节点,并将其标记为E。然后根据当前词法单元的类型进行分支处理。
如果当前词法单元的类型为id或leftBracket,则调用T函数进行语法分析,并将其设置为E节点的第一个子节点。如果T函数返回的节点存在错误,则直接返回E节点。
然后,继续调用E1函数进行语法分析,并将其设置为E节点的第二个子节点。注意,E1函数是用于处理左递归的情况的函数。
如果当前词法单元的类型不是id或leftBracket,则说明表达式不符合文法规则,返回一个错误节点,并将error标志设置为true。
最后,返回E节点。
相关问题
统计在输人字符串中各个不同字符出现的频度(字符串中的合法字符为A〜 Z这26个字母)。 请根据上面的描述,将程序补充完整, void Count() { for (i = 0; i<26; i++) num[i] = 0 ; //初始化 while ((ch= 第一空 ()) ! = '\0') //依次读人字符进行判断 if (‘A’<=ch&&ch<=’Z’) {i= 第二空 ; num[i] 第三空 ;} for(i=0;i<26;i++) //输出字母字符的个数 cout<<"字母字符"<< num [i] "<< endl; }
void Count() {
char ch;
int num[26] = {0}; // 初始化数组
while ((ch = getchar()) != '\n') { // 逐个读取字符
if ('A' <= ch && ch <= 'Z') { // 判断是否是字母字符
int i = ch - 'A'; // 计算字符在数组中的下标
num[i]++; // 对应字符的出现次数加1
}
}
for (int i = 0; i < 26; i++) { // 输出各个字母字符的出现次数
cout << "字母字符" << char(i + 'A') << "出现次数:" << num[i] << endl;
}
}
功能:编写函数void fun(char *str,char ch)从字符串str中删除指定的字符ch。 要求:本问题要求用两种算法分别实现,一是直接删除算法即查找符合删除条件的并逐次前移实现;二是间接删除算法即查找不符合删除条件的并保留下来,而保留的方法可以采用利用本数组和引入临时数组两种实现。 说明:该字符可能多次和连续出现,算法应全面考虑。要求有主函数。
直接删除算法:
```c++
#include <iostream>
#include <cstring>
using namespace std;
void fun(char *str, char ch) {
int len = strlen(str);
int i = 0, j = 0;
while (i < len) {
if (str[i] != ch) {
str[j++] = str[i];
}
i++;
}
str[j] = '\0';
}
int main() {
char str[100];
char ch;
cout << "请输入字符串:";
cin >> str;
cout << "请输入要删除的字符:";
cin >> ch;
fun(str, ch);
cout << "删除后的字符串为:" << str << endl;
return 0;
}
```
间接删除算法(利用本数组):
```c++
#include <iostream>
#include <cstring>
using namespace std;
void fun(char *str, char ch) {
int len = strlen(str);
int i = 0, j = 0;
while (i < len) {
if (str[i] != ch) {
str[j++] = str[i];
}
i++;
}
str[j] = '\0';
}
int main() {
char str[100];
char ch;
cout << "请输入字符串:";
cin >> str;
cout << "请输入要删除的字符:";
cin >> ch;
int len = strlen(str);
int i = 0, j = 0;
while (i < len) {
if (str[i] != ch) {
str[j++] = str[i];
}
i++;
}
str[j] = '\0';
cout << "删除后的字符串为:" << str << endl;
return 0;
}
```
间接删除算法(引入临时数组):
```c++
#include <iostream>
#include <cstring>
using namespace std;
void fun(char *str, char ch) {
int len = strlen(str);
char temp[100];
int i = 0, j = 0;
while (i < len) {
if (str[i] != ch) {
temp[j++] = str[i];
}
i++;
}
temp[j] = '\0';
strcpy(str, temp);
}
int main() {
char str[100];
char ch;
cout << "请输入字符串:";
cin >> str;
cout << "请输入要删除的字符:";
cin >> ch;
fun(str, ch);
cout << "删除后的字符串为:" << str << endl;
return 0;
}
```
阅读全文