internal bool AddNfaNode(NfaNode nfa) { if (!m_nfa.Add(nfa)) { return(false); } if (nfa.m_sTerminal != "") { int qi, n = 0; string tokClass = ""; string p = nfa.m_sTerminal; if (p[0] == '%') { // check for %Tokname special action for (n = 0, qi = 1; qi < p.Length; qi++, n++) // extract the class name { if (p[qi] == ' ' || p[qi] == '\t' || p[qi] == '\n' || p[qi] == '{' || p[qi] == ':') { break; } } tokClass = nfa.m_sTerminal.Substring(1, n); } // check for ResWds machinery // 4.7 if (n > 0 && n + 1 < p.Length) { string st = nfa.m_sTerminal.Substring(n + 1).Trim(); if (st.Length > 0) { if (st.StartsWith("%except")) { m_reswds = nfa.m_state; m_tks.m_tokens.reswds[nfa.m_state] = ResWds.New(m_tks, st.Substring(7)); } } } // special action is always last in the list if (tokClass == "") { //nfa has an old action if (m_tokClass == "" // if both are old-style || // or we have a special action that is later (m_actions.a_act) > nfa.m_state) // m_actions has at least one entry { AddAction(nfa.m_state); } // else we have a higher-precedence special action so we do nothing } else if (m_actions == null || m_actions.a_act > nfa.m_state) { MakeLastAction(nfa.m_state); m_tokClass = tokClass; } // else we have a higher-precedence special action so we do nothing } return(true); }
internal bool AddNfaNode(NfaNode nfa) { if (!this.m_nfa.Add(nfa)) { return(false); } if (nfa.m_sTerminal != "") { int length = 0; string str1 = ""; string sTerminal = nfa.m_sTerminal; if (sTerminal[0] == '%') { length = 0; int index = 1; while (index < sTerminal.Length && (sTerminal[index] != ' ' && sTerminal[index] != '\t') && (sTerminal[index] != '\n' && sTerminal[index] != '{' && sTerminal[index] != ':')) { ++index; ++length; } str1 = nfa.m_sTerminal.Substring(1, length); } if (length > 0 && length + 1 < sTerminal.Length) { string str2 = nfa.m_sTerminal.Substring(length + 1).Trim(); if (str2.Length > 0 && str2.StartsWith("%except")) { this.m_reswds = nfa.m_state; this.m_tks.m_tokens.reswds[(object)nfa.m_state] = (object)ResWds.New(this.m_tks, str2.Substring(7)); } } if (str1 == "") { if (this.m_tokClass == "" || this.m_actions.a_act > nfa.m_state) { this.AddAction(nfa.m_state); } } else if (this.m_actions == null || this.m_actions.a_act > nfa.m_state) { this.MakeLastAction(nfa.m_state); this.m_tokClass = str1; } } return(true); }