【符号输入】打出撇号′

打出撇号

撇号(apostrophe):′
搜狗输入法调成中文,输入fen,第5个就是撇号′
在这里插入图片描述

打出剑号

剑号:单剑号† 双剑号‡

图片名称

右键搜狗输入法悬浮窗,点击“符号大全”:
在这里插入图片描述
搜索剑号:
在这里插入图片描述

### 编写递归下降分析器 对于给定的 LL(1) 文法 G[S],可以构建相应的递归下降分析器来解析形如 S→V=E 的赋值语句。此过程涉及定义一系列相互调用的过程函数,每个函数对应于文法中的一个非终结符。 #### 定义辅助方法 为了简化错误处理并提高可读性,先创建一些辅助方法: ```cpp #include <iostream> #include <string> using namespace std; // 假设有一个全局变量 token 表示当前正在处理的记 extern string token; void error(string msg); // 抛出异常或打印错误消息的方法 bool match(const string& expectedToken); ``` `match()` 函数用来验证下一个记是否匹配预期;如果不匹配则抛错,如果匹配就移动到下个记位置[^1]。 #### 实现各个非终端符号对应的预测函数 针对每一个非终点字符 (non-terminal),实现其对应的 C++ 方法: ##### 解析 `S → V = E` ```cpp void parse_S() { parse_V(); // 调用 V 的解析函数 if (!match("=")) { // 检查 '=' 记的存在 error("Expected '='"); } parse_E(); // 继续解析表达式部分 } ``` ##### 解析 `E → TE'` ```cpp void parse_E() { parse_T(); parse_E_prime(); } ``` ##### 解析 `E' → +TE'|−TE'|ε` ```cpp void parse_E_prime() { switch(token[0]) { case '+': match("+"); parse_T(); parse_E_prime(); break; case '-': match("-"); parse_T(); parse_E_prime(); break; default: /* ε */ ; } } ``` ##### 解析 `T → FT'` ```cpp void parse_T() { parse_F(); parse_T_prime(); } ``` ##### 解析 `T' → *FT'|/FT'|ε` ```cpp void parse_T_prime() { while(true){ char op = token[0]; if(op != '*' && op != '/') break; match(token); parse_F(); // 处理乘除运算... } } ``` ##### 解析 `F → i | (E)` ```cpp void parse_F(){ if(match("(")){ parse_E(); if(!match(")")) error("Missing ')'"); }else{ if(!match("i")) error("Invalid factor"); } } ``` ##### 解析 `V → i` ```cpp void parse_V(){ if(!match("i")) error("Variable must be an identifier 'i'"); } ``` 上述代码片段展示了如何依据指定的文法规则逐一实现各子程序,并通过递归方式完成整个输入字符串的解析工作[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值