37 void add(
unsigned col, T_Char c)
override;
38 void setLine(
unsigned line)
override;
39 void setSource(std::string_view src)
override;
45 { m_1stFits = states; m_isFinal = isFinal; m_1stFitN = stateN; }
47 { m_stateRecs = stateRecs; m_gotoN = gotoN; }
52 typedef std::vector<T_Char> C_ChStack;
53 typedef std::vector<C_SourcePos> C_PosStack;
57 std::string_view m_OldSrc;
58 std::string_view m_CurSrc;
64 C_ChStack m_ReadCh, m_UnreadCh;
65 C_PosStack m_ReadPos, m_UnreadPos;
68 const C_StateRec *m_stateRecs {
nullptr};
69 const T_Input *m_gotoN {
nullptr};
70 const T_State *m_1stFits {
nullptr};
76 void addToken(
T_LexID token, C_SourcePos pos, I_LexAttr *unownedAttr);
77 void resetReadState();
78 void shrinkReadSize(
size_t newSize);
93 for (
bool consumed =
false;;)
96 if (m_UnreadCh.empty())
102 m_ReadCh.emplace_back(c);
103 m_ReadPos.emplace_back(m_CurSrc, m_CurLine, col);
108 m_ReadPos.emplace_back(m_UnreadPos.back());
109 m_UnreadPos.pop_back();
110 m_ReadCh.emplace_back(m_UnreadCh.back());
111 m_UnreadCh.pop_back();
115 const T_LexID idTop = C_Traits::id(m_ReadCh.back());
118 const auto gotos = m_stateRecs[m_CurState].m_goto;
121 for (
int i = m_gotoN[m_CurState]; i > 0;)
123 const auto pt = gotos[--i];
124 if (pt.m_inputLB <= idTop)
126 nextState = pt.m_nextState;
127 if (std::numeric_limits<T_State>::max() != nextState)
135 m_CurState = nextState;
136 if (
auto pAction = m_stateRecs[nextState].m_action)
139 for (
size_t i = 0; i < m_1stFitN; ++i)
140 if (m_1stFits[i] == nextState &&
141 (!m_isFinal[i] || (*m_isFinal[i])(m_ReadCh.data(), m_ReadCh.size())))
144 const C_ActionRet ret = (*pAction)(m_ReadCh.data(), m_ReadCh.size());
145 return addToken(ret.
m_id, m_ReadPos.front(), ret.
m_pAttr);
147 m_LastSuccess =
int(m_ReadCh.size());
155 const auto pos = m_ReadPos.front();
158 if (m_LastSuccess < 0)
162 token = C_Traits::id(m_ReadCh.front());
168 for (
auto i: m_ReadCh)
169 switch (
auto id = C_Traits::id(i))
177 RUNTIME_ERROR(
"Run out of scanner at {}({},{},{}) |{}|", pos.m_Source, pos.m_Line, pos.m_Col, m_CurState, buf);
182 shrinkReadSize(
size_t(m_LastSuccess));
183 const C_ActionRet ret = (*m_pAction)(m_ReadCh.data(), m_ReadCh.size());
189 addToken(token, pos, attr);
194void C_ScannerImpl<T_Input,T_State,T_Char,C_Traits>::addToken(
211void C_ScannerImpl<T_Input,T_State,T_Char,C_Traits>::resetReadState()
232void C_ScannerImpl<T_Input,T_State,T_Char,C_Traits>::shrinkReadSize(
size_t newSize)