Elephant 在「实现表达式求值器」的评测结果
这是该 AI 模型在此测试用例上的详细评测结果。
基本信息
- 模型名称:Elephant
- 用例名称:实现表达式求值器
- 测试类型:文本生成
- 评测维度:代码生成
系统提示词(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 模型需要满足以下要求:
- 运算符优先级正确:乘除必须先于加减计算,同级运算符从左到右,括号内表达式优先级最高
- 括号嵌套处理正确:支持多层嵌套括号,如 `((2+3)*4)` 能得到正确结果
- 浮点数支持:能正确解析和计算含小数点的数值,结果精度合理
- 空格容错:表达式中任意位置的空格不影响计算结果
- 异常处理完整:除以零、括号不匹配、空表达式三类异常均有友好错误提示且不崩溃
- 代码结构清晰:解析逻辑与异常处理分离,关键步骤有注释说明
评测结果
综合得分
该模型在此用例的得分为:91.7 分(满分 100 分),已通过
基础难度评测结果
- 得分:91.7 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
## 解析策略说明 我选择使用**递归下降解析法**(Recursive Descent Parsing)来实现该表达式求值器,主要理由如下: 1. **语法清晰**:递归下降解析法直接将文法规则映射为函数,代码结构清晰,易于理解和维护。 2. **优先级处理自然**:通过分层解析(表达式→项→因子),可以优雅地处理运算符优先级(乘除优先于加减)和括号。 3. **扩展性好**:如果要支持更多运算符(如幂运算)或函数调用,只需扩展对应函数即可。 4. **错误定位准确**:可以在解析过程中精准捕获括号不匹配等语法错误。 ### 文法规则设计 ``` expression → term (('+' | '-') term)* term → factor (('*' | '/') factor)* factor → number | '(' expression ')' | ('+' | '-') factor ``` 这种分层结构完美对应了: - 最高优先级:括号和因子(处理一元运算符) - 中等优先级:项(处理乘除) - 最低优先级:表达式(处理加减) ## 完整代码实现 ```python def evaluate(expression: str): """ 表达式求值器主函数 支持 +, -, *, / 运算符,整数和浮点数,任意层级括号,空格处理 异常处理:除零、括号不匹配、空表达式 """ # 去除所有空格 expression = expression.replace(' ', '') # 检查空表达式 if not expression: return "Error: Empty expression" # 初始化解析状态 tokens = list(expression) pos = [0] # 使用列表模拟引用传递 def parse_expression(): """解析表达式(处理加减)""" result = parse_term() while pos[0] = len(tokens): raise ValueError("Unexpected end of expression") # 处理一元运算符 if tokens[pos[0]] == '+': pos[0] += 1 return parse_factor() elif tokens[pos[0]] == '-': pos[0] += 1 return -parse_factor() # 处理括号表达式 if tokens[pos[0]] == '(': pos[0] += 1 result = parse_expression() if pos[0] >= len(tokens) or tokens[pos[0]] != ')': raise ValueError("Mismatched parentheses") pos[0] += 1 # 消耗 ')' return result # 处理数字(整数或浮点数) start = pos[0] has_dot = False has_digit = False while pos[0] 0: return "Error: Mismatched parentheses" # 如果是整数结果,返回 int 类型 if isinstance(result, float) and result.is_integer(): return int(result) return result except ZeroDivisionError: return "Error: Division by zero" except (ValueError, IndexError): return "Error: Mismatched parentheses" # ==================== 测试用例 ==================== if __name__ == "__main__": test_cases = [ # (输入, 期望输出, 说明) ('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", "左括号未匹配"), ('2+3)', "Error: Mismatched...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【KIMI】整体而言,代码实现了题目要求的所有功能,运算符优先级处理正确,括号嵌套处理得当,浮点数支持良好,空格容错处理也符合要求。异常处理完整,代码结构清晰,注释详细,测试用例全面。是一个高质量的实现。
进阶难度评测结果
- 得分:81.7 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
下面是一个完整的 **变量表达式求值器** 实现,采用 **递归下降解析(Recursive Descent Parsing)** 策略,支持变量赋值、引用、四则运算、括号、浮点数、错误处理等所有要求。 --- ## ✅ 实现语言:Python ### 🧠 解析策略:递归下降解析(Recursive Descent Parsing) - 将表达式语法定义为一组递归函数,分别对应语法规则(如表达式、项、因子等)。 - 使用 **LL(1) 风格** 的自顶向下解析,通过 token 流逐步匹配。 - 支持变量符号表(`Symbol Table`)管理变量名到值的映射。 ### 📦 变量符号表管理方式 - 使用 Python 字典 `self.variables` 存储变量名 → 数值。 - 赋值语句更新符号表。 - 引用变量时查找符号表,未定义则抛出错误。 --- ## ✅ 完整可运行代码(含详细注释) ```python import re class InterpreterError(Exception): """自定义异常基类""" pass class UndefinedVariableError(InterpreterError): def __init__(self, var_name): super().__init__(f"Undefined variable: '{var_name}'") class DivisionByZeroError(InterpreterError): def __init__(self): super().__init__("Division by zero") class SyntaxError(InterpreterError): def __init__(self, msg="Syntax error"): super().__init__(msg) class UnexpectedTokenError(SyntaxError): def __init__(self, token): super().__init__(f"Unexpected token: '{token}'") class Token: def __init__(self, type_, value): self.type = type_ self.value = value def __repr__(self): return f"Token({self.type}, {repr(self.value)})" class Lexer: def __init__(self, text): self.text = text self.pos = 0 self.current_char = self.text[self.pos] if self.text else None def advance(self): self.pos += 1 if self.pos 返回最后一条语句的结果 """ if not input_str or not input_str.strip(): raise SyntaxError("Empty input") lexer = Lexer(input_str) parser = Parser(lexer) return parser.parse() # ====================== # 🧪 测试用例 # ====================== if __name__ == "__main__": test_cases = [ # 1. 基础运算 ("3 + 4 * 2", 11), # 2. 变量赋值与引用 ("x = 5; y = x * 2", 10.0), # 3. 浮点数与括号 ("(3.14 + 2.86) * 2", 12.0), # 4. 错误:未定义变量 ("unknown + 1", "Undefined variable: 'unknown'"), # 5. 错误:除以零 ("10 / 0", "Division by zero"), # 6. 错误:括号不匹配 ("(1 + 2", "Syntax error"), # 7. 错误:非法字符 ("2 @ 3", "Illegal character: '@'"), # 8. 空输入 ("", "Empty input"), # 9. 混合浮点与整数 (".5 + 1.5 * 2", 3.5), # 10. 多语句,最后一条是赋值 ("a = 10; b = a + 5; c = b * 2", 30.0), ] for i, (input_str, expected) in...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【KIMI】该实现基本满足了题目要求,功能完整,逻辑正确。在错误处理和代码质量方面还有改进空间。总体而言是一个优秀的实现,达到了较高的水准。
困难难度评测结果
- 得分:88.3 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
下面是一个功能完整、结构清晰、符合要求的表达式求值器实现,采用 **递归下降解析(Recursive Descent Parsing)** 策略。 --- ### ✅ 解析策略选择:递归下降解析(Recursive Descent Parsing) **优点:** - 易于理解和实现,尤其适合表达式语法。 - 支持 LL(1) 语法,可扩展性强。 - 错误定位清晰,便于调试。 **缺点:** - 需要为每个非终结符编写一个解析函数,代码量较大。 - 不适合高度左递归的语法(需手动消除或改用 Pratt 解析)。 > 本实现通过将表达式按优先级分层(`parse_expression`, `parse_logical_or`, `parse_logical_and`, `parse_equality`, `parse_comparison`, `parse_term`, `parse_power`, `parse_unary`, `parse_primary`)来避免左递归问题。 --- ### 📦 三层架构:Lexer → Parser → Evaluator ```python import math import re from dataclasses import dataclass from typing import List, Optional, Dict, Union, Tuple # ====================== # 1. Lexer: 词法分析 # ====================== class LexerError(Exception): """词法错误:包含非法字符或无法识别的 token""" pass @dataclass class Token: type: str value: Union[str, float, int] line: int column: int def __repr__(self): return f"Token({self.type}, {repr(self.value)})" class Lexer: def __init__(self, source: str): self.source = source self.pos = 0 self.line = 1 self.column = 1 self.tokens: List[Token] = [] self.keywords = { 'true': 'TRUE', 'false': 'FALSE', } def error(self, msg: str = "非法字符"): raise LexerError(f"词法错误在第 {self.line} 行 第 {self.column} 列: {msg}") def tokenize(self) -> List[Token]: while self.pos ': self.tokens.append(Token('GT', '>', self.line, self.column)) elif ch == '': self.tokens.append(Token('GT', '>', self.line, self.column)) elif ch == ' Token: self.pos += 1 if self.pos bool: if self.current.type == token_type: if value is not None and self.current.value != value: return False self.advance() return True return False def parse(self): """解析整个程序(多条语句,以分号分隔),返回最后一条语句的 AST""" statements = [] while self.current.type != 'EOF': stmt = self.parse_statement() if stmt is not None: statements.append(stmt) if self.match('SEMICOLON'): continue elif self.current.type != 'EOF': self.error(f"期望分号或结束,但得到 {self.current}") if not statements: return None return statements[-1] # 返回最后一条语句 def parse_statement(self): """解析一条语句:变量赋值或表达式""" # 变量赋值: x =...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【KIMI】整体而言,该实现质量很高,功能完整,结构清晰,错误处理全面。代码遵循了题目要求的架构和规范,测试用例覆盖全面。在所有评分维度上都表现优秀,是一个很好的实现。
相关链接
您可以通过以下链接查看更多相关内容: