7#include "xfa/fxfa/formcalc/cxfa_fmlexer.h"
11#include "core/fxcrt/compiler_specific.h"
12#include "core/fxcrt/fx_extension.h"
13#include "core/fxcrt/stl_util.h"
17bool IsFormCalcCharacter(
wchar_t c) {
18 return (c >= 0x09 && c <= 0x0D) || (c >= 0x20 && c <= 0xd7FF) ||
19 (c >= 0xE000 && c <= 0xFFFD);
22bool IsIdentifierCharacter(
wchar_t c) {
27bool IsInitialIdentifierCharacter(
wchar_t c) {
33bool IsWhitespaceCharacter(
wchar_t c) {
42 const char* m_keyword;
45const XFA_FMKeyword kKeyWords[] = {
86constexpr auto kTokenStrings =
fxcrt::ToArray<
const char*>({
87 "TOKand",
"TOKlparen",
"TOKrparen",
"TOKmul",
88 "TOKplus",
"TOKcomma",
"TOKminus",
"TOKdot",
89 "TOKdiv",
"TOKlt",
"TOKassign",
"TOKgt",
90 "TOKlbracket",
"TOKrbracket",
"TOKor",
"TOKdotscream",
91 "TOKdotstar",
"TOKdotdot",
"TOKle",
"TOKne",
92 "TOKeq",
"TOKge",
"TOKdo",
"TOKkseq",
93 "TOKksge",
"TOKksgt",
"TOKif",
"TOKin",
94 "TOKksle",
"TOKkslt",
"TOKksne",
"TOKksor",
95 "TOKnull",
"TOKbreak",
"TOKksand",
"TOKend",
96 "TOKeof",
"TOKfor",
"TOKnan",
"TOKksnot",
97 "TOKvar",
"TOKthen",
"TOKelse",
"TOKexit",
98 "TOKdownto",
"TOKreturn",
"TOKinfinity",
"TOKendwhile",
99 "TOKforeach",
"TOKendfunc",
"TOKelseif",
"TOKwhile",
100 "TOKendfor",
"TOKthrow",
"TOKstep",
"TOKupto",
101 "TOKcontinue",
"TOKfunc",
"TOKendif",
"TOKstar",
102 "TOKidentifier",
"TOKunderscore",
"TOKdollar",
"TOKexclamation",
103 "TOKcall",
"TOKstring",
"TOKnumber",
"TOKreserver",
108 const XFA_FMKeyword* result =
109 std::find_if(
std::begin(kKeyWords),
std::end(kKeyWords),
110 [str](
const XFA_FMKeyword& iter) {
111 return str.EqualsASCII(iter.m_keyword);
113 if (result !=
std::end(kKeyWords) && str.EqualsASCII(result->m_keyword)) {
114 return result->m_type;
151 while (!IsComplete() && m_spInput[m_nCursor]) {
152 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
157 switch (m_spInput[m_nCursor]) {
168 return AdvanceForString();
179 return AdvanceForNumber();
182 if (m_nCursor >= m_spInput.size())
185 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
189 if (m_spInput[m_nCursor] ==
'=') {
196 if (m_nCursor >= m_spInput.size())
199 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
203 if (m_spInput[m_nCursor] ==
'=') {
207 if (m_spInput[m_nCursor] ==
'>') {
214 if (m_nCursor >= m_spInput.size())
217 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
221 if (m_spInput[m_nCursor] ==
'=') {
258 if (m_nCursor >= m_spInput.size())
261 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
265 if (m_spInput[m_nCursor] !=
'/')
273 if (m_nCursor >= m_spInput.size())
276 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
281 if (m_spInput[m_nCursor] ==
'.') {
285 if (m_spInput[m_nCursor] ==
'*') {
289 if (m_spInput[m_nCursor] ==
'#') {
293 if (FXSYS_IsDecimalDigit(m_spInput[m_nCursor])) {
295 return AdvanceForNumber();
299 if (IsWhitespaceCharacter(m_spInput[m_nCursor])) {
303 if (!IsInitialIdentifierCharacter(m_spInput[m_nCursor])) {
307 return AdvanceForIdentifier();
315 size_t used_length = 0;
316 if (m_nCursor < m_spInput.size()) {
317 FXSYS_wcstof(WideStringView(m_spInput.subspan(m_nCursor)), &used_length);
319 size_t end = m_nCursor + used_length;
320 if (used_length == 0 ||
321 (end < m_spInput.size() && FXSYS_iswalpha(m_spInput[end]))) {
325 WideStringView str(m_spInput.subspan(m_nCursor, end - m_nCursor));
331 size_t start = m_nCursor;
333 while (!IsComplete() && m_spInput[m_nCursor]) {
334 if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
337 if (m_spInput[m_nCursor] ==
'"') {
341 if (m_nCursor >= m_spInput.size()) {
342 return Token(TOKstring, WideStringView(m_spInput.subspan(
343 start, m_nCursor - start)));
347 if (m_spInput[m_nCursor] !=
'"') {
348 if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
351 return Token(TOKstring, WideStringView(m_spInput.subspan(
352 start, m_nCursor - start)));
364 size_t start = m_nCursor;
366 while (!IsComplete() && m_spInput[m_nCursor]) {
367 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
371 if (!IsIdentifierCharacter(m_spInput[m_nCursor]))
378 return Token(TokenizeIdentifier(str), str);
383 while (!IsComplete() && m_spInput[m_nCursor]) {
384 if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
388 if (m_spInput[m_nCursor] == L'\r') {
392 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)
fxcrt::WideStringView WideStringView
fxcrt::WideString WideString