算符优先关系表/短语、句柄、素短语和最左素短语/a; (a+a)和(a+a)的分析过程

编译原理第五章—算符优先关系表/短语、句柄、素短语和最左素短语/a; (a+a)和(a+a)的分析过程

文法G[S]为:
S→S;G|G
G→G(T)|H
H→a|(S)
T→T+S|s
1.构造G[S]的算符优先关系表,并判断G[S]是否为算符优先文法。
2.给出句型a(T+S);H;(S)的短语、句柄、素短语和最左素短语。
3.给出a; (a+a)和(a+a)的分析过程,说明它们是否为G[S]的句子。

第一问:在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
第二问:在这里插入图片描述

在这里插入图片描述
注意:在这里插入图片描述
第三问:在这里插入图片描述在这里插入图片描述
在这里插入图片描述

以下是文法G(E):E→a | b | (T) T->cT' | ET' T'->+E |*E | ε的预测分析程序: ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 10 char stack[SIZE]; //定义栈 int top = -1; //栈顶指针初始化为-1 void push(char c) { //入栈操作 top++; stack[top] = c; } void pop() { //出栈操作 top--; } char get_top() { //获取栈顶元素 return stack[top]; } void error() { //错误处理函数 printf("Error\n"); exit(0); } int is_terminal(char c) { //判断是否为终结符 if(c == 'a' || c == 'b' || c == 'c' || c == '+' || c == '*' || c == '(' || c == ')' || c == '$') { return 1; } return 0; } int get_index(char c) { //获取索引值 if(c == 'a') { return 0; } else if(c == 'b') { return 1; } else if(c == 'c') { return 2; } else if(c == '+') { return 3; } else if(c == '*') { return 4; } else if(c == '(') { return 5; } else if(c == ')') { return 6; } else if(c == '$') { return 7; } } char table[6][8][3] = { //预测分析 { {"a", ""}, {"b", ""}, {"c", ""}, {"", ""}, {"", ""}, {"(T)", ""}, {"", ""}, {"", ""} }, { {"", ""}, {"", ""}, {"cT'", ""}, {"", ""}, {"", ""}, {"ET'", ""}, {"", ""}, {"", ""} }, { {"a", ""}, {"b", ""}, {"cT'", ""}, {"", ""}, {"", ""}, {"(T)", ""}, {"", ""}, {"", ""} }, { {"", "+E"}, {"", "", ""}, {"", "", ""}, {"+E", ""}, {"*E", ""}, {"", ""}, {"", "ε"}, {"", "ε"} }, { {"", "ε"}, {"", "ε"}, {"", "*E"}, {"+E", ""}, {"*E", ""}, {"", ""}, {"", "ε"}, {"", "ε"} }, { {"a", ""}, {"b", ""}, {"cT'", ""}, {"", ""}, {"", ""}, {"(T)", ""}, {"", ""}, {"", ""} } }; int main() { char input[SIZE]; printf("请输入要分析的字符串:"); scanf("%s", input); strcat(input, "$"); //在输入字符串末尾加上结束符"$" push('$'); push('E'); int i = 0; while(input[i] != '\0') { //遍历输入字符串 if(get_top() == '$' && input[i] == '$') { printf("Success\n"); break; } else if(get_top() == input[i]) { pop(); i++; } else if(is_terminal(get_top())) { error(); } else { int row = get_top() - 'E'; //获取行号 int col = get_index(input[i]); //获取列号 if(strcmp(table[row][col], "") == 0) { error(); } else if(strcmp(table[row][col], "ε") == 0) { pop(); } else { char* str = table[row][col]; int len = strlen(str); pop(); int j; for(j = len - 1; j >= 0; j--) { push(str[j]); } } } } return 0; } ``` 注:在该程序中,使用了一个栈来模拟预测分析中的栈操作,使用了一个预测分析来判断下一步要进行的操作,其中行号和列号分别为非终结符的编号和终结符的编号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值