ATbool SDF_hasPreferAttribute(SDF_Production prod) { ATbool found = ATfalse; SDF_Attributes attrs = SDF_getProductionAttributes(prod); if (!SDF_isAttributesNoAttrs(attrs)) { SDF_AttributeList attrList = SDF_getAttributesList(attrs); while (SDF_hasAttributeListHead(attrList) && !found) { SDF_Attribute attr = SDF_getAttributeListHead(attrList); if (SDF_isAttributePrefer(attr)) { found = ATtrue; } if (SDF_isAttributeListSingle(attrList)) { break; } attrList = SDF_getAttributeListTail(attrList); } } return found; }
static PT_Attr SDFAttributeToPtAttr(SDF_Attribute sdfAttribute) { PT_Attr ptAttr = NULL; if (SDF_isAttributeBracket(sdfAttribute)) { ptAttr = PT_makeAttrBracket(); } else if (SDF_isAttributeReject(sdfAttribute)) { ptAttr = PT_makeAttrReject(); } else if (SDF_isAttributePrefer(sdfAttribute)) { ptAttr = PT_makeAttrPrefer(); } else if (SDF_isAttributeAvoid(sdfAttribute)) { ptAttr = PT_makeAttrAvoid(); } else if (SDF_isAttributeId(sdfAttribute)) { SDF_ModuleName sdfModuleName = SDF_getAttributeModuleName(sdfAttribute); SDF_ModuleId sdfModuleId = SDF_getModuleNameModuleId(sdfModuleName); char *str = PT_yieldTree((PT_Tree) sdfModuleId); ptAttr = PT_makeAttrId(str); } else if (SDF_isAttributeAssoc(sdfAttribute)) { SDF_Associativity sdfAssoc = SDF_getAttributeAssociativity(sdfAttribute); PT_Associativity ptAssoc = NULL; if (SDF_isAssociativityLeft(sdfAssoc)) { ptAssoc = PT_makeAssociativityLeft(); } else if (SDF_isAssociativityRight(sdfAssoc)) { ptAssoc = PT_makeAssociativityRight(); } else if (SDF_isAssociativityNonAssoc(sdfAssoc)) { ptAssoc = PT_makeAssociativityNonAssoc(); } else if (SDF_isAssociativityAssoc(sdfAssoc)) { ptAssoc = PT_makeAssociativityAssoc(); } ptAttr = PT_makeAttrAssoc(ptAssoc); } else if (SDF_isAttributeId(sdfAttribute)) { char *moduleName = PT_yieldTreeToString((PT_Tree) sdfAttribute, ATfalse); ptAttr = PT_makeAttrId(moduleName); } else if (SDF_isAttributeTerm(sdfAttribute)) { ATerm term = ATmake(PT_yieldTreeToString((PT_Tree) sdfAttribute, ATfalse)); if (term == NULL) { ATerror("SDFAttributeToPtAttr (term): unable to convert %s\n", PT_yieldTreeToString((PT_Tree) sdfAttribute, ATfalse)); ptAttr = NULL; } else { ptAttr = PT_makeAttrTerm(term); } } else { ATerror("SDFAttributeToPtAttr: unable to convert %s\n", PT_yieldTreeToString((PT_Tree) sdfAttribute, ATfalse)); ptAttr = NULL; } return ptAttr; }