@@ -15,42 +15,28 @@ extern std::map<std::string,std::string> KVMap;
15
15
std::deque<Token> TokenContainer;
16
16
std::deque<Token> ErrorTokens;
17
17
// Raw pointer bad, std::variant good.
18
- typedef std::variant<Parser::MenuToken, Parser::KVToken, Parser::BindToken, Parser::ToggleBindToken, Parser::CMenuToken, Parser::CMenuEndToken> MenuToken_t;
18
+ typedef std::variant<Parser::MenuToken, Parser::KVToken, Parser::BindToken, Parser::ToggleBindToken, Parser::CMenuToken, Parser::CodeToken, Parser:: CMenuEndToken> MenuToken_t;
19
19
std::deque<MenuToken_t> CMenuTokens;
20
20
21
21
extern std::deque<CommandMenu> CMenuContainer; // Made in main.cpp
22
22
extern std::vector<std::string> UsedKeys; // made in main.cpp
23
23
24
24
namespace Parser {
25
- Parser::MenuToken::MenuToken () {
26
-
27
- }
28
-
29
- Parser::MenuToken::~MenuToken () {
30
-
31
- }
32
-
33
- Parser::KVToken::KVToken () {
34
-
35
- }
36
-
25
+ Parser::MenuToken::MenuToken () {}
26
+ Parser::MenuToken::~MenuToken () {}
27
+ Parser::KVToken::KVToken () {}
37
28
Parser::KVToken::KVToken (const std::string& ident, const std::string& value)
38
29
: Key(ident), Value(value) {
39
30
fAttribs =0 ;
40
31
}
41
-
32
+ Parser::KVToken::~KVToken () {}
42
33
Parser::BindToken::BindToken () {}
43
-
44
34
Parser::BindToken::BindToken (const std::string& p_sName, const std::string& p_sCmdStr, const char & p_fAttributeFlag)
45
35
: sName (p_sName), sCmdStr (p_sCmdStr) {fAttribs = p_fAttributeFlag;}
46
-
47
36
Parser::BindToken::BindToken (const std::string& p_sKey, const std::string& p_sName, const std::string& p_sCmdStr, const char & p_fAttributeFlag)
48
- : sKey (p_sKey), sName (p_sName), sCmdStr (p_sCmdStr) {fAttribs = p_fAttributeFlag; }
49
-
37
+ : sKey (p_sKey), sName (p_sName), sCmdStr (p_sCmdStr) {fAttribs = p_fAttributeFlag;}
50
38
Parser::BindToken::~BindToken () {}
51
-
52
39
Parser::ToggleBindToken::ToggleBindToken () {}
53
-
54
40
Parser::ToggleBindToken::ToggleBindToken (const std::string p_names[MAX_TOGGLE_STATES], const std::string p_CmdStrContainer[MAX_TOGGLE_STATES], unsigned short p_iToggleStates, const char & p_fAttributeFlag)
55
41
: ToggleStates(p_iToggleStates)
56
42
{
@@ -65,7 +51,6 @@ namespace Parser {
65
51
66
52
fAttribs = p_fAttributeFlag;
67
53
}
68
-
69
54
Parser::ToggleBindToken::ToggleBindToken (const std::string& p_sKey, const std::string p_names[MAX_TOGGLE_STATES], const std::string p_CmdStrContainer[MAX_TOGGLE_STATES], unsigned short p_iToggleStates, const char & p_fAttributeFlag)
70
55
: ToggleStates(p_iToggleStates), sKey (p_sKey)
71
56
{
@@ -79,25 +64,22 @@ namespace Parser {
79
64
}
80
65
fAttribs = p_fAttributeFlag;
81
66
}
82
-
83
67
Parser::ToggleBindToken::~ToggleBindToken () {}
84
-
85
68
Parser::CMenuToken::CMenuToken () {}
86
-
87
69
Parser::CMenuToken::CMenuToken (const std::string& sName , const char & p_fAttributeFlag)
88
70
: sName (sName ) {
89
71
fAttribs = p_fAttributeFlag;
90
72
}
91
-
92
73
Parser::CMenuToken::CMenuToken (const std::string& p_sKey, const std::string& sName , const char & p_fAttributeFlag)
93
74
: sName (sName ), sKey (p_sKey) {
94
75
fAttribs = p_fAttributeFlag;
95
76
}
96
-
97
77
Parser::CMenuToken::~CMenuToken () {}
98
-
78
+ Parser::CodeToken::CodeToken () {}
79
+ Parser::CodeToken::CodeToken (const std::string& p_sValue)
80
+ : sValue (p_sValue) {}
81
+ Parser::CodeToken::~CodeToken () {}
99
82
Parser::CMenuEndToken::CMenuEndToken () {}
100
-
101
83
Parser::CMenuEndToken::~CMenuEndToken () {}
102
84
103
85
/* Parses the tokens from the lexer
@@ -193,9 +175,13 @@ namespace Parser {
193
175
if (!(fParserStateFlag & PARSER_STATE_ERRORS_FOUND))
194
176
CMenuTokens.push_back (Parser::CMenuToken (token->sValue ,((fParserStateFlag & PARSER_STATE_FORMATTED) ? CMTOKATTRIB_FORMATTED : 0 ) | CMTOKATTRIB_NOEXIT));
195
177
fParserStateFlag |= CMTOKATTRIB_FORMATTED;
196
- token+= i;
178
+ token += i;
197
179
}
198
180
break ;
181
+ case TokenType::RAW_STRING:
182
+ CMenuTokens.push_back (Parser::CodeToken (token->sValue ));
183
+ token++;
184
+ break ;
199
185
case TokenType::IDENTIFIER: // Check for set keymaps
200
186
{
201
187
// Key Values should never have modifiers.
@@ -247,12 +233,12 @@ namespace Parser {
247
233
}
248
234
}
249
235
if (!(fParserStateFlag & PARSER_STATE_EOF_FOUND)) std::cout<<" warning: EOF not found!\n " ;
250
- if (ErrorTokens.size ()>= 1 ) fParserStateFlag |= PARSER_STATE_ERRORS_FOUND;
236
+ if (ErrorTokens.size () >= 1 ) fParserStateFlag |= PARSER_STATE_ERRORS_FOUND;
251
237
return !(fParserStateFlag >> 7 /* Errors Found? */ );
252
238
}
253
239
}
254
240
255
- /* Convert menu tokens in TokenContainer into something useful .
241
+ /* Convert menu tokens in TokenContainer into cmenus and cfg code (from ``) .
256
242
* p_iBindCount (unsigned short) stores how many binds were counted
257
243
* p_bUsedDisplayFlags (a flag) stores what display types were used. Used to optimize proper closing of CMenu displays.
258
244
- 3rd bit: Is the "none" display method used?
@@ -261,7 +247,7 @@ namespace Parser {
261
247
262
248
Returns true if conversion was successful. If not then it returns false.
263
249
*/
264
- bool ParseMenuTokens (unsigned short & p_iBindCount, char & p_bUsedDisplayFlags) {
250
+ bool ParseMenuTokens (unsigned short & p_iBindCount, unsigned char & p_bUsedDisplayFlags, std::string& init_defined_code ) {
265
251
// Has there been an error? BAIL.
266
252
char t_bUsedDisplayFlags = p_bUsedDisplayFlags;
267
253
if (ErrorTokens.size ()>=1 ) return false ;
@@ -270,7 +256,6 @@ bool ParseMenuTokens(unsigned short& p_iBindCount, char& p_bUsedDisplayFlags) {
270
256
271
257
// This variable is in the function scope instead of the switch-case scope, because the end cmenu tokens NEED to remember the attributes of their cmenus.
272
258
Parser::CMenuToken CurrentCMenu;
273
-
274
259
for (auto token = CMenuTokens.begin (); token != CMenuTokens.end (); token++) {
275
260
// Automatically resets the KEY KV to prevent other binds from being affected by it.
276
261
if (token != CMenuTokens.begin () && !std::holds_alternative<Parser::KVToken>(*(token - 1 ))) KVMap[" KEY" ]=" " ;
@@ -315,15 +300,15 @@ bool ParseMenuTokens(unsigned short& p_iBindCount, char& p_bUsedDisplayFlags) {
315
300
if (CMenuStack.size () > 1 ) {
316
301
if (CurrentCMenu.fAttribs & CMTOKATTRIB_BIND_KEYSET) {
317
302
if (iDuplicateNumber > 0 )
318
- (CMenuStack.begin ()+1 )->binds .push_back (Bind (CurrentCMenu.sKey ,Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName )+' _' +std::to_string (iDuplicateNumber),CurrentCMenu.fAttribs )));
303
+ (CMenuStack.begin ()+1 )->Entries .push_back (Bind (CurrentCMenu.sKey ,Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName )+' _' +std::to_string (iDuplicateNumber),CurrentCMenu.fAttribs )));
319
304
else
320
- (CMenuStack.begin ()+1 )->binds .push_back (Bind (CurrentCMenu.sKey ,Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName ),CurrentCMenu.fAttribs )));
305
+ (CMenuStack.begin ()+1 )->Entries .push_back (Bind (CurrentCMenu.sKey ,Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName ),CurrentCMenu.fAttribs )));
321
306
// Add the keyname to a list of used key names if it isn't already added.
322
307
if (std::none_of (UsedKeys.cbegin (),UsedKeys.cend (),[&CurrentCMenu](std::string_view s){ return s == CurrentCMenu.sKey ; })) UsedKeys.push_back (CurrentCMenu.sKey );
323
308
}
324
309
else {
325
- if (iDuplicateNumber>0 ) (CMenuStack.begin ()+1 )->binds .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName )+' _' +std::to_string (iDuplicateNumber),CurrentCMenu.fAttribs )));
326
- else (CMenuStack.begin ()+1 )->binds .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName ),CurrentCMenu.fAttribs )));
310
+ if (iDuplicateNumber>0 ) (CMenuStack.begin ()+1 )->Entries .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName )+' _' +std::to_string (iDuplicateNumber),CurrentCMenu.fAttribs )));
311
+ else (CMenuStack.begin ()+1 )->Entries .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),Parser::BindToken (CurrentCMenu.sName ," exec $cmenu_" +formatRaw (CurrentCMenu.sName ),CurrentCMenu.fAttribs )));
327
312
}
328
313
}
329
314
if (!(CurrentCMenu.fAttribs & CMTOKATTRIB_BIND_KEYSET) && !NumKeyStack.empty ()) NumKeyStack.top ()=(NumKeyStack.top ()+1 );
@@ -346,11 +331,11 @@ bool ParseMenuTokens(unsigned short& p_iBindCount, char& p_bUsedDisplayFlags) {
346
331
CurrentBindToken.sKey = KVMap[" KEY" ];
347
332
assert (CMenuStack.size () > 0 );
348
333
if (!(CurrentBindToken.fAttribs & CMTOKATTRIB_BIND_KEYSET)) {
349
- CMenuStack.front ().binds .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),CurrentBindToken));
350
- NumKeyStack.top ()= (NumKeyStack.top ()+1 );
334
+ CMenuStack.front ().Entries .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),CurrentBindToken));
335
+ NumKeyStack.top () = (NumKeyStack.top ()+1 );
351
336
}
352
337
else {
353
- CMenuStack.front ().binds .push_back (Bind (CurrentBindToken.sKey ,CurrentBindToken));
338
+ CMenuStack.front ().Entries .push_back (Bind (CurrentBindToken.sKey ,CurrentBindToken));
354
339
// Add the keyname to a list of used key names if it isn't already added.
355
340
if (std::none_of (UsedKeys.cbegin (),UsedKeys.cend (),[&CurrentBindToken](std::string_view s){ return s == CurrentBindToken.sKey ;})) UsedKeys.push_back (CurrentBindToken.sKey );
356
341
}
@@ -362,20 +347,23 @@ bool ParseMenuTokens(unsigned short& p_iBindCount, char& p_bUsedDisplayFlags) {
362
347
CurrentToggleBindToken.sKey = KVMap[" KEY" ];
363
348
assert (CMenuStack.size () > 0 );
364
349
if (!(CurrentToggleBindToken.fAttribs & CMTOKATTRIB_BIND_KEYSET)) {
365
- CMenuStack.front ().binds .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),CurrentToggleBindToken));
350
+ CMenuStack.front ().Entries .push_back (Bind (std::to_string (NumKeyStack.top () % 10 ),CurrentToggleBindToken));
366
351
assert (!NumKeyStack.empty ());
367
352
NumKeyStack.top ()=(NumKeyStack.top ()+1 );
368
353
}
369
354
else {
370
- CMenuStack.front ().binds .push_back (Bind (CurrentToggleBindToken.sKey ,CurrentToggleBindToken));
355
+ CMenuStack.front ().Entries .push_back (Bind (CurrentToggleBindToken.sKey ,CurrentToggleBindToken));
371
356
// Add the keyname to a list of used key names if it isn't already added.
372
357
if (std::none_of (UsedKeys.cbegin (),UsedKeys.cend (),[&CurrentToggleBindToken](std::string_view s){ return s == CurrentToggleBindToken.sKey ;})) UsedKeys.push_back (CurrentToggleBindToken.sKey );
373
358
}
374
359
p_iBindCount++;
360
+ }
361
+ else if (std::holds_alternative<Parser::CodeToken>(*token)) {
362
+ if (!CMenuStack.empty ()) CMenuStack.front ().Entries .push_back (std::get<Parser::CodeToken>(*token).sValue );
363
+ else if (!CMenuContainer.empty ()) CMenuContainer.back ().Entries .push_back (std::get<Parser::CodeToken>(*token).sValue );
364
+ else init_defined_code += std::get<Parser::CodeToken>(*token).sValue ;
375
365
}
376
- else {
377
-
378
- }
366
+ else std::cout << " ParseMenuTokens(): warning: std::variant has invalid type. Not parsing this variant.\n " ;
379
367
}
380
368
return true ;
381
369
}
0 commit comments