编译原理作业3、4

本文解答了几道关于形式语言、自动机理论及语法分析的练习题,包括构造最大值选择函数的伪代码、正则表达式的定义、确定有限状态自动机的简化过程、消除左递归的文法转换及递归下降预测解析器的设计。

Exercise 3.1


<function> <id, 1> <(> <id, 2> <,> <id, 3> <:> <integer> <;>
<{> <const, "return the maximum of integer i and j"> <}>
<begin>
<if> <id, 2> <>> <id, 3> <then> <id, 1> <:> <=> <id, 2>
<else> <id, 1> <:> <=> <id, 3>
<end> <;>

Exercise 3.2


a(a|b)a
A String of a's and b's(b can be 0) that start and end with a.

abaaba
A String consists of exactly 3 bs and random number of a.

Exercise 3.3


select -> [S|s][E|e][L|l][E|e][C|c][T|t]

Exercise 3.4


这里写图片描述

这里写图片描述

A = {1, 2, 4, 10, 8, 5, 12}
B = {3, 12}
C = {9, 6, 11, 12}
D = {7, 12}

This DFA can be reduced as follow:
这里写图片描述

Exercise3.5


这里写图片描述

/o[z|o|/]o/

Exercise 4.1


Eliminate left recursions:
S(L)|a
LSL
L,SL|

The transition diagrams for the grammer:

  • S:这里写图片描述

  • L:这里写图片描述

  • L’:这里写图片描述

A recursive descent predictive parser:

void S() {
    if (lookahead == '(') {
        match('('); L(); match(')');
    } else if (lookahead == 'a') {
        match('a');
    } else {
        error();
    }
}

void L() {
    if (lookahead in First(S)) {
        S();
        L'();
    } else error();
}

void L'() {
    if (lookahead == ',') {
        match(',');
        S();
        L'();
    } else if (lookahead in Follow(L')) {
        //do nothing
    } else error();
}

The procedure call sequence for an input sentence (a,(a,a)).

S()
match('(')
L()
S()
match('a')
L'()
match(',')
S()
match('(')
L()
S()
match('a')
L'()
match(',')
S()
match('a')
L'()
match(')')
L'()
match(')')

Exercise 4.2


这个里面的都是测试数据,总共得分5分。从控制台输入,不能从文件中读取。实现了基本功能,加分项目都没有去实现,没有函数数组这些的实现。这是用C++语言写的,新建parser类别要选C++,其他对于VS的配置和C语言一样。for语句用的是枚举所有情况,你可以自行修改。 对预备工作中自然语言描述的简化C编译器的语言特性的语法,设计上下文无关文法进行描述 借助Yacc工具实现语法分析器 考虑语法树的构造: 1.语法树数据结构的设计:节点类型的设定,不同类型节点应保存哪些信息,多叉树的实现方式 2.实现辅助函数,完成节点创建、树创建等功能 3.利用辅助函数,修改上下文无关文法,设计翻译模式 4.修改Yacc程序,实现能构造语法树的分析器 考虑符号表处理的扩充 1.完成语法分析后,符号表项应增加哪些标识符的属性,保存语法分析的结果 2.如何扩充符号表数据结构,Yacc程序如何与Lex程序交互,正确填写符号表项 以一个简单的C源程序验证你的语法分析器,可以文本方式输出语法树结构,以节点编号输出父子关系,来验证分析器的正确性,如下例: main() { int a, b; if (a == 0) a = b + 1; } 可能的输出为: 0 : Type Specifier, integer, Children: 1 : ID Declaration, symbol: a Children: 2 : ID Declaration, symbol: b Children: 3 : Var Declaration, Children: 0 1 2 4 : ID Declaration, symbol: a Children: 5 : Const Declaration, value:0, Children: 6 : Expr, op: ==, Children: 4 5 7 : ID Declaration, symbol: a Children: 8 : ID Declaration, symbol: b Children: 9 : Const Declaration, value:1, Children: 10: Expr, op: +, Children: 8 9 11: Expr, op: =, Children: 7 10 12: if statement, Children: 6 11 13: compound statement, Children: 3 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值