用c++编写算符优先语法程序,输入一个符号串,判断是否是该文法所能推导出来的句子。并能输出分析过程文法G[S] S→a S→b S→(T) T→T,S T→S算符优先语法
时间: 2024-05-01 12:22:10 浏览: 192
语法分析 算符优先分析程序
5星 · 资源好评率100%
好的,我会给出一个简单的算符优先分析器的实现。假设文法为G[S],其中S→a、S→b、S→(T)、T→T,S和T→S。
首先,我们需要定义优先级表。这里我们使用一个2维数组来表示表格。表格的行和列分别表示运算符的优先级。如果第i行第j列的值为“<”,则表示第i个运算符的优先级低于第j个运算符的优先级;如果为“>”,则表示第i个运算符的优先级高于第j个运算符的优先级;如果为“=”,则表示这两个运算符的优先级相等。
```
char priority_table[6][6] = {
{'>', '>', '<', '<', '<', '>'},
{'>', '>', '<', '<', '<', '>'},
{'>', '>', '>', '>', '<', '>'},
{'>', '>', '>', '>', '<', '>'},
{'<', '<', '<', '<', '<', '='},
{'>', '>', '>', '>', '=', '>'},
};
```
接下来,我们需要定义一个栈来保存运算符和操作数。由于我们的文法中只有两种符号,即运算符和操作数,因此我们可以使用一个字符数组来表示栈。栈顶指针top的初始值为-1。
```
char stack[100];
int top = -1;
```
然后,我们需要实现一个函数push()来将一个符号压入栈中。
```
void push(char c) {
stack[++top] = c;
}
```
同样,我们需要实现一个函数pop()来将栈顶元素弹出。
```
char pop() {
return stack[top--];
}
```
接下来,我们需要实现一个函数get_priority()来获取两个运算符的优先级。该函数的返回值为“<”、“>”或“=”。
```
char get_priority(char a, char b) {
int i, j;
switch (a) {
case 'a': i = 0; break;
case 'b': i = 1; break;
case '(': i = 2; break;
case ')': i = 3; break;
case ',': i = 4; break;
case '#': i = 5; break;
}
switch (b) {
case 'a': j = 0; break;
case 'b': j = 1; break;
case '(': j = 2; break;
case ')': j = 3; break;
case ',': j = 4; break;
case '#': j = 5; break;
}
return priority_table[i][j];
}
```
接下来,我们可以开始编写主函数。首先,我们需要从控制台读入一个符号串,符号串的末尾需要添加一个“#”作为结束符号。然后,我们将“#”压入栈中。
```
int main() {
char input[100];
printf("请输入符号串:");
scanf("%s", input);
push('#');
```
接下来,我们使用一个循环来处理符号串中的每个字符。如果当前字符为运算符,则需要比较栈顶元素和该运算符的优先级。如果栈顶元素的优先级低于该运算符的优先级,则将该运算符压入栈中。否则,需要弹出栈顶元素,直到栈顶元素的优先级低于该运算符的优先级为止。最后,将该运算符压入栈中。
如果当前字符为操作数,则直接将其输出。
```
for (int i = 0; input[i] != '\0'; i++) {
if (input[i] == 'a' || input[i] == 'b') {
printf("%c", input[i]);
} else if (input[i] == '(') {
push(input[i]);
} else if (input[i] == ')') {
while (stack[top] != '(') {
printf("%c", pop());
}
pop(); // 弹出'('
} else if (input[i] == ',') {
while (get_priority(stack[top], input[i]) == '>') {
printf("%c", pop());
}
push(input[i]);
}
}
```
最后,我们需要将栈中剩余的运算符弹出并输出。
```
while (stack[top] != '#') {
printf("%c", pop());
}
printf("\n");
return 0;
}
```
完整代码如下:
阅读全文