如何在TextX语法的有序选择表达式中使用链接规则引用
问题根因
你遇到的语法报错是因为textX不支持直接在赋值表达式的选择组中混用交叉引用语法[规则名]和其他匹配项,你写的Field: type=([DataType] | ID) name=ID;不符合textX的语法规范。
修复方案
将类型匹配拆分为独立的子规则,分别处理自定义DataType引用和简单类型匹配即可,修改后的完整语法如下:
Library: data_types *= DataType ; DataType: name=ID "{" fields*=Field "}" ; Field: type=Type name=ID; Type: DataTypeRef | SimpleType; // 单独处理自定义数据类型的交叉引用 DataTypeRef: [DataType]; // 简单类型匹配,可根据需要调整正则支持更多内置类型 SimpleType: /int(8|16|32|64)|float(32|64)|bool|string/;
如果你不需要限制简单类型的命名范围,希望支持任意字符串作为简单类型名,可将SimpleType规则替换为:
SimpleType: ID;
后续如果需要区分字段类型是自定义DataType还是简单类型,只需在模型校验阶段判断type对象的类型即可:属于DataType类实例就是自定义类型,属于字符串类型就是简单类型。
效果验证
你提供的模型示例完全适配上述语法:
vec属于自定义DataType,matrix的字段类型引用vec时会匹配DataTypeRef分支,自动完成引用关联int64会匹配SimpleType分支,作为内置简单类型处理
修改后重新执行textx generate dummy.tx --target dot即可正常生成dot文件,不会再报语法错误。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

