kimi-k2.6 在「实现表达式求值器」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:kimi-k2.6
  • 用例名称:实现表达式求值器
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深算法工程师,专注于编译原理与表达式解析领域。 回答要求: 1. 提供完整、可运行的代码实现,并附上清晰的思路说明(解析策略选择理由)。 2. 代码需包含必要的注释,关键逻辑处须解释运算符优先级的处理方式。 3. 需覆盖基本异常情况(如除以零、括号不匹配),并给出对应的错误提示。 4. 提供至少 5 个测试用例验证代码正确性,测试用例须涵盖边界场景。 5. 输出格式:先说明解析策略,再给出完整代码,最后展示测试结果。

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

## 题目:实现一个四则运算表达式求值器 请用你熟悉的编程语言(推荐 Python)实现一个字符串表达式求值器,满足以下要求: ### 功能要求 1. **支持的运算符**:加法 `+`、减法 `-`、乘法 `*`、除法 `/` 2. **支持括号**:正确处理任意层级的嵌套括号,括号内的表达式优先计算 3. **运算符优先级**:乘除优先于加减(先乘除后加减),同级运算符从左到右计算 4. **数值类型**:支持整数和浮点数(如 `3.14 * 2`) 5. **空格处理**:表达式中可能包含任意空格,需正确忽略(如 `2 + 3 * 4` 与 `2+3*4` 等价) ### 异常处理要求 - 除以零时,返回错误提示(如 `「Error: Division by zero」`)而非程序崩溃 - 括号不匹配时,返回错误提示(如 `「Error: Mismatched parentheses」`) - 表达式为空或仅含空格时,返回错误提示 ### 接口定义 实现一个函数 `evaluate(expression: str) -> float | str`,输入字符串表达式,返回计算结果(数值)或错误信息(字符串)。 ### 示例 | 输入 | 输出 | |------|------| | `'2+3*4'` | `14` | | `'(2+3)*4'` | `20` | | `'10 / 2 - 1'` | `4.0` | | `'3.5 * 2 + 1'` | `8.0` | | `'(1+(2*3))'` | `7` | | `'10 / 0'` | `'Error: Division by zero'` | | `'(2+3'` | `'Error: Mismatched parentheses'` | ### 提示 - 推荐使用**递归下降解析法**(Recursive Descent Parsing)或**双栈法**(操作符栈 + 操作数栈) - 递归下降法将语法规则直接映射为函数,层次清晰,易于扩展 - 双栈法实现相对直观,适合入门理解优先级处理

任务要求

AI 模型需要满足以下要求:

  1. 运算符优先级正确:乘除必须先于加减计算,同级运算符从左到右,括号内表达式优先级最高
  2. 括号嵌套处理正确:支持多层嵌套括号,如 `((2+3)*4)` 能得到正确结果
  3. 浮点数支持:能正确解析和计算含小数点的数值,结果精度合理
  4. 空格容错:表达式中任意位置的空格不影响计算结果
  5. 异常处理完整:除以零、括号不匹配、空表达式三类异常均有友好错误提示且不崩溃
  6. 代码结构清晰:解析逻辑与异常处理分离,关键步骤有注释说明

评测结果

综合得分

该模型在此用例的得分为:94.0 分(满分 100 分),已通过

基础难度评测结果

  • 得分:94.0 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

