// Converts the subject of a substitution expr like $'*' to a valid ident- // ifier, under the assumption that it doesn't refer to a rule or label. static Symbol PickVarNameForLNode(LNode label) { if (label.IsId) { // Ignore the predefined special substitutions $LA and $LI //if (label.Name.Name == "LA" || label.Name.Name == "LI") // return null; return(GSymbol.Get("tok_" + label.Name)); } else if (label.IsLiteral) { return(LiteralToVarName(label.Value)); } else if (label.Calls(S.Dot, 2)) { return(GSymbol.Get("tok__" + label.Args[1].Name)); } else if (label.Calls(S.DotDot, 2) || label.Calls(S.DotDotDot, 2)) { return(GSymbol.Get(PickVarNameForLNode(label[0]).Name + "_" + PickVarNameForLNode(label[1]).Name)); } else // can't return null { return(GSymbol.Get(label.GetHashCode().ToString())); } }
// Converts the subject of a substitution expr like $'*' to a valid ident- // ifier, under the assumption that it doesn't refer to a rule or label. static Symbol PickVarNameForLNode(LNode label) { if (label.IsId) { // Ignore the predefined special substitutions $LA and $LI //if (label.Name.Name == "LA" || label.Name.Name == "LI") // return null; return GSymbol.Get("tok_" + label.Name); } else if (label.IsLiteral) { return LiteralToVarName(label.Value); } else if (label.Calls(S.Dot, 2)) return GSymbol.Get("tok__" + label.Args[1].Name); else if (label.Calls(S.DotDot, 2)) return GSymbol.Get(PickVarNameForLNode(label[0]).Name + "_" + PickVarNameForLNode(label[1]).Name); else // can't return null return GSymbol.Get(label.GetHashCode().ToString()); }