编译原理12:活前缀、项目集规范族、LR(0)分析表

LR分析法回顾

 

活前缀

 


构造识别活前缀的DFA

拓广文法的目的是保证文法的开始符号的定义只有一个产生式,而且文法的开始符号不会出现在其他产生式的右部

这个圆点表示我们在分析过程中看到了产生式多大部分

 

族:元素是集合的集合 


通过计算项目集规范族构造识别活前缀的DFA-有效项目


通过计算项目集规范族构造识别活前缀的DFA-LR(0)项目集规范

两种方法本质上是一样的 


构造LR(0)分析表的算法

​​​​​​​

以上每一个项目集里都没有移进-规约冲突和规约-规约冲突

 
LR(0)分析示例★★★★★

​​​​​​​


小结

 

 

 

 

 

 

 

  • 9
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LR(0)分析是一种自底向上的语法分析方法,用于分析上下文无关文法。下面是构造LR(0)分析的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SYMBOLS 100 #define MAX_STATES 100 int num_symbols, num_states; char symbols[MAX_SYMBOLS]; char states[MAX_STATES][MAX_SYMBOLS]; int num_transitions[MAX_STATES][MAX_SYMBOLS]; char transitions[MAX_STATES][MAX_SYMBOLS][MAX_STATES]; int get_symbol_index(char symbol) { for (int i = 0; i < num_symbols; i++) { if (symbols[i] == symbol) { return i; } } return -1; } void add_transition(int state, char symbol, int next_state) { int symbol_index = get_symbol_index(symbol); if (symbol_index == -1) { symbols[num_symbols++] = symbol; symbol_index = num_symbols - 1; } num_transitions[state][symbol_index]++; transitions[state][symbol_index][next_state] = 1;} void print_table() { printf("State\t"); for (int i = 0; i < num_symbols; i++) { printf("%c\t", symbols[i]); } printf("\n"); for (int i = 0; i < num_states; i++) { printf("%d\t", i); for (int j = 0; j < num_symbols; j++) { if (num_transitions[i][j] == 0) { printf(".\t"); } else if (num_transitions[i][j] == 1) { int next_state = -1; for (int k = 0; k < num_states; k++) { if (transitions[i][j][k]) { next_state = k; break; } } printf("%d\t", next_state); } else { printf("{"); for (int k = 0; k < num_states; k++) { if (transitions[i][j][k]) { printf("%d,", k); } } printf("}\t"); } } printf("\n"); } } int main() { // TODO: 构造LR(0)分析的代码 print_table(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值