## 解析策略说明 本实现采用**递归下降解析法(Recursive Descent Parsing)**。其核心思想是将语法规则按照优先级从高到低拆解为多层函数,每一层只处理一种优先级的运算符: 1. **`parse_expression`**:处理加减法(`+`、`-`,最低优先级)。它首先调用 `parse_term` 获取一个项,然后在循环中处理后续的加减运算。 > **优先级处理关键**:由于加减法位于调用链的顶层,它天然地让乘除法先被 `parse_term` 计算完成,从而实现了“先乘除后加减”。 2. **`parse_term`**:处理乘除法(`*`、`/`,中等优先级)。它首先调用 `parse_factor` 获取一个因子,然后在循环中处理后续的乘除运算。 > **优先级处理关键**:乘除法比加减法更深一层,因此加减法无法“打断”一个正在进行的乘除计算,除非乘除所在的因子/项已经完整解析。 3. **`parse_factor`**:处理数字字面量和括号(最高优先级)。遇到左括号 `(` 时递归调用 `parse_expression`,直到匹配右括号 `)`;否则解析整数或浮点数。 > **优先级处理关键**:括号通过递归将整个子表达式重新送入最顶层 `parse_expression`,从而强制子表达式优先求值;数字作为原子单位直接返回。 **结合性处理**:三个层级均使用 `while` 循环连续读取同优先级运算符(如 `a - b + c` 会被计算为 `(a - b) + c`),这保证了**同级运算符从左到右**的结合顺序。 **错误处理**:通过自定义异常 `ValueError` 在解析过程中传递错误上下文,外层 `evaluate` 函数统一捕获并转换为符合要求的错误提示。 --- ## 完整代码实现 ```python from __future__ import annotations class _Parser: """ 递归下降解析器的内部实现类。 """ def __init__(self, text: str): self.text = text self.pos = 0 self.n = len(text) # ---------- 工具方法 ---------- def _skip_spaces(self) -> None: """跳过当前位置的所有空白字符。""" while self.pos = self.n: raise ValueError("Empty expression") result = self._parse_expression() # 解析完成后,若还有未处理的非空字符,说明语法有误 self._skip_spaces() if self.pos = self.n: raise ValueError("Unexpected end of expression") ch = self.text[self.pos] # 括号处理:递归进入 expression,强制括号内优先计算 if ch == '(': self.pos += 1 val = self._parse_expression() self._skip_spaces() if self.pos >= self.n or self.text[self.pos] != ')': raise ValueError("Mismatched parentheses") self.pos += 1 return val # 若遇到孤立的右括号,说明括号不匹配 if ch == ')': raise ValueError("Mismatched parentheses") # 数字解析(整数或浮点数) if ch.isdigit() or ch == '.': start = self.pos dot_seen = False while (self.pos float | str: """ 求值四则运算表达式。 Args: expression: 包含 + - * / 、括号及空格的字符串。 Returns: 计算结果(int 或 float)或错误提示字符串。 """ if not isinstance(expression, str): return "Error: Invalid expression" if expression.strip() == "": return "Error: Empty expression" try: parser = _Parser(expression) return parser.parse() except ValueError as...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】这是一份高质量的实现方案。候选输出采用递归下降解析法,完整实现了四则运算求值器的所有功能要求,运算符优先级处理正确,括号嵌套、浮点数运算、空格容错均表现优秀。异常处理覆盖全面,三类核心异常均有友好提示且程序不崩溃。代码结构清晰,解析逻辑与错误处理分离,关键步骤注释详尽,解析策略说明准确到位。测试用例设计合理,10 个场景全部通过,充分验证了实现的正确性和健壮性。整体达到了专业工程水平,符合题目对「资深算法工程师」的定位要求。 【GEMINI】该生成结果表现卓越,完全符合“资深算法工程师”的人设要求。代码实现既体现了扎实的编译原理功底,又在健壮性和可读性上达到了极高标准,测试验证环节也十分严谨。 【KIMI】整体而言,该实现满足了题目要求,正确处理了运算符优先级、括号嵌套、浮点数计算等核心功能,并且对异常情况有良好的容错处理。代码结构和注释也较为清晰。但在注释的丰富度上还有提升空间。

进阶难度评测结果

  • 得分:93.8 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

