You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

属性文法中actual value与expected value的定义及适用场景是什么?

actual与expected属性的定义及适用场景

核心定义

这两类属性是属性文法在做语义校验(最常见的是类型检查)场景下的通用属性分类,并不局限于类型,也可扩展到值范围、作用域等校验场景:

  • actual属性(实际属性):语法符号的固有属性,可直接从自身的子节点推导得到,无需依赖外部上下文的约束,是该节点本身固有的语义信息。
  • expected属性(期望属性):外部上下文对当前语法符号的约束要求,需要从父节点或者兄弟节点传递而来,用于校验当前节点的语义是否符合所在位置的要求。

结合示例的场景说明

你给出的赋值语句例子刚好覆盖了两类属性的典型使用方式:

示例1:赋值语句产生式

<assign> → <id> = <expr>

对应的语义规则:

<expr>.expected_type ← <id>.actual_type
这里的<id>是已经在符号表中完成定义的变量,它的类型是已经确定的固有信息,所以actual_type是它的actual类属性。而赋值操作要求右侧表达式的类型必须和左侧变量匹配,因此需要把左侧变量的实际类型作为约束要求传递给右侧的<expr>,这个约束就是<expr>的expected_type,用于后续对表达式内部的类型校验。

示例2:标识符表达式产生式

<expr> → <id>

对应的语义规则:

<expr>.actual_type ← <id>.actual_type
这里的表达式直接由标识符构成,所以表达式本身的实际类型可以直接从子节点<id>的actual_type推导得到,不需要额外的外部约束,推导得到的结果就是<expr>自身的actual_type。
后续只需要判断<expr>.actual_type和<expr>.expected_type是否相等,就能完成赋值语句的类型合法性校验。

常见误解说明

你之前总结的“产生式左侧是actual、右侧是expected”的规律不成立,核心原因是两类属性的划分和产生式的左右位置无关,只由属性的来源和用途决定:

  • 自底向上从子节点推导、用于向上层传递自身固有信息的属性,都属于actual类属性,和它在产生式的左右侧没有关系
  • 从父节点/兄弟节点传递而来、用于约束当前节点必须满足对应要求的属性,都属于expected类属性

举个扩展的例子:函数调用产生式<call> → <func_name> ( <arg_list> )的语义校验中,会先从<func_name>的actual_type里拿到函数定义的参数类型列表,作为expected_type传递给<arg_list>;同时<arg_list>的每个参数会从自身子节点推导得到actual_type,最后比对每个参数的actual和expected属性是否一致,就能完成函数调用的参数类型校验。

内容的提问来源于stack exchange,提问作者user9178840

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:18:03