HNU 编译系统 作业3

题目1

题干

![[Pasted image 20251105002230.png]]

对以上上下文无关文法与对应的串:

  • 给出这个串的一个最左推导
  • 给出这个串的一个最右推导
  • 给出这个串的一棵语法分析树

(1)对于文法S -> + S S | * S S | a和输入字符串+ * a a a
最左推导:

S
-> + S S
-> + * S S S
-> + * a S S
-> + * a a S
-> + * a a a

最右推导:

S
-> + S S
-> + S a
-> + * S S a
-> + * S a a
-> + * a a a

语法分析树:
![[Pasted image 20251105083615.png]]

(2)对于文法S -> S ( S ) S | ε和输入字符串( ( ) ( ) )
最左推导:

S
-> S ( S ) S
-> ε ( S ) S
-> ( S ) S
-> ( S ( S ) S ) S
-> ( ε ( S ) S ) S
-> ( ( S ) S ) S
-> ( ( ε ) S ) S
-> ( ( ) S ) S
-> ( ( ) S ( S ) S ) S
-> ( ( ) ε ( S ) S ) S
-> ( ( ) ( S ) S ) S
-> ( ( ) ( ε ) S ) S
-> ( ( ) ( ) S ) S
-> ( ( ) ( ) ε ) S
-> ( ( ) ( ) ) S
-> ( ( ) ( ) ) ε
-> ( ( ) ( ) )

最右推导:

S
-> S ( S ) S
-> S ( S ) ε
-> S ( S )
-> S ( S ( S ) S )
-> S ( S ( S ) ε )
-> S ( S ( S ) )
-> S ( S ( ε ) )
-> S ( S ( ) )
-> S ( S ( S ) S ( ) )
-> S ( S ( S ) ε ( ) )
-> S ( S ( S ) ( ) )
-> S ( S ( ε ) ( ) )
-> S ( S ( ) ( ) )
-> S ( ε ( ) ( ) )
-> S ( ( ) ( ) )
-> ε ( ( ) ( ) )
-> ( ( ) ( ) )

语法分析树:
![[Pasted image 20251105084534.png]]

题目2

题干

为题目1中的每一个文法设计一个预测分析器。你可能先要对文法进行提取左公因子或消除左递归的操作。

对于文法S -> + S S | * S S | a

parse_S() {
    // S -> + S S | * S S | a

    token = nextToken();
    switch(token)
    if (token == "+") {
        move token;
        parse_S();
        parse_S();
    }
    if (token == "*") {
        move token;
        parse_S();
        parse_S();
    }
    if (token == "a") {
        move token;
    }
    else
        error("...");
}

对于文法S -> S ( S ) S | ε,先消除左递归得到新文法:

S' -> ( S ) S S' | ε                                                               
S -> S'

再写递归下降的预测分析器:

parse_S() {
    // S -> S'

    token = nextToken();
    switch(token)
    if (token == "(") {
        parse_S_prime();
    }
    else if (token in [$, (, )]) {
        // ε
    }
    else
        error("...");
}

parse_S_prime() {
    // S' -> ( S ) S S' | ε

    token = nextToken();
    switch(token)
    if (token == "(") {
        move token;
        parse_S();
        move token;
        parse_S();
        parse_S_prime();
    }
    else if (token in [$, (, )]) {
        // ε
    }
    else
        error("...");
}

题目3

题干

计算题目1中的各个文法的FIRST和FOLLOW集合。你可能先要对文法进行提取左公因子或消除左递归的操作。

(1)对于文法S -> + S S | * S S | a
该文法没有左公因子和左递归。
![[Pasted image 20251105093703.png|400]]

(2)对于文法S -> S ( S ) S | ε
对该文法消除左递归后得到新文法:

S' -> ( S ) S S' | ε                                                               
S -> S'

![[Pasted image 20251130200516.png|400]]

题目4

判断题目1中的文法是否为LL(1)文法,如果是则填写其LL(1)语法分析表。

(1)对于文法S -> + S S | * S S | a
该文法是LL(1)文法,语法分析表如下:
![[Pasted image 20251105151905.png|350]]

