static void collect_sorts(SDF_Grammar grammar, SDF_SymbolList *sorts) { if (SDF_isGrammarSorts(grammar)) { SDF_Symbols symbols = SDF_getGrammarSymbols(grammar); SDF_SymbolList symbolList = SDF_getSymbolsList(symbols); while (!SDF_isSymbolListEmpty(symbolList)) { SDF_Symbol symbol = SDF_getSymbolListHead(symbolList); if (SDF_isSymbolSort(symbol)) { if (SDF_isSymbolListEmpty(*sorts)) { *sorts = SDF_makeSymbolListSingle(symbol); } else { *sorts = SDF_makeSymbolListMany(symbol, SDF_makeLayoutEmpty(), *sorts); } } if (SDF_isSymbolListSingle(symbolList)) { break; } symbolList = SDF_getSymbolListTail(symbolList); } } }
static PT_Symbols SDFSymbolsToPtSymbols(SDF_Symbols sdfSymbols) { SDF_SymbolList sdfSymbolList = SDF_getSymbolsList(sdfSymbols); PT_Symbols ptSymbols = PT_makeSymbolsEmpty(); while (SDF_hasSymbolListHead(sdfSymbolList)) { SDF_Symbol sdfSymbol = SDF_getSymbolListHead(sdfSymbolList); PT_Symbol ptSymbol = SDFSymbolToPtSymbol(sdfSymbol); ptSymbols = PT_appendSymbols(ptSymbols, ptSymbol); if (SDF_isSymbolListSingle(sdfSymbolList)) { break; } sdfSymbolList = SDF_getSymbolListTail(sdfSymbolList); } return ptSymbols; }