# KEHOME/src/phrase.icn # Sep/11/2005 # Aug/31/2008 more error checks # basic operatios on phrases #=======================================================# # PHRASE class record PHRASE ( pvalue # blank-separated list (blanks deleted by map_token()) ) # methods: # new_phrase(pvalue) # phrase_unparse(p) # phrase_tsize(p) # phrase_map_symbol(symbol,tokenlist) # phrase_parse(line) # phrase_list(p) # phrase_append(p,word) # PHRASE procedure new_phrase(x) #====================== local y case type(x) of { default: { fail } "list": { return PHRASE(x) } "string": { return PHRASE([x]) } ###### tokenstring (during parsing) #####y := [] #####every put(y,!x) #####return PHRASE(y) #####} } # end case type() end procedure phrase_writes(fd,p) #============================ local saveCHARFORMAT saveCHARFORMAT := CHARFORMAT; CHARFORMAT := "line" writes(fd,"PHRASE(") writes_any(fd,p.pvalue) writes(fd,")") CHARFORMAT := saveCHARFORMAT end # string procedure phrase_unparse(p) #========================== local x,y,z,n,i static lsep,psep,warning initial { warning := "WARNING: phrase_unparse: " lsep := "," psep := PSEPARATOR # blank } case type(p) of { default: { y := "*** NOT a phrase ("||unparse(p)||") ***" } "PHRASE": { y := unparse(phrase_list(p),psep) } ### x := p.pvalue ### n := *x ### y := "" ### i := 0 ### case type(x) of { ### default: { ### writes_type_all(x,warning||"not a PHRASE list") ### y := p ### } ### "string": { ### y := x ### } # end "string" ### "list": { ### every z := !x do { ### i +:= 1 ### y ||:= unparse(z,psep,psep) ### if i < n then ### y ||:= psep ### } # end every z ### } # end "list" ### } # end case type(x) ### } # end "PHRASE" } # end case type(p) return y end # integer procedure phrase_tsize(x) #======================== initial { /PSEPARATOR := " " } return tsize(x.pvalue) end # PHRASE procedure phrase_map_symbol(symbol,tokenlist) #============================================ return PHRASE(map_symbol(symbol.pvalue,tokenlist)) end # PHRASE procedure phrase_parse(line) #=========================== # words separated by white space # SYMBOL("phrase",[word,...]) # sep ignored (use PSEPARATOR) local plist static psep,nonblank initial { psep := WhiteSpace nonblank := &cset -- psep } #line := trimws(line) plist := [] line ? { while tab(upto(nonblank)) do put(plist,tab(many(nonblank))) } return PHRASE(plist) end # list procedure phrase_list(p) #======================= local head static ierror initial ierror := "Internal ERROR: phrase_list: " case type(p) of { "PHRASE": { return p.pvalue } default: { head := ierror||"not a phrase" writes_type_all(p,head) return [head] } } end # PHRASE procedure phrase_append(p,w) #=========================== # append word to phrase local x x := phrase_list(p) put(x,w) return PHRASE(x) end #======================================================#