GF语法从concrete文件实现受限多态的问题咨询
问题解答
问题1:是否有方法从concrete文件层面强制抽象语法仅输出匹配的参数?
GF的默认随机生成逻辑优先基于抽象语法的所有合法组合遍历,concrete语法本身不能直接修改抽象语法的结构限制,但可以通过标记不匹配组合为无效线性化分支的方式,间接实现过滤效果,无需修改抽象语法定义。
问题2:当参数不匹配时,是否可以要求抽象语法重新生成参数,而非直接生成空行?
可以,你只需要把不匹配分支的返回值改为空变体集variants {}即可。GF的生成器遇到无法完成线性化的无效分支时,会自动丢弃当前的抽象语法树组合,重新生成新的参数组合,直到得到可正常线性化的合法树,不会再输出空行或者使用nonExist的无效内容。
修改后的concrete文件代码示例
你只需要修改MySentence的线性化逻辑即可,其他代码无需改动:
lin -- MySentence 仅在关系匹配时生成合法语句,不匹配的组合会被生成器自动过滤 MySentence action person = case <action.rel, person.rel> of { <RelA, RelA> => sayHi (action.v) (person.n); <RelB, RelB> => sayHi (action.v) (person.n); <_, _> => variants {} };
补充说明
- 该方案完全不需要修改抽象语法,新增名词、动词或者关系类型时,仅需要在concrete层面给对应条目设置
rel属性即可,符合你要求的「编写名称的人员自行决定可问候范围」的需求。 - 如果你的GF版本支持,也可以用
error "invalid combination"替代variants {},效果一致,只是在手动线性化不合法组合时会抛出明确错误提示,方便调试。
内容的提问来源于stack exchange,提问作者yousef almesbahi
相关产品推荐
相关产品推荐

