public static DFAState <Token, Function> AddState(DFAState <Token, Function> state) { if (state.Id >= States.Length) { int newLength; if (state.Id < 2 * States.Length) { newLength = 2 * States.Length; } else { newLength = state.Id + 1; } DFAState <Token, Function>[] oldStates = States; States = new DFAState <Token, Function> [newLength]; oldStates.CopyTo(States, 0); } if (States[state.Id] != null) { throw new DFAException("state.Id must be equal to States index!", 0, state.Id); } States[state.Id] = state; return(state); }
private static void InitNumericStates() { DFAState <int, LexicalFunction> s5 = AddState(new LexicalState(5, false)); //Numeric begin state; DFAState <int, LexicalFunction> s6 = AddState(new LexicalState(6, false)); //Number dot state; DFAState <int, LexicalFunction> s7 = AddState(new LexicalState(7, true, LexicalFunction.OutputNumeric)); //Number quit state; //s0 [0-9] s5 s0.AddNextState('0', '9', s5.Id); s0.AddNextState('0', '9', s5.Id); //s5 [0-9] s5 s5.AddNextState('0', '9', s5.Id); s5.AddNextState('0', '9', s5.Id); //s5 [\.] s6 s5.AddNextState('.', s6.Id); //s5 else s7 (integer) s5.AddElseState(s7.Id); //s6 [0-9] s6 s6.AddNextState('0', '9', s6.Id); s6.AddNextState('0', '9', s6.Id); //s6 else s7 (float) s6.AddElseState(s7.Id); }
private static void InitChineseStates() { DFAState <int, LexicalFunction> s8 = AddState(new LexicalState(8, false)); //Numeric begin state; DFAState <int, LexicalFunction> s9 = AddState(new LexicalState(9, true, LexicalFunction.OutputChinese)); //Number quit state; //s0 [4e00-9fa5] s5 s0.AddNextState(0x4e00, 0x9fa5, s8.Id); s8.AddNextState(0x4e00, 0x9fa5, s8.Id); s8.AddElseState(s9.Id); }
private static void InitEndOfLineStates() { DFAState <int, LexicalFunction> s10 = AddState(new LexicalState(10, false)); //EOL begin state; DFAState <int, LexicalFunction> s11 = AddState(new LexicalState(11, true, LexicalFunction.OutputEndOfLine)); //EOL quit state; //s0 [ \t\r\n] s3 s0.AddNextState(new int[] { '\r', '\n' }, s10.Id); //s3 [ \t\r\n] s3 s10.AddNextState(new int[] { '\r', '\n' }, s10.Id); //s3 ^[ \t\r\n] s4 s10.AddElseState(s11.Id); }
private static void InitSpaceStates() { DFAState <int, LexicalFunction> s3 = AddState(new LexicalState(3, false)); //Space begin state; DFAState <int, LexicalFunction> s4 = AddState(new LexicalState(4, true, LexicalFunction.OutputSpace)); //Space quit state; //s0 [ \t\r\n] s3 s0.AddNextState(new int[] { ' ', '\t' }, s3.Id); //s3 [ \t\r\n] s3 s3.AddNextState(new int[] { ' ', '\t' }, s3.Id); //s3 ^[ \t\r\n] s4 s3.AddElseState(s4.Id); }
private static DFAState <int, LexicalFunction> sother = AddState(new LexicalState(255, true, LexicalFunction.Other)); //Start state; private static void InitIdentifierStates() { DFAState <int, LexicalFunction> s1 = AddState(new LexicalState(1)); //Identifier begin state; DFAState <int, LexicalFunction> s2 = AddState(new LexicalState(2, true, LexicalFunction.OutputIdentifier)); //Identifier quit state; //s0 [_a-zA-Z] s1 s0.AddNextState('_', s1.Id); s0.AddNextState('a', 'z', s1.Id); s0.AddNextState('A', 'Z', s1.Id); s0.AddNextState('a', 'z', s1.Id); s0.AddNextState('A', 'Z', s1.Id); //s1 [_a-zA-Z0-9] s1 s1.AddNextState('_', s1.Id); s1.AddNextState('a', 'z', s1.Id); s1.AddNextState('A', 'Z', s1.Id); s1.AddNextState('0', '9', s1.Id); s1.AddNextState('a', 'z', s1.Id); s1.AddNextState('A', 'Z', s1.Id); s1.AddNextState('0', '9', s1.Id); //s1 ^[_a-zA-Z0-9] s2 s1.AddElseState(s2.Id); }