(2)对于文法S -> S ( S ) S | ε
该文法不是LL(1)文法,因为存在左递归。

题目5

为下面的语言设计文法。
(1)所有由0和1组成的并且每个0之后至少跟着一个1的串的集合。
(2)所有由0和1组成的回文(palindrome)的集合,也就是从前面和从后面读结果都相同的串的集合。

(1)

S -> 0 1 S | 1 S | ε

(2)

S -> 0 S 0 | 1 S 1 | 0 | 1 | ε

题目7

![[Pasted image 20251105154131.png|240]]

(1)对于以上两个文法,分别画出其LR(0)项集的状态转换图(即DFA)。
(2)判断它们是否为LR(0)文法,是否为SLR(1)文法,给出理由。
(3)如果是LR(0)文法或SLR(1)文法,填出其LR语法分析表。

(1)对于文法S -> S S + | S S * | a,得到增广文法

0 : S' -> S $
1 : S -> S S + 
2 :    | S S * 
3 :    | a

![[Pasted image 20251105205345.png]]

对于文法S -> a S a | a a,得到增广文法

0 : S' -> S $
1 : S -> a S a 
2 :    | a a

![[Pasted image 20251130194205.png]]

(2)对于文法S -> S S + | S S * | a
LR(0)分析表:
![[Pasted image 20251130195855.png|400]]

是LR(0)文法,因为LR(0)分析表中无冲突。
SLR(1)分析表:
![[Pasted image 20251130195855.png|400]]

是SLR(1)文法,因为SLR(1)分析表中无冲突。
对于文法S -> a S a | a a
LR(0)分析表:
![[Pasted image 20251130195205.png|400]]

不是LR(0)文法,因为LR(0)分析表中,状态4输入符号为a时有移进-规约冲突。
SLR(1)分析表:
![[Pasted image 20251130195205.png|400]]

不是SLR(1)文法,因为SLR(1)分析表中,状态4输入符号为a时仍有移进-规约冲突。
(3)见(2)。

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
### 编译原理课程作业示例 #### 表达式求值解析树遍历实现 为了展示编译原理中的表达式求值过程,可以构建一个简单的语法分析器来处理算术表达式的计算。此部分展示了如何通过访问者模式完成对抽象语法树(AST)节点的遍历以及最终的结果计算。 ```cpp // 定义用于表示不同类型的表达式节点类结构体 struct ExprNode { virtual ~ExprNode() {} }; class BinaryOp : public ExprNode { /* ... */ }; class UnaryOp : public ExprNode { /* ... */ }; class NumberLiteral : public ExprNode { /* ... */ }; // 访问者接口定义 class ITreeVisitor { public: virtual void visit(BinaryOp* node) = 0; virtual void visit(UnaryOp* node) = 0; virtual void visit(NumberLiteral* node) = 0; }; // 实现具体的访问者逻辑 class TreeVisitorCalculator final : public ITreeVisitor { private: int evaluateResult; public: explicit TreeVisitorCalculator() : evaluateResult(0) {} // 对于不同的操作符执行相应的运算 void visit(BinaryOp* node) override {/*...*/} void visit(UnaryOp* node) override {/*...*/} void visit(NumberLiteral* node) override { this->evaluateResult += static_cast<NumberLiteral*>(node)->value(); } [[nodiscard]] int getResult() const noexcept { return this->evaluateResult; } }; ``` 在上述代码片段中,`TreeVisitorCalculator` 类实现了 `ITreeVisitor` 接口,并提供了具体的方法去处理每种可能遇到的操作数或操作符类型。当整个 AST 被成功遍历之后,就可以得到表达式的计算结果[^2]。 对于给定的例子 `"4 * 2 - 2 / 4 + 5"` 的评估: ```cpp int main(){ // 构建表达式的根节点 exprRoot (此处省略了实际创建的过程) TreeVisitorCalculator treeVisitor; // 遍历这棵树并计算其值 int result = treeVisitor.visit(exprRoot); std::cout << "Expression evaluation: " << result << std::endl; } ``` 这段程序会输出表达式 `4 * 2 - 2 / 4 + 5` 经过解释后的数值结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值