Compiler-Lexer
view release on metacpan or search on metacpan
src/compiler/lexer/Compiler_scanner.cpp view on Meta::CPAN
#include <lexer.hpp>
using namespace std;
namespace TokenType = Enum::Token::Type;
namespace SyntaxType = Enum::Parser::Syntax;
namespace TokenKind = Enum::Token::Kind;
Scanner::Scanner() :
isStringStarted(false), isRegexStarted(false), isPrototypeStarted(false), isFormatStarted(false),
formatDeclaredToken(NULL), commentFlag(false), skipFlag(false),
regex_delim(0), regex_middle_delim(0),
brace_count_inner_regex(0), bracket_count_inner_regex(0), cury_brace_count_inner_regex(0)
{
const char *regex_prefixes[] = {
"q", "qq", "qw", "qx", "qr", "m", NULL
};
const char *regex_replaces[] = {
"s", "y", "tr", NULL
};
const char *enable_regex_argument_funcs[] = {
"map", "grep", "split", NULL
};
const char *operators[] = {
"<=>", "**=", "//=", "||=", "&&=", "...", "$#{",
"$^A", "$^D", "$^E", "$^F", "$^G", "$^H", "$^I",
"$^L", "$^M", "$^O", "$^P", "$^R", "$^T", "$^W", "$^X",
"<=", ">=", ".=", "!=", "==", "+=", "-=",
"*=", "%=", "|=", "&=", "^=", "<<", ">>",
"++", "--", "**", "//", "&&", "||", "::",
"..", "=>", "->", "@{", "%{", "${", "@$",
"%$", "%-", "%+", "@-", "@+", "&$", "$#",
"<>", "!~", "~~", "=~",
"$0", "$1", "$2", "$3", "$4", "$5", "$6",
"$7", "$8", "$9",
"$&", "$`", "$'", "$+", "$.", "$/", "$|",
"$,", "$\\", "$\"", "$%", "$=", "$-", "$~",
"$^", "$*", "$:", "$;", "$?", "$!", "$@",
/*"$$",*/ "$<", "$>", "$(", "$)", "$[", "$]",
NULL
};
const char *dereference_prefixes[] = {
"@{", "%{", "${", "&{", "$#{", NULL
};
for (size_t i = 0; regex_prefixes[i] != NULL; i++) {
regex_prefix_map.insert(StringMap::value_type(regex_prefixes[i], ""));
}
for (size_t i = 0; regex_replaces[i] != NULL; i++) {
enable_regex_argument_func_map.insert(StringMap::value_type(enable_regex_argument_funcs[i], ""));
regex_replace_map.insert(StringMap::value_type(regex_replaces[i], ""));
}
for (size_t i = 0; operators[i] != NULL; i++) {
operator_map.insert(StringMap::value_type(operators[i], ""));
}
for (size_t i = 0; dereference_prefixes[i] != NULL; i++) {
dereference_prefix_map.insert(StringMap::value_type(dereference_prefixes[i], ""));
}
}
Token *Scanner::scanQuote(LexContext *ctx, char quote)
{
TokenManager *tmgr = ctx->tmgr;
ScriptManager *smgr = ctx->smgr;
char prev_ch = smgr->previousChar();
Token *prev_token = tmgr->lastToken();
if (prev_token && prev_token->info.type == TokenType::RegExp) {
return scanSymbol(ctx);
}
if (isalnum(prev_ch) || prev_ch == '_') {
char *token = ctx->buffer();
TokenInfo info = tmgr->getTokenInfo(token);
char cur_ch = smgr->currentChar();
if (cur_ch == '\'' && info.type == TokenType::Undefined) {
Token *namespace_tk = tmgr->new_Token(token, ctx->finfo);
namespace_tk->info = tmgr->getTokenInfo(TokenType::Namespace);
tmgr->add(namespace_tk);
ctx->clearBuffer();
ctx->writeBuffer(cur_ch);
Token *namespace_resolver = tmgr->new_Token(ctx->buffer(), ctx->finfo);
namespace_resolver->info = tmgr->getTokenInfo(TokenType::NamespaceResolver);
ctx->clearBuffer();
return namespace_resolver;
} else if (info.kind == TokenKind::RegPrefix || info.kind == TokenKind::RegReplacePrefix) {
Token *tk = tmgr->new_Token(token, ctx->finfo);
tk->info = info;
tmgr->add(tk);
ctx->clearBuffer();
return scanSymbol(ctx);
} else {
Token *tk = tmgr->new_Token(token, ctx->finfo);
tk->info = info;
tmgr->add(tk);
ctx->clearBuffer();
}
}
for (smgr->next(); !smgr->end(); smgr->next()) {
char ch = smgr->currentChar();
if (ch == '\n') {
( run in 0.839 second using v1.01-cache-2.11-cpan-97f6503c9c8 )