示例#1
0
文件: in.go 项目: pschlump/lexie
func (Im *ImType) OutputDef() {
	fmt.Printf("Defs - OutputDef\n")
	for _, DefType := range []string{"Machines", "Errors", "ReservedWords", "Tokens"} {
		dd := Im.Def.DefsAre[DefType]
		fmt.Printf("==========================================================================\n")
		fmt.Printf("DefType: %s\n", DefType)
		fmt.Printf("==========================================================================\n")

		ss := com.SortMapStringString(dd.NameValueStr)
		// for AKey, ADef := range dd.NameValueStr {
		for _, AKey := range ss {
			ADef := dd.NameValueStr[AKey]
			fmt.Printf("    %s=%v\n", AKey, ADef)
		}
	}
}
示例#2
0
文件: in.go 项目: pschlump/lexie
// -----------------------------------------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------------
func (Im *ImType) FinializeFile() {
	ADef := ""
	AKey := ""

	// for DefType, dd := range Im.Def.DefsAre {
	for _, DefType := range []string{"Machines", "Errors", "Tokens", "ReservedWords"} {
		dd := Im.Def.DefsAre[DefType]
		// fmt.Printf("DefType (FinializeFiile): %s\n", DefType)
		// Pass 1 - Take Numbers and put in
		ss := com.SortMapStringString(dd.NameValueStr)
		// for AKey, ADef := range dd.NameValueStr {
		for _, AKey = range ss {
			ADef = dd.NameValueStr[AKey]
			if len(ADef) > 0 && IsNumeric(ADef) {
				// fmt.Printf("Found numeric for %s=%s\n", AKey, ADef)
				v, err := strconv.Atoi(ADef)
				if err != nil {
					fmt.Printf("Error: Invalid numeric value for a token, >%s<, error=%s\n", ADef, err)
				} else {
					dd.NameValue[AKey] = v
					dd.Reverse[v] = AKey
				}
			}
		}
		// Pass 2 - Assign All Others
		seq := dd.Seq
		// for AKey, ADef := range dd.NameValueStr {
		for _, AKey = range ss {
			ADef = dd.NameValueStr[AKey]
			if len(ADef) > 0 && IsNumeric(ADef) {
			} else if len(ADef) == 0 {
				// fmt.Printf("Found sequence assign for for %s=%s\n", AKey, ADef)
				for _, ok := dd.Reverse[seq]; ok; {
					seq++
					_, ok = dd.Reverse[seq]
				}
				dd.NameValue[AKey] = seq
				dd.Reverse[seq] = AKey
				dd.NameValueStr[AKey] = fmt.Sprintf("%d", seq)
				// fmt.Printf("     Assigned %d\n", seq)
				seq++
			}
		}
		dd.Seq = seq

		// fmt.Printf("dd.NameValue = %v\n", dd.NameValue)

		// Pass 3 - Assign Tokens
		// for AKey, ADef := range dd.NameValueStr {
		for _, AKey = range ss {
			ADef = dd.NameValueStr[AKey]
			if len(ADef) > 0 && IsNumeric(ADef) {
			} else if len(ADef) > 0 {
				// fmt.Printf("Found Name Assign for for %s=%s\n", AKey, ADef)
				if v, ok := dd.NameValue[ADef]; ok {
					dd.NameValue[AKey] = v
					dd.Reverse[v] = AKey
				}
			}
		}
		// Pass 4 - Look for any unsigned
		// for AKey, ADef := range dd.NameValueStr {
		for _, AKey = range ss {
			ADef = dd.NameValueStr[AKey]
			if len(ADef) > 0 && IsNumeric(ADef) {
			} else if len(ADef) > 0 {
				if v, ok := dd.NameValue[ADef]; ok {
					dd.NameValue[AKey] = v
					dd.Reverse[v] = AKey
				} else {
					v := Im.FindValueFor(ADef)
					if v < 0 {
						fmt.Printf("Warning: Token is not defined, Automatically defining!, ADef/AKey %s=%s=%d\n", ADef, AKey, seq) // !! !! Requries a 4th pass - after all defined !! !!
						dd.NameValue[AKey] = seq
						dd.Reverse[seq] = AKey
						seq++
					} else {
						dd.NameValue[AKey] = v
						dd.Reverse[v] = AKey
					}
				}
			}
		}
		Im.Def.DefsAre[DefType] = dd
	}

	for _, vv := range Im.Machine {
		for _, ww := range vv.Rules {
			if len(ww.RvName) > 0 {
				// fmt.Printf("%-20s", fmt.Sprintf(" Rv:%d=%s ", ww.Rv, ww.RvName))
				ww.Rv = Im.Lookup("Tokens", ww.RvName)
			}
			if len(ww.CallName) > 0 {
				// fmt.Printf("%-20s", fmt.Sprintf(" Call:%d=%s ", ww.Call, ww.CallName))
				ww.Call = Im.Lookup("Machines", ww.CallName)
			}
		}
	}

	// xyzzy-Machine--Mixins---
	for kk, vv := range Im.Machine {
		var tRules []*ImRuleType
		tRules = make([]*ImRuleType, 0, 100)
		for _, rr := range vv.Rules {
			p := Im.LocatePattern(rr, tRules) // A merge operation - if not found then append, else replace
			if p >= 0 {
				tRules[p] = rr
			} else {
				tRules = append(tRules, rr)
			}
		}
		for _, ww := range vv.Mixins {
			ii := Im.Lookup("Machines", ww)
			if ii >= 0 && ii < len(Im.Machine) {
				for _, uu := range Im.Machine[ii].Rules {
					p := Im.LocatePattern(uu, tRules) // A merge operation - if not found then append, else replace
					if p < 0 {
						tRules = append(tRules, uu)
					}
				}
			} else {
				fmt.Printf("Error: Mixin - did not find %s as a machine name\n", ww)
			}
		}
		Im.Machine[kk].Rules = tRules
	}

	dd := Im.Def.DefsAre["Tokens"]
	Tok_map = dd.Reverse
}