**解析策略与符号表说明** 1. **解析策略**:采用经典的两阶段 **递归下降解析(Recursive Descent Parsing)**。 - **词法分析(Lexer)**:将原始字符流转换为 `Token` 列表,过滤空白字符,识别数字(含整数、浮点数及 `.5` 形式)、标识符、运算符、括号、赋值号与分号。遇到非法字符立即报告错误。 - **语法分析(Parser)**:基于 LL(1) 文法进行递归下降求值,边解析边计算,无需构建显式 AST。文法层级如下: - `program` → `statement` (`;` `statement`)\* - `statement` → `IDENTIFIER = expression` | `expression` - `expression` → `term` ((`+`|`-`) `term`)\* - `term` → `factor` ((`*`|`/`) `factor`)\* - `factor` → (`+`|`-`) `factor` | `primary` - `primary` → `NUMBER` | `IDENTIFIER` | `(` `expression` `)` 这种分层结构天然保证了“先乘除后加减”以及括号优先的运算优先级。 2. **符号表管理**:使用 Python 字典 `self.env`(`Dict[str, Union[int, float]]`)作为运行时环境(Environment)。在解析到赋值语句 `IDENTIFIER = expression` 时,先递归求出右侧表达式的值,再写入 `self.env`;在解析到变量引用时,从 `self.env` 中查找,若不存在则抛出运行时错误。整个符号表的生命周期与 `Parser` 实例绑定,每次对新输入求值时都会创建全新的符号表,保证多次调用之间无副作用。 --- ```python from enum import Enum, auto from typing import List, Union class TokenType(Enum): """Token 类型枚举""" NUMBER = auto() IDENTIFIER = auto() PLUS = auto() MINUS = auto() MUL = auto() DIV = auto() LPAREN = auto() # ( RPAREN = auto() # ) ASSIGN = auto() # = SEMICOLON = auto() # ; EOF = auto() class Token: def __init__(self, type_: TokenType, value: Union[int, float, str, None], pos: int): self.type = type_ self.value = value self.pos = pos # 在源代码中的位置,用于错误定位 def __repr__(self) -> str: return f"Token({self.type.name}, {self.value})" class EvalError(Exception): """自定义求值异常,所有错误均通过此异常抛出,外层统一捕获""" pass class Lexer: """词法分析器:将输入字符串拆分为 Token 列表""" def __init__(self, text: str): self.text = text self.pos = 0 self.length = len(text) def error(self, message: str): raise EvalError(f"语法错误 (位置 {self.pos}): {message}") def peek_char(self) -> Union[str, None]: if self.pos Token: """ 解析数字,支持: - 整数: 123 - 浮点数: 3.14 - 小数点开头的浮点数: .5 """ start_pos = self.pos has_dot = False char = self.peek_char() # 处理以 '.' 开头的情况(如 .5) if char == '.': has_dot = True self.pos += 1 if self.peek_char() is None or not self.peek_char().isdigit(): self.error("不完整的浮点数") while self.peek_char()...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】这是一个非常优秀的表达式求值器实现。候选输出展现了扎实的编译原理功底,采用经典的词法分析+递归下降解析方案,代码结构清晰、注释详尽、错误处理完善。所有核心功能(四则运算、括号、变量、多语句、数值类型)均正确实现,异常情况处理全面且提供有意义的错误信息。文法设计合理,通过层级结构天然保证运算优先级。测试用例覆盖充分,包含边界情况与异常场景。代码可直接运行且健壮性强。整体实现达到了生产级代码的质量标准,完全满足题目的所有要求。 【GEMINI】这是一份教科书级别的实现。不仅完整覆盖了题目要求的所有功能和错误处理,还额外支持了一元正负号、下划线变量名等增强功能。代码编写规范,解析逻辑严密,测试用例详尽,展现了深厚的编译原理功底。 【KIMI】整体而言,代码实现了题目要求的核心功能,运算逻辑和变量处理正确,异常情况处理较为全面。代码结构和注释也较好。但在空语句处理和部分注释说明上还有改进空间。

困难难度评测结果

  • 得分:95.5 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

下面给出一个**完整的、三层分离**的表达式求值器实现。 ### 解析策略说明 本实现选用 **递归下降解析(Recursive Descent Parsing)**。 - **选择理由**:该文法规模适中、优先级层级丰富(赋值、三元、逻辑、算术、幂、一元、函数调用等),递归下降通过“一个优先级对应一个解析函数”的方式,能够最直观地映射语法规则。函数调用、括号嵌套、右结合幂运算等都能自然表达,且错误定位精确到具体字符位置。 - **优点**:实现思路与文法同构,代码可读性高;无需显式维护操作符栈或中缀转后缀的中间过程;易于在解析阶段抛出精确的 `ParseError`。 - **缺点**:手写代码量相对较大;若语法规则膨胀到数十条以上,维护成本会上升;需要手动消除左递归(本文法已通过循环迭代处理左结合、通过递归处理右结合,已消除左递归)。 --- ```python import math from dataclasses import dataclass from enum import Enum, auto from typing import List, Dict, Union, Optional, Any # ==================== 1. 异常体系 ==================== class ExpressionError(Exception): """求值器根异常""" pass class LexerError(ExpressionError): """词法错误:非法字符、不完整的数字等""" pass class ParseError(ExpressionError): """语法错误:括号不匹配、缺少操作数、意外的 Token 等""" pass class EvalError(ExpressionError): """运行时求值错误:未定义变量、除零、非法函数参数等""" pass # ==================== 2. Token 定义 ==================== class TokenType(Enum): NUMBER = auto() IDENTIFIER = auto() PLUS = auto() # + MINUS = auto() # - MULTIPLY = auto() # * DIVIDE = auto() # / FLOORDIV = auto() # // MODULO = auto() # % POWER = auto() # ** LPAREN = auto() # ( RPAREN = auto() # ) COMMA = auto() # , SEMICOLON = auto() # ; ASSIGN = auto() # = GT = auto() # > LT = auto() # = LE = auto() # Optional[str]: if self.pos Optional[str]: ch = self._peek() self.pos += 1 return ch def _skip_whitespace(self) -> None: while self._peek() is not None and self._peek() in ' \t\n\r': self._advance() def _read_number(self) -> Token: """读取整数或浮点数,支持 123, 3.14, .5, 5.""" start = self.pos has_dot = False if self._peek() == '.': # 以点开头,如 .5 has_dot = True self._advance() if self._peek() is None or not self._peek().isdigit(): raise LexerError(f"Invalid number format at position {start}: '.' not followed by digits") while self._peek() is not None and self._peek().isdigit(): self._advance() else: while self._peek() is not None and self._peek().isdigit(): self._advance() if self._peek() == '.': has_dot = True self._advance() while self._peek() is not None and...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】这是一个高质量的表达式求值器实现,完整覆盖了题目的所有功能要求,包括复杂的运算符优先级、变量系统、内置函数、逻辑与三元表达式。递归下降解析策略选择合理,实现思路清晰,优先级分层严谨,幂运算右结合性与一元运算符交互处理巧妙。错误处理机制极为完善,三类具名异常覆盖所有异常场景,错误信息详尽且带位置提示。代码结构优秀,三层分离架构职责单一,类型注解完整,注释充分,测试用例覆盖全面。解析策略说明详尽,展现了对编译原理的深刻理解。整体实现专业、健壮、可维护性强,完全满足题目对「资深编译器开发专家」的要求。 【GEMINI】这是一个教科书级别的实现。不仅完全满足了所有功能性要求,而且在编译器架构设计、运算符优先级处理(如幂运算的结合性)、错误处理的细腻程度以及代码的可读性上都表现优异。特别是在处理三元运算符和逻辑运算符的短路求值,以及对数学函数参数校验方面,展现了深厚的开发经验。 【KIMI】整体而言,这是一个高质量的表达式求值器实现。它正确实现了题目要求的所有功能点,覆盖了运算符优先级、变量系统、内置函数等复杂场景。代码结构清晰,遵循三层架构,且有详细的注释和类型注解,易于理解和维护。在错误处理方面,覆盖了大多数异常场景,但对一些边界情况的处理还有待加强。总体来说,这是一个优秀的实现。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...