4#include <gtest/gtest.h>
15class Lexer :
public ::testing::Test {
18 std::vector<TermPtr> tokens;
26 int64_t TokenParse(
const char *str,
bool ignore_space =
true,
bool ignore_indent =
true,
bool ignore_comment =
true,
bool ignore_crlf =
true) {
27 std::istringstream strstr(str);
31 lexer.m_ignore_indent = ignore_indent;
32 lexer.m_ignore_space = ignore_space;
33 lexer.m_ignore_comment = ignore_comment;
34 lexer.m_ignore_crlf = ignore_crlf;
38 parser::location_type loc;
39 while (lexer.lex(&tok, &loc) != parser::token::END) {
40 tokens.push_back(tok);
45 int Count(
TermID token_id) {
47 for (
size_t i = 0; i < tokens.size(); i++) {
48 if (tokens[i]->getTermID() == token_id) {
57 for (
int i = 0; i < tokens.size(); i++) {
58 result += tokens[i]->m_text;
69 ASSERT_EQ(1, TokenParse(
"alpha "));
70 EXPECT_EQ(1, Count(TermID::NAME));
71 EXPECT_STREQ(
"alpha", tokens[0]->getText().c_str());
74 ASSERT_EQ(2, TokenParse(
"буквы ещёЁ_99"));
75 EXPECT_EQ(2, Count(TermID::NAME));
76 EXPECT_STREQ(
"буквы", tokens[0]->getText().c_str());
77 EXPECT_STREQ(
"ещёЁ_99", tokens[1]->getText().c_str());
79 ASSERT_EQ(3, TokenParse(
"one two \t three"));
80 EXPECT_EQ(3, Count(TermID::NAME));
82 EXPECT_STREQ(
"one", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
83 EXPECT_STREQ(
"two", tokens[1]->getText().c_str()) << tokens[1]->getText().c_str();
84 EXPECT_STREQ(
"three", tokens[2]->getText().c_str()) << tokens[2]->getText().c_str();
87TEST_F(Lexer, Template) {
88 ASSERT_EQ(1, TokenParse(
"\"\"\"\"\"\""));
89 EXPECT_EQ(1, Count(TermID::TEMPLATE));
90 EXPECT_STREQ(
"", tokens[0]->getText().c_str()) << tokens[0]->getText();
93TEST_F(Lexer, Template2) {
94 ASSERT_EQ(1, TokenParse(
"\"\"\" ${123} \n \"\"\""));
95 EXPECT_EQ(1, Count(TermID::TEMPLATE));
96 EXPECT_STREQ(
" ${123} \n ", tokens[0]->getText().c_str()) << tokens[0]->getText();
99TEST_F(Lexer, Template3) {
100 ASSERT_EQ(1, TokenParse(
"''' ${123} \n\t '''"));
101 EXPECT_EQ(1, Count(TermID::TEMPLATE));
102 EXPECT_STREQ(
" ${123} \n\t ", tokens[0]->getText().c_str()) << tokens[0]->getText();
105TEST_F(Lexer, StringEmpty) {
106 ASSERT_EQ(0, TokenParse(
""));
107 ASSERT_EQ(1, TokenParse(
"''"));
108 EXPECT_EQ(1, Count(TermID::STRCHAR));
109 EXPECT_STREQ(
"", tokens[0]->getText().c_str()) << tokens[0]->getText();
112TEST_F(Lexer, StringEmpty2) {
113 ASSERT_EQ(0, TokenParse(
""));
114 ASSERT_EQ(1, TokenParse(
"\"\""));
115 EXPECT_EQ(1, Count(TermID::STRWIDE));
116 EXPECT_STREQ(
"", tokens[0]->getText().c_str()) << tokens[0]->getText();
119TEST_F(Lexer, StringSimple) {
120 ASSERT_EQ(1, TokenParse(
"' '"));
121 EXPECT_EQ(1, Count(TermID::STRCHAR));
122 EXPECT_STREQ(
" ", tokens[0]->getText().c_str()) << tokens[0]->getText();
125TEST_F(Lexer, StringSimple2) {
126 ASSERT_EQ(1, TokenParse(
"\" \""));
127 EXPECT_EQ(1, Count(TermID::STRWIDE));
128 EXPECT_STREQ(
" ", tokens[0]->getText().c_str()) << tokens[0]->getText();
131TEST_F(Lexer, FullString) {
132 ASSERT_EQ(1, TokenParse(
"' \t \xFF\r\\''"));
133 EXPECT_EQ(1, Count(TermID::STRCHAR));
134 EXPECT_STREQ(
" \t \xFF\r'", tokens[0]->getText().c_str()) << tokens[0]->getText();
137TEST_F(Lexer, FullString2) {
138 ASSERT_EQ(1, TokenParse(
"\" \t \xFF\r\\\"\""));
139 EXPECT_EQ(1, Count(TermID::STRWIDE));
140 EXPECT_STREQ(
" \t \xFF\r\"", tokens[0]->getText().c_str()) << tokens[0]->getText();
143TEST_F(Lexer, Integer) {
144 ASSERT_EQ(1, TokenParse(
"123456"));
145 EXPECT_EQ(1, Count(TermID::INTEGER)) <<
newlang::toString(tokens[0]->getTermID());
147 EXPECT_STREQ(
"123456", tokens[0]->getText().c_str());
149 ASSERT_EQ(3, TokenParse(
"123456 * 123"));
150 EXPECT_EQ(1, Count(TermID::SYMBOL)) <<
Dump();
151 EXPECT_EQ(2, Count(TermID::INTEGER)) <<
Dump();
153 EXPECT_STREQ(
"123456", tokens[0]->getText().c_str()) << tokens[0]->getText();
154 EXPECT_STREQ(
"*", tokens[1]->getText().c_str()) << tokens[1]->getText();
155 EXPECT_STREQ(
"123", tokens[2]->getText().c_str()) << tokens[2]->getText();
158TEST_F(Lexer, Float) {
159 ASSERT_EQ(1, TokenParse(
"1.e10"));
160 EXPECT_EQ(1, Count(TermID::NUMBER));
161 EXPECT_STREQ(
"1.e10", tokens[0]->getText().c_str());
164TEST_F(Lexer, Complex0) {
165 if (1 != TokenParse(
"1j")) {
166 for (
auto elem : tokens) {
170 ASSERT_EQ(1, tokens.size());
172 EXPECT_STREQ(
"1j", tokens[0]->getText().c_str());
174 if (1 != TokenParse(
"-1i")) {
175 for (
auto elem : tokens) {
179 ASSERT_EQ(1, tokens.size());
181 EXPECT_STREQ(
"-1i", tokens[0]->getText().c_str());
183 if (1 != TokenParse(
"-1j-0.2")) {
184 for (
auto elem : tokens) {
188 ASSERT_EQ(1, tokens.size());
190 EXPECT_STREQ(
"-1j-0.2", tokens[0]->getText().c_str());
192 if (1 != TokenParse(
"1i+2")) {
193 for (
auto elem : tokens) {
197 ASSERT_EQ(1, tokens.size());
199 EXPECT_STREQ(
"1i+2", tokens[0]->getText().c_str());
201 if (1 != TokenParse(
"1j+0.2")) {
202 for (
auto elem : tokens) {
206 ASSERT_EQ(1, tokens.size());
208 EXPECT_STREQ(
"1j+0.2", tokens[0]->getText().c_str());
211TEST_F(Lexer, Complex1) {
212 if (1 != TokenParse(
"1.333+0.e10j")) {
213 for (
auto elem : tokens) {
217 ASSERT_EQ(1, tokens.size());
218 EXPECT_EQ(1, Count(TermID::COMPLEX));
219 EXPECT_STREQ(
"1.333+0.e10j", tokens[0]->getText().c_str());
224 if (1 != TokenParse(
"$alpha ")) {
225 for (
auto elem : tokens) {
230 ASSERT_EQ(1, tokens.size());
231 EXPECT_EQ(1, Count(TermID::LOCAL)) <<
Dump();
232 EXPECT_STREQ(
"$alpha", tokens[0]->getText().c_str());
235 ASSERT_EQ(2, TokenParse(
"буквы ещёЁ_99"));
236 EXPECT_EQ(2, Count(TermID::NAME));
237 EXPECT_STREQ(
"буквы", tokens[0]->getText().c_str());
238 EXPECT_STREQ(
"ещёЁ_99", tokens[1]->getText().c_str());
240 ASSERT_EQ(5, TokenParse(
"one \\two \\\\two \t $three @four")) <<
Dump();
241 EXPECT_EQ(1, Count(TermID::NAME)) <<
Dump();
242 EXPECT_EQ(1, Count(TermID::LOCAL)) <<
Dump();
243 EXPECT_EQ(1, Count(TermID::MACRO)) <<
Dump();
244 EXPECT_EQ(2, Count(TermID::MODULE)) <<
Dump();
246 EXPECT_STREQ(
"one", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
247 EXPECT_STREQ(
"\\two", tokens[1]->getText().c_str()) << tokens[1]->getText().c_str();
248 EXPECT_STREQ(
"\\\\two", tokens[2]->getText().c_str()) << tokens[2]->getText().c_str();
249 EXPECT_STREQ(
"$three", tokens[3]->getText().c_str()) << tokens[3]->getText().c_str();
250 EXPECT_STREQ(
"@four", tokens[4]->getText().c_str()) << tokens[4]->getText().c_str();
253TEST_F(Lexer, AssignEq) {
254 ASSERT_EQ(3, TokenParse(
"token=ssssssss"));
255 EXPECT_EQ(2, Count(TermID::NAME));
256 EXPECT_EQ(1, Count(TermID::SYMBOL));
258 EXPECT_STREQ(
"token", tokens[0]->getText().c_str()) << tokens[0]->getText();
259 EXPECT_STREQ(
"ssssssss", tokens[2]->getText().c_str()) << tokens[2]->getText();
261 ASSERT_EQ(3, TokenParse(
"token:=\"ssssssss\""));
262 EXPECT_EQ(1, Count(TermID::NAME));
263 EXPECT_EQ(1, Count(TermID::CREATE_USE));
264 EXPECT_EQ(1, Count(TermID::STRWIDE));
266 EXPECT_STREQ(
"token", tokens[0]->getText().c_str()) << tokens[0]->getText();
267 EXPECT_STREQ(
"ssssssss", tokens[2]->getText().c_str()) << tokens[2]->getText();
269 ASSERT_EQ(3, TokenParse(
" token \t ::= 'ssssssss' "));
270 EXPECT_EQ(1, Count(TermID::NAME));
271 EXPECT_EQ(1, Count(TermID::CREATE_NEW));
272 EXPECT_EQ(1, Count(TermID::STRCHAR));
274 EXPECT_STREQ(
"token", tokens[0]->getText().c_str()) << tokens[0]->getText();
275 EXPECT_STREQ(
"ssssssss", tokens[2]->getText().c_str()) << tokens[2]->getText();
278TEST_F(Lexer, CodeInner) {
279 ASSERT_EQ(3, TokenParse(
"{%if(){%} {%}else{%} {%} %}"));
280 EXPECT_EQ(3, Count(TermID::EMBED));
281 EXPECT_STREQ(
"if(){", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
282 EXPECT_STREQ(
"}else{", tokens[1]->getText().c_str()) << tokens[1]->getText().c_str();
283 EXPECT_STREQ(
"} ", tokens[2]->getText().c_str()) << tokens[2]->getText().c_str();
285 ASSERT_EQ(5, TokenParse(
"{ {%if(){%} {%}else{%} {%} %} }"));
286 EXPECT_EQ(2, Count(TermID::SYMBOL));
287 EXPECT_EQ(3, Count(TermID::EMBED));
288 EXPECT_STREQ(
"{", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
289 EXPECT_STREQ(
"if(){", tokens[1]->getText().c_str()) << tokens[1]->getText().c_str();
290 EXPECT_STREQ(
"}else{", tokens[2]->getText().c_str()) << tokens[2]->getText().c_str();
291 EXPECT_STREQ(
"} ", tokens[3]->getText().c_str()) << tokens[3]->getText().c_str();
292 EXPECT_STREQ(
"}", tokens[4]->getText().c_str()) << tokens[4]->getText().c_str();
296 ASSERT_EQ(2, TokenParse(
"{ }"));
297 EXPECT_EQ(2, Count(TermID::SYMBOL));
298 EXPECT_STREQ(
"{", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
299 EXPECT_STREQ(
"}", tokens[1]->getText().c_str()) << tokens[1]->getText().c_str();
301 ASSERT_EQ(4, TokenParse(
"{ { } }"));
302 EXPECT_EQ(4, Count(TermID::SYMBOL));
305TEST_F(Lexer, CodeSource) {
306 ASSERT_EQ(1, TokenParse(
"{%%}"));
307 EXPECT_EQ(1, Count(TermID::EMBED));
308 EXPECT_STREQ(
"", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
310 ASSERT_EQ(1, TokenParse(
"{% % %}"));
311 ASSERT_EQ(1, Count(TermID::EMBED));
312 ASSERT_STREQ(
" % ", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
315TEST_F(Lexer, Assign) {
316 ASSERT_EQ(5, TokenParse(
":= :- ::= ::- ="));
317 EXPECT_EQ(1, Count(TermID::CREATE_NEW));
318 EXPECT_EQ(1, Count(TermID::CREATE_USE));
319 EXPECT_EQ(1, Count(TermID::PURE_USE));
320 EXPECT_EQ(1, Count(TermID::PURE_NEW));
323TEST_F(Lexer, Function) {
324 ASSERT_EQ(1, TokenParse(
"\\name")) <<
Dump();
325 EXPECT_EQ(1, Count(TermID::MODULE)) <<
toString(tokens[0]->getTermID());
326 EXPECT_STREQ(
"\\name", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
328 ASSERT_EQ(1, TokenParse(
"\\\\name"));
329 EXPECT_EQ(1, Count(TermID::MODULE)) <<
toString(tokens[0]->getTermID());
330 EXPECT_STREQ(
"\\\\name", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
332 ASSERT_EQ(1, TokenParse(
"$name"));
333 EXPECT_EQ(1, Count(TermID::LOCAL)) <<
toString(tokens[0]->getTermID());
334 EXPECT_STREQ(
"$name", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
336 ASSERT_EQ(2, TokenParse(
"%native"));
337 EXPECT_EQ(1, Count(TermID::SYMBOL)) <<
toString(tokens[0]->getTermID());
338 EXPECT_EQ(1, Count(TermID::NAME)) <<
toString(tokens[1]->getTermID());
339 EXPECT_STREQ(
"%", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
340 EXPECT_STREQ(
"native", tokens[1]->getText().c_str()) << tokens[1]->getText().c_str();
342 ASSERT_EQ(1, TokenParse(
"@name"));
343 EXPECT_EQ(1, Count(TermID::MACRO));
344 EXPECT_STREQ(
"@name", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
346 ASSERT_EQ(1, TokenParse(
"@функция_alpha_ёЁ"));
347 EXPECT_EQ(1, Count(TermID::MACRO));
348 EXPECT_STREQ(
"@функция_alpha_ёЁ", tokens[0]->getText().c_str()) << tokens[0]->getText().c_str();
351TEST_F(Lexer, Sentence) {
352 ASSERT_EQ(2, TokenParse(
"token."));
353 EXPECT_EQ(1, Count(TermID::NAME));
354 ASSERT_EQ(2, TokenParse(
"token;"));
355 EXPECT_EQ(1, Count(TermID::NAME));
358TEST_F(Lexer, Comment) {
359 ASSERT_EQ(0, TokenParse(
"# lskdafj ldsjf ldkjfa l;sdj fl;k"));
360 ASSERT_EQ(0, TokenParse(
"#! lskdafj ldsjf ldkjfa l;sdj fl;k\n "));
362 ASSERT_EQ(1, TokenParse(
"/***** lskdafj\n\n\n\n ldsjf ldkjfa l;sdj fl;k*****/ "));
363 EXPECT_EQ(1, Count(TermID::DOC_BEFORE));
365 ASSERT_EQ(1, TokenParse(
"/// lskdafj"));
366 EXPECT_EQ(1, Count(TermID::DOC_BEFORE));
367 ASSERT_EQ(1, TokenParse(
"/// lskdafj\n"));
368 EXPECT_EQ(1, Count(TermID::DOC_BEFORE));
369 ASSERT_EQ(1, TokenParse(
"///< lskdafj"));
370 EXPECT_EQ(1, Count(TermID::DOC_AFTER));
371 ASSERT_EQ(1, TokenParse(
"///< lskdafj\n"));
372 EXPECT_EQ(1, Count(TermID::DOC_AFTER));
375TEST_F(Lexer, Comment2) {
376 ASSERT_EQ(2, TokenParse(
"#!22\n#1\nterm;\n"));
378 EXPECT_EQ(1, Count(TermID::SYMBOL));
379 EXPECT_EQ(1, Count(TermID::NAME));
381 ASSERT_EQ(1, TokenParse(
"\n\n/* \n\n*/\n\n term"));
383 EXPECT_EQ(1, Count(TermID::NAME));
387 EXPECT_STREQ(
"term", tokens[0]->getText().c_str()) << tokens[1]->getText().c_str();
388 EXPECT_EQ(7, tokens[0]->m_line) <<
Dump();
389 EXPECT_EQ(7, tokens[0]->m_col) <<
Dump();
392TEST_F(Lexer, Paren) {
393 ASSERT_EQ(3, TokenParse(
"\\name()")) <<
Dump();
394 EXPECT_EQ(1, Count(TermID::MODULE));
395 EXPECT_EQ(2, Count(TermID::SYMBOL));
398 ASSERT_EQ(4, TokenParse(
"%функция_alpha_ёЁ ()"));
399 EXPECT_EQ(1, Count(TermID::NAME));
400 EXPECT_EQ(3, Count(TermID::SYMBOL));
405 ASSERT_EQ(1, TokenParse(
"\\name")) <<
Dump();
406 EXPECT_EQ(1, Count(TermID::MODULE));
408 ASSERT_EQ(1, TokenParse(
"\\\\dir\\module"));
409 EXPECT_EQ(1, Count(TermID::MODULE));
411 ASSERT_EQ(1, TokenParse(
"\\dir\\dir\\module"));
412 EXPECT_EQ(1, Count(TermID::MODULE));
414 ASSERT_EQ(3, TokenParse(
"\\name::var")) <<
Dump();
415 EXPECT_EQ(1, Count(TermID::MODULE));
417 ASSERT_EQ(5, TokenParse(
"\\\\dir\\module::var.filed")) <<
Dump();
418 EXPECT_EQ(1, Count(TermID::MODULE));
420 ASSERT_EQ(5, TokenParse(
"\\dir\\dir\\module::var.filed")) <<
Dump();
421 EXPECT_EQ(1, Count(TermID::MODULE));
425 ASSERT_EQ(7, TokenParse(
"term(name=value);"));
426 EXPECT_EQ(3, Count(TermID::NAME));
427 EXPECT_EQ(4, Count(TermID::SYMBOL));
431 ASSERT_EQ(11, TokenParse(
"$0 $1 $22 $333 $4sss $sss1 -- ++ $* $^ ")) <<
Dump();
432 EXPECT_EQ(5, Count(TermID::ARGUMENT)) <<
Dump();
433 EXPECT_EQ(2, Count(TermID::ARGS)) <<
Dump();
434 EXPECT_EQ(1, Count(TermID::INT_PLUS)) <<
Dump();
435 EXPECT_EQ(1, Count(TermID::INT_MINUS)) <<
Dump();
436 EXPECT_EQ(1, Count(TermID::NAME)) <<
Dump();
437 EXPECT_EQ(1, Count(TermID::LOCAL)) <<
Dump();
440TEST_F(Lexer, MutArgs) {
441 ASSERT_EQ(11, TokenParse(
"$0^ $1^ $22 $333 $4sss^ $sss1^ -- ++ $* $^ ")) <<
Dump();
442 EXPECT_EQ(5, Count(TermID::ARGUMENT)) <<
Dump();
443 EXPECT_EQ(2, Count(TermID::ARGS)) <<
Dump();
444 EXPECT_EQ(1, Count(TermID::INT_PLUS)) <<
Dump();
445 EXPECT_EQ(1, Count(TermID::INT_MINUS)) <<
Dump();
446 EXPECT_EQ(1, Count(TermID::NAME)) <<
Dump();
447 EXPECT_EQ(1, Count(TermID::LOCAL)) <<
Dump();
481 ASSERT_EQ(7, TokenParse(
"термин(имя=значение);"));
482 EXPECT_EQ(3, Count(TermID::NAME)) <<
Dump();
483 EXPECT_EQ(4, Count(TermID::SYMBOL)) <<
Dump();
486TEST_F(Lexer, MutUTF8) {
487 ASSERT_EQ(7, TokenParse(
"термин^(имя^=значение);"));
488 EXPECT_EQ(3, Count(TermID::NAME)) <<
Dump();
489 EXPECT_EQ(4, Count(TermID::SYMBOL)) <<
Dump();
490 ASSERT_EQ(7, TokenParse(
"термин^(имя^=значение);"));
491 EXPECT_EQ(3, Count(TermID::NAME)) <<
Dump();
492 EXPECT_EQ(4, Count(TermID::SYMBOL)) <<
Dump();
495TEST_F(Lexer, ELLIPSIS) {
496 ASSERT_EQ(2, TokenParse(
"... ...")) <<
Dump();
497 EXPECT_EQ(2, Count(TermID::ELLIPSIS)) <<
Dump();
500TEST_F(Lexer, Alias) {
501 ASSERT_EQ(5, TokenParse(
"+>:<-")) <<
Dump();
502 EXPECT_EQ(5, Count(TermID::SYMBOL)) <<
Dump();
504 ASSERT_EQ(4, TokenParse(
"@alias := @ALIAS;")) <<
Dump();
505 EXPECT_EQ(2, Count(TermID::MACRO)) <<
Dump();
507 ASSERT_EQ(7, TokenParse(
"/** Comment */@@ alias2 @@ ALIAS2@@///< Комментарий")) <<
Dump();
508 EXPECT_EQ(1, Count(TermID::DOC_BEFORE));
509 EXPECT_EQ(1, Count(TermID::DOC_AFTER));
510 EXPECT_EQ(2, Count(TermID::NAME));
511 EXPECT_EQ(1, tokens[0]->m_line) <<
Dump();
512 EXPECT_EQ(15, tokens[0]->m_col) <<
Dump();
513 EXPECT_EQ(1, tokens[1]->m_line) <<
Dump();
514 EXPECT_EQ(17, tokens[1]->m_col) <<
Dump();
516 ASSERT_EQ(2, TokenParse(
"/** Русские символы */name")) <<
Dump();
517 EXPECT_EQ(1, Count(TermID::DOC_BEFORE));
518 EXPECT_EQ(1, Count(TermID::NAME));
519 EXPECT_EQ(1, tokens[0]->m_line);
520 EXPECT_EQ(37, tokens[0]->m_col);
521 EXPECT_EQ(1, tokens[1]->m_line);
522 EXPECT_EQ(23 + 14 + 4, tokens[1]->m_col);
525TEST_F(Lexer,
Macro) {
527 ASSERT_EQ(1, TokenParse(
"@$arg")) <<
Dump();
528 EXPECT_EQ(1, Count(TermID::MACRO_ARGNAME)) <<
Dump();
530 ASSERT_EQ(1, TokenParse(
"@$1")) <<
Dump();
531 EXPECT_EQ(1, Count(TermID::MACRO_ARGPOS)) <<
Dump();
548 ASSERT_EQ(1, TokenParse(
"@#")) <<
Dump();
549 EXPECT_EQ(1, Count(TermID::MACRO_TOSTR));
551 ASSERT_EQ(1, TokenParse(
"@#'")) <<
Dump();
552 EXPECT_EQ(1, Count(TermID::MACRO_TOSTR));
553 ASSERT_EQ(1, TokenParse(
"@#\"")) <<
Dump();
554 EXPECT_EQ(1, Count(TermID::MACRO_TOSTR));
556 ASSERT_EQ(1, TokenParse(
"@##")) <<
Dump();
557 EXPECT_EQ(1, Count(TermID::MACRO_CONCAT));
559 ASSERT_EQ(1, TokenParse(
"@$...")) <<
Dump();
560 EXPECT_EQ(1, Count(TermID::MACRO_ARGUMENT));
561 ASSERT_EQ(1, TokenParse(
"@$*")) <<
Dump();
562 EXPECT_EQ(1, Count(TermID::MACRO_ARGUMENT));
563 ASSERT_EQ(1, TokenParse(
"@$#")) <<
Dump();
564 EXPECT_EQ(1, Count(TermID::MACRO_ARGCOUNT));
566 ASSERT_EQ(7, TokenParse(
"@macro := @@123 ... 456@@")) <<
Dump();
567 EXPECT_EQ(1, Count(TermID::MACRO)) <<
Dump();
568 EXPECT_EQ(2, Count(TermID::MACRO_SEQ)) <<
Dump();
570 ASSERT_EQ(3, TokenParse(
"@macro := @@@123 ... 456@@@"));
571 EXPECT_EQ(1, Count(TermID::MACRO));
572 EXPECT_EQ(1, Count(TermID::MACRO_STR));
573 EXPECT_STREQ(
"@macro", tokens[0]->m_text.c_str());
574 EXPECT_STREQ(
"123 ... 456", tokens[2]->m_text.c_str());
575 EXPECT_EQ(1, tokens[0]->m_line) <<
Dump();
576 EXPECT_EQ(7, tokens[0]->m_col) <<
Dump();
577 EXPECT_EQ(1, tokens[2]->m_line) <<
Dump();
578 EXPECT_EQ(28, tokens[2]->m_col) <<
Dump();
580 ASSERT_EQ(6, TokenParse(
"@macro (name) := @@@123 \n \n ... 456@@@ # Комментарий"));
581 EXPECT_EQ(1, Count(TermID::NAME));
582 EXPECT_EQ(1, Count(TermID::MACRO));
583 EXPECT_EQ(2, Count(TermID::SYMBOL));
584 EXPECT_EQ(1, Count(TermID::MACRO_STR));
585 EXPECT_STREQ(
"@macro", tokens[0]->m_text.c_str());
586 EXPECT_STREQ(
"123 \n \n ... 456", tokens[5]->m_text.c_str());
587 EXPECT_EQ(1, tokens[0]->m_line);
588 EXPECT_EQ(7, tokens[0]->m_col);
589 EXPECT_EQ(3, tokens[5]->m_line);
590 EXPECT_EQ(12, tokens[5]->m_col);
592 ASSERT_EQ(11, TokenParse(
"@if($args) := @@ [@$args] --> @@")) <<
Dump();
593 EXPECT_EQ(1, Count(TermID::MACRO));
594 EXPECT_EQ(4, Count(TermID::SYMBOL));
595 EXPECT_EQ(1, Count(TermID::CREATE_USE));
596 EXPECT_EQ(2, Count(TermID::MACRO_SEQ));
597 EXPECT_EQ(1, Count(TermID::FOLLOW));
598 EXPECT_EQ(1, Count(TermID::MACRO_ARGNAME)) <<
Dump();
601TEST_F(Lexer, Ignore) {
602 ASSERT_EQ(1, TokenParse(
"\\\\ ")) <<
Dump();
603 ASSERT_EQ(1, Count(TermID::MODULE)) <<
Dump();
604 EXPECT_STREQ(
"\\\\", tokens[0]->m_text.c_str());
606 ASSERT_EQ(2, TokenParse(
"\\\\ ",
false)) <<
Dump();
607 ASSERT_EQ(1, Count(TermID::MODULE)) <<
Dump();
608 ASSERT_EQ(1, Count(TermID::SPACE)) <<
Dump();
609 EXPECT_STREQ(
"\\\\", tokens[0]->m_text.c_str());
610 EXPECT_STREQ(
" ", tokens[1]->m_text.c_str());
612 ASSERT_EQ(2, TokenParse(
"\\\\ \t ",
false)) <<
Dump();
613 ASSERT_EQ(1, Count(TermID::MODULE)) <<
Dump();
614 ASSERT_EQ(1, Count(TermID::SPACE)) <<
Dump();
615 EXPECT_STREQ(
"\\\\", tokens[0]->m_text.c_str());
616 EXPECT_STREQ(
" \t ", tokens[1]->m_text.c_str());
619 ASSERT_EQ(2, TokenParse(
" \\\\ \t \n",
false)) <<
Dump();
620 ASSERT_EQ(1, Count(TermID::MODULE)) <<
Dump();
621 ASSERT_EQ(1, Count(TermID::SPACE)) <<
Dump();
622 EXPECT_STREQ(
"\\\\", tokens[0]->m_text.c_str());
623 EXPECT_STREQ(
" \t ", tokens[1]->m_text.c_str());
626 ASSERT_EQ(5, TokenParse(
" \\\\ \t \n\t\t",
false,
false,
false,
false)) <<
Dump();
627 ASSERT_EQ(1, Count(TermID::MODULE)) <<
Dump();
628 ASSERT_EQ(1, Count(TermID::SPACE)) <<
Dump();
629 ASSERT_EQ(2, Count(TermID::INDENT)) <<
Dump();
630 ASSERT_EQ(1, Count(TermID::CRLF)) <<
Dump();
631 EXPECT_STREQ(
" ", tokens[0]->m_text.c_str());
632 EXPECT_STREQ(
"\\\\", tokens[1]->m_text.c_str());
633 EXPECT_STREQ(
" \t ", tokens[2]->m_text.c_str());
634 EXPECT_STREQ(
"\n", tokens[3]->m_text.c_str());
635 EXPECT_STREQ(
"\t\t", tokens[4]->m_text.c_str());
637 ASSERT_EQ(4, TokenParse(
"/* /* */ */ # \n",
false,
false,
false,
false)) <<
Dump();
638 ASSERT_EQ(1, Count(TermID::SPACE)) <<
Dump();
639 ASSERT_EQ(2, Count(TermID::COMMENT)) <<
Dump();
640 ASSERT_EQ(1, Count(TermID::CRLF)) <<
Dump();
641 EXPECT_STREQ(
"/* /* */ */", tokens[0]->m_text.c_str());
642 EXPECT_STREQ(
" ", tokens[1]->m_text.c_str());
643 EXPECT_STREQ(
"# ", tokens[2]->m_text.c_str());
644 EXPECT_STREQ(
"\n", tokens[3]->m_text.c_str());
648TEST_F(Lexer, Mangled) {
649 ASSERT_EQ(1, TokenParse(
"_$$_123$")) <<
Dump();
650 ASSERT_EQ(1, Count(TermID::MANGLED)) <<
Dump();
652 ASSERT_EQ(1, TokenParse(
"_$name_$_123$")) <<
Dump();
653 ASSERT_EQ(1, Count(TermID::MANGLED)) <<
Dump();
655 ASSERT_EQ(1, TokenParse(
"_$na12me_$_name$$$")) <<
Dump();
656 ASSERT_EQ(1, Count(TermID::MANGLED)) <<
Dump();
658 ASSERT_EQ(1, TokenParse(
"_$na$_12me_$_name$$$")) <<
Dump();
659 ASSERT_EQ(1, Count(TermID::MANGLED)) <<
Dump();
662TEST_F(Lexer, ParseLexem) {
664 BlockType arr = Scanner::ParseLexem(
"1 2 3 4 5");
666 ASSERT_EQ(5, arr.size()) << Macro::DumpText(arr).c_str();
667 ASSERT_STREQ(
"1 2 3 4 5", Macro::DumpText(arr).c_str());
669 arr = Scanner::ParseLexem(
"macro @test(1,2,3,...):type; next \n; # sssssss\n @only lexem((((;; ;");
670 ASSERT_STREQ(
"macro @test ( 1 , 2 , 3 , ... ) : type ; next ; @only lexem ( ( ( ( ; ; ;", Macro::DumpText(arr).c_str());
std::shared_ptr< Term > TermPtr
std::vector< TermPtr > BlockType
const char * toString(TermID type)
std::string Dump(const T &iterable)