7#include "xfa/fxfa/formcalc/cxfa_fmlexer.h"
11#include "core/fxcrt/fx_extension.h"
15bool IsFormCalcCharacter(
wchar_t c) {
16 return (c >= 0x09 && c <= 0x0D) || (c >= 0x20 && c <= 0xd7FF) ||
17 (c >= 0xE000 && c <= 0xFFFD);
20bool IsIdentifierCharacter(
wchar_t c) {
25bool IsInitialIdentifierCharacter(
wchar_t c) {
31bool IsWhitespaceCharacter(
wchar_t c) {
40 const char* m_keyword;
43const XFA_FMKeyword keyWords[] = {
84const char*
const tokenStrings[] = {
85 "TOKand",
"TOKlparen",
"TOKrparen",
"TOKmul",
86 "TOKplus",
"TOKcomma",
"TOKminus",
"TOKdot",
87 "TOKdiv",
"TOKlt",
"TOKassign",
"TOKgt",
88 "TOKlbracket",
"TOKrbracket",
"TOKor",
"TOKdotscream",
89 "TOKdotstar",
"TOKdotdot",
"TOKle",
"TOKne",
90 "TOKeq",
"TOKge",
"TOKdo",
"TOKkseq",
91 "TOKksge",
"TOKksgt",
"TOKif",
"TOKin",
92 "TOKksle",
"TOKkslt",
"TOKksne",
"TOKksor",
93 "TOKnull",
"TOKbreak",
"TOKksand",
"TOKend",
94 "TOKeof",
"TOKfor",
"TOKnan",
"TOKksnot",
95 "TOKvar",
"TOKthen",
"TOKelse",
"TOKexit",
96 "TOKdownto",
"TOKreturn",
"TOKinfinity",
"TOKendwhile",
97 "TOKforeach",
"TOKendfunc",
"TOKelseif",
"TOKwhile",
98 "TOKendfor",
"TOKthrow",
"TOKstep",
"TOKupto",
99 "TOKcontinue",
"TOKfunc",
"TOKendif",
"TOKstar",
100 "TOKidentifier",
"TOKunderscore",
"TOKdollar",
"TOKexclamation",
101 "TOKcall",
"TOKstring",
"TOKnumber",
"TOKreserver",
106 const XFA_FMKeyword* result =
107 std::find_if(
std::begin(keyWords),
std::end(keyWords),
108 [str](
const XFA_FMKeyword& iter) {
109 return str.EqualsASCII(iter.m_keyword);
111 if (result !=
std::end(keyWords) && str.EqualsASCII(result->m_keyword))
112 return result->m_type;
132 str += WideString
::FromASCII(tokenStrings[m_type]);
148 while (!IsComplete() && m_spInput[m_nCursor]) {
149 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
154 switch (m_spInput[m_nCursor]) {
165 return AdvanceForString();
176 return AdvanceForNumber();
179 if (m_nCursor >= m_spInput.size())
182 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
186 if (m_spInput[m_nCursor] ==
'=') {
193 if (m_nCursor >= m_spInput.size())
196 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
200 if (m_spInput[m_nCursor] ==
'=') {
204 if (m_spInput[m_nCursor] ==
'>') {
211 if (m_nCursor >= m_spInput.size())
214 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
218 if (m_spInput[m_nCursor] ==
'=') {
255 if (m_nCursor >= m_spInput.size())
258 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
262 if (m_spInput[m_nCursor] !=
'/')
270 if (m_nCursor >= m_spInput.size())
273 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
278 if (m_spInput[m_nCursor] ==
'.') {
282 if (m_spInput[m_nCursor] ==
'*') {
286 if (m_spInput[m_nCursor] ==
'#') {
290 if (FXSYS_IsDecimalDigit(m_spInput[m_nCursor])) {
292 return AdvanceForNumber();
296 if (IsWhitespaceCharacter(m_spInput[m_nCursor])) {
300 if (!IsInitialIdentifierCharacter(m_spInput[m_nCursor])) {
304 return AdvanceForIdentifier();
312 size_t used_length = 0;
313 if (m_nCursor < m_spInput.size()) {
314 FXSYS_wcstof(&m_spInput[m_nCursor], m_spInput.size() - m_nCursor,
317 size_t end = m_nCursor + used_length;
318 if (used_length == 0 ||
319 (end < m_spInput.size() && FXSYS_iswalpha(m_spInput[end]))) {
323 WideStringView str(m_spInput.subspan(m_nCursor, end - m_nCursor));
329 size_t start = m_nCursor;
331 while (!IsComplete() && m_spInput[m_nCursor]) {
332 if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
335 if (m_spInput[m_nCursor] ==
'"') {
339 if (m_nCursor >= m_spInput.size()) {
340 return Token(TOKstring, WideStringView(m_spInput.subspan(
341 start, m_nCursor - start)));
345 if (m_spInput[m_nCursor] !=
'"') {
346 if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
349 return Token(TOKstring, WideStringView(m_spInput.subspan(
350 start, m_nCursor - start)));
362 size_t start = m_nCursor;
364 while (!IsComplete() && m_spInput[m_nCursor]) {
365 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
369 if (!IsIdentifierCharacter(m_spInput[m_nCursor]))
375 WideStringView str(m_spInput.subspan(start, m_nCursor - start));
376 return Token(TokenizeIdentifier(str), str);
381 while (!IsComplete() && m_spInput[m_nCursor]) {
382 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
386 if (m_spInput[m_nCursor] == L'\r') {
390 if (m_spInput[m_nCursor] == L'\n') {
WideString ToDebugString() const
Token(XFA_FM_TOKEN token, WideStringView str)
Token(XFA_FM_TOKEN token)
CXFA_FMLexer(WideStringView wsFormcalc)
static WideString FromASCII(ByteStringView str)
bool FXSYS_iswalpha(wchar_t c)
bool FXSYS_iswalnum(wchar_t c)