8、高级计算器与 SQL 解析:功能、实现与应用

高级计算器与 SQL 解析:功能、实现与应用

高级计算器的表达式语法与规则

高级计算器的表达式语法是之前示例的适度扩展版本。新增了用于处理六个比较运算符的 CMP 规则,通过 CMP 的值来区分具体的运算符,同时还有用于创建赋值节点的赋值规则。对于内置函数(由保留名称 FUNC 标识)和用户函数(由用户符号 NAME 标识),分别有不同的规则。

  • 表达式列表(explist)规则 :构建用于函数调用实际参数的表达式的抽象语法树(AST)。
  • 符号列表(symlist)规则 :为函数定义中的虚拟参数构建符号的链表。这两个规则都是右递归的,以便按所需顺序轻松构建列表。

以下是顶级计算器的语法规则:

calclist: /* nothing */
  | calclist stmt EOL {
     printf("= %4.4g\n> ", eval($2));
     treefree($2);
    }
  | calclist LET NAME '(' symlist ')' '=' list EOL {
                       dodef($3, $5, $8);
                       printf("Defined %s\n> ", $3->name); }
  | calclist error EOL { yyerrok; printf("> "); }
 ;
### KMP算法单个字符间比较次数计算 对于主串 `T = "abaabaabcabaabc"` 和模式串 `s = "abaabc"` 使用KMP算法进行模式匹配时,单个字符间的比较次数可以通过构建`next`数组并模拟匹配过程来得出。 #### 构建Next数组 为了有效减少不必要的回溯操作,先要根据模式串`s`构造其对应的`next`数组。此数组记录了模式串各位置之前的最大相同前后缀长度加一: | 序号 | 1 | 2 | 3 | 4 | 5 | 6 | | --- |---|---|---|---|---|---| | 模式串 | a | b | a | a | b | c | | next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 表中的`next[j]`值表示当模式串当前指针指向该序号处失配时可以跳转的位置[^2]。 #### 进行模式匹配 按照上述得到的`next`数组执行KMP算法的具体流程如下所示: - 初始状态下两个字符串均从头开始逐位对比; - 若遇到相等情况则继续前进;反之依据`next`数组调整模式串起始点直至完全吻合或遍历完成整个目标序列。 具体到本案例中,首次尝试后发现第六位不一致(`c != a`),此时利用已知信息快速定位新起点重新检验剩余部分,最终确认两次循环内总计进行了十轮一对一核查动作才找到确切答案。 ```python def compute_prefix_function(pattern): m = len(pattern) pi = [0]*m k = 0 for q in range(1, m): while k > 0 and pattern[k] != pattern[q]: k = pi[k - 1] if pattern[k] == pattern[q]: k += 1 pi[q] = k return pi def kmp_match(text, pattern): n = len(text) m = len(pattern) comparisons = 0 prefix_array = compute_prefix_function(pattern) q = 0 matches_positions = [] for i in range(n): while q > 0 and pattern[q] != text[i]: q = prefix_array[q-1] comparisons += 1 if pattern[q] == text[i]: q += 1 comparisons += 1 if q == m: matches_positions.append(i-m+1) q = prefix_array[q-1] return matches_positions, comparisons text = 'abaabaabcabaabc' pattern = 'abaabc' matches, total_comparisons = kmp_match(text, pattern) print(f'Matches found at positions {matches}') print(f'Total character-to-character comparisons made: {total_comparisons}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值