ase operand of '->' has non-pointer type 'Servo'
时间: 2024-01-25 15:02:24 浏览: 131
这个错误提示是因为你在使用 `->` 运算符时,操作数的类型不是指针类型。通常情况下,`->` 运算符用于通过指针访问对象的成员。
根据错误提示,`Servo0` 的类型不是指针类型,而是 `Servo` 类型。所以你应该使用点号 `.` 来访问对象的成员,而不是箭头运算符 `->`。请修改代码如下:
```cpp
Servo0.writeServo(Servo0.readDegrees() + 5);
```
这样就可以正确地调用 `Servo0` 对象的成员函数和成员变量了。
相关问题
现有文法如下:S->aSe S->B B->bBe B->C C->cCc C->d 写出该文法的递归下降语法分析程序,要求现场输入符号串,c++能判断语法是否正确
在C++中编写一个简单的递归下降解析器来处理这个文法,我们将创建一个解析函数对应每个非终结符,并检查用户输入的符号串是否符合规则。以下是基本的解析程序:
```cpp
#include <iostream>
#include <string>
// 定义符号表
enum NonTerminal {
S,
B,
C
};
std::string terminals[] = {"a", "b", "c", "d"};
// 解析函数
bool parse(const std::string& input) {
// 函数定义
bool parse_S();
bool parse_B();
bool parse_C();
// 输入处理
if (input.empty()) return false; // 输入不能为空
// 根据输入的第一个字符尝试启动解析
switch (input[0]) {
case 'a':
return parse_S(input.substr(1));
case 'b':
return parse_B(input.substr(1));
case 'c':
case 'd':
return parse_C(input);
}
return false; // 输入的第一个字符不属于任何非终结符
}
// 递归实现
bool parse_S(const std::string& input) {
if (input == "") return true;
if (input.substr(0, 2) == "ae" || input == "B") return parse(input.substr(1));
return false;
}
bool parse_B(const std::string& input) {
if (input == "be" || input == "C") return parse(input.substr(1));
return false;
}
bool parse_C(const std::string& input) {
if (input == "ccc" || input == "d") return true;
return false;
}
int main() {
std::string user_input;
std::cout << "请输入符号串: ";
std::cin >> user_input;
if (parse(user_input)) {
std::cout << "输入的文法有效。\n";
} else {
std::cout << "输入的文法无效。\n";
}
return 0;
}
S->aSe S->B B->bBe B->C C->cCc C->d 写出该文法的递归下降语法分析程序,要求现场输入一个符号串,能检查出该符号串的合法性,c++
这个文法看起来像是用于描述一些简单的结构,比如"SaB", "ScC", 或者 "Sd"这样的形式。这是一个有限状态自动机(Finite State Automaton,FSA)的简化版,通常用于语言处理。要编写一个简单的递归下降解析器(Recursive Descent Parser),我们需要创建函数来处理每种可能的状态转移。
首先,我们可以将文法规则转换为函数定义。这里是一个基础的C++实现,它仅处理单个字符作为输入:
```cpp
#include <iostream>
#include <string>
bool is_a(char c) { return (c == 'a'); }
bool is_b(char c) { return (c >= 'b' && c <= 'e'); }
bool is_c(char c) { return (c >= 'c' && c <= 'c') || c == 'd'; }
void start(char c) {
if (is_a(c)) {
std::cout << "Start: A\n";
} else if (is_b(c)) {
process_B(c);
} else {
std::cerr << "Invalid input: Unexpected symbol\n";
exit(1);
}
}
void process_B(char c) {
if (is_b(c) || is_c(c)) {
std::cout << "Processing B/C: " << c << "\n";
} else {
std::cerr << "Invalid input: Expected b or c\n";
exit(1);
}
}
int main() {
std::string input;
std::cout << "Enter a string to parse: ";
getline(std::cin, input);
for (char c : input) {
start(c);
}
return 0;
}
```
这个程序会读取用户输入的一个字符序列,并尝试根据给定的文法规则进行匹配。如果输入不合法(例如,遇到非'a', 'b', 'c',或'd'的字符),程序会打印错误消息并退出。
请注意,这只是一个非常基础的例子,实际的递归下降解析器会更复杂,需要处理整个词法分析和语法分析的过程。此外,上述代码没有包含结束标记,这意味着它只能处理单个单词或短语。若需处理完整句子或文件,则需要添加额外的逻辑来处理边界情况。
阅读全文