DFX2xxx —— 词法与语法
DFX2xxx —— 词法与语法
DFX2xxx —— 词法与语法
生成标记之间的块由
.skill/gen-diagnostics.ps1写入。 标记之下的所有内容都是手写的,重新生成后仍然保留。
DFX2000
严重级别: 错误 (error)
消息:
Unknown document type '%s'. Expected System, Emitter, Module or DynamicInput.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:2016
原因. 文件的第一个词不是四种文档类型之一。
修复. 写 System、Emitter、Module 或 DynamicInput,并与文件扩展名一致。
DFX2001
严重级别: 错误 (error)
消息:
Expected '{' to open a raw block but found '%s'.触发位置: Source/DreamFX/Private/Parser/DreamFXLexer.cpp:410、Source/DreamFX/Private/Parser/DreamFXParser.cpp:101
原因. 一个需要 raw block 的构造后面没有跟 {。
修复. 补上花括号。hlsl 和 Body 永远是 hlsl { ... } / Body = { ... }。
DFX2002
严重级别: 错误 (error)
消息:
Expected a name but found %s.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:112
原因. 这里期待一个标识符 —— 模块名、输入名、发射器名。
修复. 检查报出位置之前有没有多余的标点。
DFX2003
严重级别: 错误 (error)
消息:
Expected a number but found '%s'.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:425
原因. 这里期待一个数字:向量字面量里、box() 里,或者曲线的键上。
修复. 向量分量和曲线时间只能是数字,参数引用不能出现在那里。
DFX2004
严重级别: 错误 (error)
消息:
Expected a value but found %s.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:612
原因. = 后面期待一个值。
修复. 要么右边少了东西,要么上一条语句少了 ;。
DFX2005
严重级别: 错误 (error)
消息:
'#EndRegion' has no matching '#Region'.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:941
原因. 出现了 #EndRegion,但没有打开着的 #Region。
修复. 删掉它,或者补上开头的 #Region "..."。
DFX2006
严重级别: 错误 (error)
消息:
Unknown directive '#%s'. Expected Region or EndRegion.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:951
原因. 指令只有 #Region 和 #EndRegion 两个。
修复. 检查拼写。#Region 是一种注释装置(L5),从不到达资产。
DFX2007
严重级别: 错误 (error)
消息:
Expected a version after '@'.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1010、Source/DreamFX/Private/Parser/DreamFXParser.cpp:491、Source/DreamFX/Private/Parser/DreamFXParser.cpp:512
原因. @ 引入一个 R7 版本固定,后面必须跟版本号。
修复. 写 ModuleName@1.2,或者把 @ 去掉。
DFX2008
严重级别: 错误 (error)
消息:
Module '%s' was given a positional argument. Module inputs must be written as 'Name = Value'.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1029、Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:1233
原因. 模块调用被喂了一个裸值。Niagara 按名字寻址模块输入,而它们在栈 UI 里出现的顺序并不是声明顺序。
修复. 每个实参都写成 Name = Value。dfx schema <Module> 会列出名字。
DFX2010
严重级别: 警告 (warning)
消息:
'#Region \"%s\"' was never closed with '#EndRegion'.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1104
原因. 一个 #Region 到块结束都没等到 #EndRegion。无害 —— region 只是文本 —— 但通常意味着某一段被搬走了,闭合行留在了原地。
修复. 补上 #EndRegion。
DFX2013
严重级别: 错误 (error)
消息:
'%s' is a system-scope stack and must be written at the top level of a .dfs, not inside an emitter.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1310
原因. SystemSpawn 和 SystemUpdate 属于系统,不属于发射器(L1)。
修复. 把这个块挪到 .dfs 的顶层,和 Emitter 块并列。
DFX2015
严重级别: 错误 (error)
消息:
'from' must be followed by a quoted path to a .dfe source file.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1726
原因. from 后面要跟一个带引号的 .dfe 路径。
修复. 加引号。扩展名可省;路径先相对本文件解析。
DFX2016
严重级别: 错误 (error)
消息:
(built at runtime)触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1254
原因. 一个 Defaults = { … } 块里出现了赋值以外的东西。默认值说的是「没人写过它时读出什么」,模块调用在那里没有任何含义。
修复. 把模块调用挪进某个栈(ParticleSpawn、ParticleUpdate…)。Defaults 里只能写 <type> Namespace.Name = value;。
DFX2018
严重级别: 错误 (error)
消息:
A Module or DynamicInput must declare a 'Body = { }' block.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1914
原因. 一个没有 Body 的 .dfm 只声明了输入,生成出来的模块什么都不做。
修复. 加上 Body = { ... }。
DFX2019
严重级别: 错误 (error)
消息:
Header argument '%s' must be a quoted string.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1942、Source/DreamFX/Private/Parser/DreamFXParser.cpp:1961、Source/DreamFX/Private/Parser/DreamFXParser.cpp:1970、Source/DreamFX/Private/Parser/DreamFXParser.cpp:1978
原因. 文件头的参数(Name=、Root=)是带引号的字符串。
修复. 给值加引号。
DFX2020
严重级别: 错误 (error)
消息:
Unknown curve key attribute '%s'. Expected Interp, Tangent, Arrive or Leave.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:396
原因. 曲线键的属性列表只接受 Interp、Arrive 和 Leave(plan 3.5)。
修复. 检查拼写。切线只有在 Interp 让它有意义时才被采纳。
DFX2021
严重级别: 错误 (error)
消息:
File declares '%s' but its extension is '%s'. Rename the file to '%s' or change the declaration.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:2030
原因. 声明的文档类型和文件扩展名对不上。
修复. 改文件名或改声明 —— 构建是按扩展名枚举源码的。
DFX2022
严重级别: 错误 (error)
消息:
Unexpected '%s' after the end of the document. A DreamFX file declares exactly one top-level object.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:2059
原因. 顶层对象的收尾花括号后面还有内容。通常是某个块被复制了一份,或者上面某处少了一个花括号。
修复. 一个文件,一个顶层对象。报出的位置是多余内容开始的地方,不是花括号失配的地方。
DFX2023
严重级别: 错误 (error)
消息:
'%s' is a module call, so it cannot be given a type. Types are written only on assignments.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1070
原因. 模块调用前面写了类型。类型是给赋值用的 —— L2 需要知道一个新属性是什么类型;模块调用的类型来自它自己的 schema。
修复. 把类型去掉。
DFX2024
严重级别: 错误 (error)
消息:
A Defaults declaration cannot be disabled; defaults are not executed stack nodes.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1248
原因. disabled 被用在了 Defaults 内的一个声明上。默认值注册的是参数值;它们不是可执行的栈节点。可执行的栈赋值和模块调用确实支持 disabled。
修复. 从默认值声明中移除 disabled,如果这个参数不再需要,就直接删掉该声明本身。
DFX2025
严重级别 错误
消息
Unknown OnEvent argument '%s'. Expected Source, Event, Mode, SpawnNumber, MaxEventsPerFrame, UpdateAttributeInitialValues, RandomSpawnNumber or MinSpawnNumber.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1468、Source/DreamFX/Private/Parser/DreamFXParser.cpp:1476、Source/DreamFX/Private/Parser/DreamFXParser.cpp:1491
原因. 一个 OnEvent(...) 头部带了一个解析器不认识的参数,或者某个参数缺了值,或者必填参数(Source、Event)根本没写。
这个头部不是模块调用 —— 它的参数配置的是处理器自身(听哪个 emitter 的事件、怎么花掉它们),
所以接受的集合是固定的:Source(本系统里的 emitter 名)、Event(事件名,带引号)、Mode(SpawnedParticles 或 EveryParticle)、SpawnNumber、MaxEventsPerFrame、UpdateAttributeInitialValues、RandomSpawnNumber、MinSpawnNumber。响应事件的模块写在块里面,不写在头部。
修复. 按上面的列表拼写参数(匹配时忽略大小写),每个参数给一个形状正确的值 ——
Source 和 Mode 是标识符,Event 是名字或字符串,数量是整数,标志是 true/false ——
并且至少写上 Source 和 Event:
OnEvent(Source = Sparks, Event = "LocationEvent", Mode = SpawnedParticles, SpawnNumber = 1) = {
ReceiveLocationEvent();
}DFX2026
严重级别 错误
消息
Unknown Stage argument '%s'. Expected a stage iteration, enabled, dispatch or particle-state option; see the Stage language reference.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:1690、Source/DreamFX/Private/Parser/DreamFXParser.cpp:1698
原因. 一个 Stage name(...) 头部包含了一个未知参数,或者某个参数的值类型不对。Stage 选项涵盖迭代、启用、执行行为、直接派发、线程组和粒子状态过滤。
修复. 使用 Stage 参考 中的参数名和值类型。裸 Stage name = { } 使用引擎默认值;参数绑定必须命名一个对应类型的参数。
DFX2027
严重级别 错误
消息
Group(...) takes a quoted name: Group(\"Name\") { ... }.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:839
原因. 一个 Group(...) 声明的名字没加引号或者缺失。
修复. 写一个带引号的名字,例如 Group("Sparks") { ... }。
DFX2028
严重级别 错误
消息
Group(...) requires a non-empty name.触发位置: Source/DreamFX/Private/Parser/DreamFXParser.cpp:847
原因. 一个 Group(...) 声明使用了空名字。
修复. 给这个组一个非空名字,这样它的 emitter 才能有一致地组织起来。