Lex

Simplex Lex

The lex() member function is used to determine whether the beginning of input matches the specified model or not, and also processes any snag units included. When used with a generated Simplex object, it takes either a onestring or a string of char as a parameter (the input to check), and the function returns a SimplexResult object with the details of the match. The boolean match in this object will be true if the beginning of input matches the model, false if not. (It will return true whether there are characters remaining after the matched characters or not. If you want the match to succeed only if the entire input matches the entire model, use match instead.) If match is true, the FlexArray<onestring> snag_array will be populated with the results of any snag units, and match_length will contain the total length of matched characters.

Simplex is a single pass parser; if you want to include matches in the middle of an input, build the model accordingly (ie, with a Unit like ^.*/ - which is any character, one or more, optionally - at the beginning of the units you’re trying to match or lex).

// Using the model example on the main Simplex page:
onestring model = "^d/";
Simplex simplex(model);

onestring lex_input1 = "3";
SimplexResult lex1 = simplex.lex(lex_input1);
// lex1.match is true, and lex1.matched_length = 1
onestring lex_input2 = "abc";
SimplexResult lex2 = simplex.lex(search_input2);
// lex2.match is false, and lex2.matched_length = 0
onestring lex_input3 = "3a";
SimplexResult lex3 = simplex.lex(lex_input3);
// lex3.match is true, and lex3.matched_length = 1

Note

Lex contains a true result on the final input, while match would not. It also provides the length of 1 so you can know that only the first character matched the model you provided.

Lex will also handle snag units:

// A model for one or more digits
onestring model_snag = "~d+/";
Simplex simplex_snag(model_snag);

onestring lex_input4 = "123";
SimplexResult lex4 = simplex_snag(lex_input4);
// lex4.match is true, lex4.matched_length = 3,
// and lex4.snag_array[0] = "123"
onestring lex_input5 = "123steve";
SimplexResult lex5 = simplex_snag(lex_input5);
// lex5.match is true, lex5.matched_length = 3 because only the first three
// characters match, and lex5.snag_array[0] = "123" again.

Static Lex

The lex() function also can operate statically using two parameters instead of one. The first parameter is still the input that you would like to check, and the second parameter is then the model you want to check against. This works either with two assigned onestrings, or in the case of simpler models and inputs, a string of char:

// Onestrings:
onestring static_model = "^l/";
onestring static_input1 = "a";
SimplexResult static1 = Simplex::lex(static_input1, static_model);
// static1.match is true, static1.matched_length = 1

// Chars
SimplexResult static2 = Simplex::match("g", static_model);
// static2.match is true
SimplexResult static3 = Simplex::match(static_input1, "^d/");
// static3.match is false
SimplexResult static4 = Simplex::match("7", "^d/");
// static4.match is true, static4.matched_length = 1

Lex will return true if the characters at the beginning of the input match the model provided, either in static or member form.