& ch! = ' n')
{= lexer_get_char (cb);
} = 1;
} if (ch2 == '*')
{count = 1;// Внутрішній лічильник/*/*/* ... */*/*/= Lexer_get_char (cb); = 0; (ch! = TOK_EOF)
{
// Коментар закінчився символом '* /' (ch == '/' && ch2 == '*')
{(- count <= 0)
{= 1;;
}
}
// Пропускаємо все що всередині коментаря/*
else if (ch == '*' && ch2 == '/')
{+ +;
} if (ch == ' n' | | ch == ' r')
{
;
}
/* Попередній символ */= ch; = lexer_get_char (cb);
} (ch == TOK_EOF && count)
{_error (cb, "Багатостроковий коментар не закритий/* ... * /");
}
}
{_put_back (cb, ch2);
}
} (move) = lexer_get_char (cb);;
} ch;
} lexer_lookahead (CodeBuffer * cb, int _match_ch, int _remove)
{ret; ch = lexer_get_charEx (cb); (ch == _match_ch)
{(! _remove) lexer_put_back (cb, ch); = 1;
}
{_put_back (cb, ch); = 0;
} ret;
} lexer_get_char (CodeBuffer * cb)
{ch = TOK_EOF;
/* Перевіряємо вміст буфера */
if (cb-> char_backbuf [0]! = ' 0')
{_t len ​​= strlen (cb-> char_backbuf); = * (cb-> char_backbuf + len - 1);
* (cb-> char_backbuf + len-1) = ' 0'; ch;
} (! cb-> text) TOK_EOF; if (* (cb-> text + cb-> curr_pos) == TOK_EOF)
{TOK_EOF;
} = * (cb-> text + cb-> curr_pos); (ch == ' n')> line_num + +;> curr_pos + +; ch;
} lexer_error (CodeBuffer * cb, char * _msg)
{(stderr, "Лексична помилка:% s.% s n", (cb-> name? cb-> name: ""), _msg); p>
} lexer_match (char * tok1, char * tok2)
{(! (tok1 && tok2)) return FALSE;
size_t len1 = strlen (tok1); _t len2 = strlen (tok2); (len2
/* Відповідність шаблону в частині tokenа, наприклад lexer_match ("abcd", "ab") => TRUE */
return! strncmp (tok1, tok2, len2);
else
/* Довжина Tokenа і шаблону повинні збігатися */
return! strcmp (tok1, tok2); <...