编译原理之最左推导和最右推导

符号串的最左推导及最右推导

 

需求分析

 

1)输入一个文法,可以有多个非终结符号,每个非终结符号可有多条规则。

 

2)输入要分析的符号串

 

3)分别采用最左推导和最右推导进行符号串的分析,请输出推导过程。

 

文法为:

E->CB

C->c

B->b

 

假如有个要分析的字符串为EB

最左推导的分析为

1         CBB

2         cBB

3         cbB

4         cbb

最右推导的分析为

1         Eb

2         CBb

3         cBb

4         cbb

 

 

1 输入文法

2 输入要分析的字符串

3 选择适当的文法

4 判断是否要分析的字符串已经分析完

N

5  输出分析结果并结束

1 输入文法

2 输入要分析的字符串

3 选择适当的文法

4 判断是否要分析的字符串已经分析完

N

5  输出分析结果并结束

Y

详细设计

1.界面设计

利用VC++的MFC的单对话框做模板,输入文法和要分析的字符串分别用一个Text来输入,输出的最左推导和最右推导结果在ListBox,一个按钮来确认

 

2.模块算法(伪代码)

(1)   最左推导

while(这不是最后一个字符)

{
if(
这是一个非终结符号)

   文法分析字符串

把字符串放进链表头

   输出当前分析的字符串

else

   指向后一个字符

}

(2)   最右推导

while(这不是最后一个字符)

{
if(
这是一个非终结符号)

   文法分析字符串

把字符串放进链表尾

   输出当前分析的字符串

else

   指向前一个字符

}

 

3)何为非终结符号

      E->CD

      可以看出凡是在箭头左边的为非终结符号

4)分析文法表

     例如E->C

         C->c

      由此可见:

->左边的为非终结符号,->右边的为要分析的文法

 

上下文无关文法(Context-Free Grammar,简称CFG)是最常用的语法形式之一,在计算机科学中用于描述语言结构。对于给定的文法,求最推导最右推导是指从开始符号出发,按照文法规则一步步生成整个句子的过程。 **最推导(Leftmost Derivation)**: 这种规则是从扫描输入串,并尽可能地在最边应用非终结符的替换。在Python中,你可以通过递归的方式来模拟这个过程: ```python def leftmost(grammar, start_symbol, input_string): if not input_string: return [start_symbol] else: for production in grammar[start_symbol]: if is_match(input_string, production.rhs): derivation = leftmost(grammar, production.rhs[0], remove_prefix(input_string, production.lhs)) if derivation: return [start_symbol] + derivation return None # 辅助函数,检查是否匹配和移除前缀 def is_match(string, rhs) and remove_prefix(string, lhs): # 实现这部分需要具体的字符串比较和切割操作 ``` **最右推导(Rightmost Derivation)**: 与此相反,最右推导是自处理输入,始终试图在边找到可以替换的规则。实现类似,但递归方向相反: ```python def rightmost(grammar, start_symbol, input_string): if not input_string: return [start_symbol] else: for production in reversed(grammar[start_symbol]): if is_match(input_string, production.rhs): derivation = rightmost(grammar, production.rhs[0], remove_suffix(input_string, production.lhs)) if derivation: return derivation + [start_symbol] return None # 辅助函数,检查是否匹配和移除后缀 def is_match(string, rhs) and remove_suffix(string, lhs): # 实现这部分同样需要字符串操作 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值