Alien-SmokeQt
view release on metacpan or search on metacpan
generator/parser/parser.cpp view on Meta::CPAN
}
else if (_M_hold_errors)
{
PendingError pending;
pending.message = msg;
pending.cursor = session->token_stream->cursor();
m_pendingErrors.enqueue(pending);
}
}
bool Parser::skipUntil(int token)
{
clearComment();
while (session->token_stream->lookAhead())
{
if (session->token_stream->lookAhead() == token)
return true;
advance();
}
return false;
}
bool Parser::skipUntilDeclaration()
{
while (session->token_stream->lookAhead())
{
switch(session->token_stream->lookAhead())
{
case ';':
case '~':
case Token_scope:
case Token_identifier:
case Token_operator:
case Token_char:
case Token_size_t:
case Token_wchar_t:
case Token_bool:
case Token_short:
case Token_int:
case Token_long:
case Token_signed:
case Token_unsigned:
case Token_float:
case Token_double:
case Token_void:
case Token_extern:
case Token_namespace:
case Token_using:
case Token_typedef:
case Token_asm:
case Token_template:
case Token_export:
case Token_const: // cv
case Token_volatile: // cv
case Token_public:
case Token_protected:
case Token_private:
case Token_signals: // Qt
case Token_slots: // Qt
return true;
case '}':
return false;
default:
advance();
}
}
return false;
}
bool Parser::skipUntilStatement()
{
while (session->token_stream->lookAhead())
{
switch(session->token_stream->lookAhead())
{
case ';':
case '{':
case '}':
case Token_const:
case Token_volatile:
case Token_identifier:
case Token_case:
case Token_default:
case Token_if:
case Token_switch:
case Token_while:
case Token_do:
case Token_for:
case Token_break:
case Token_continue:
case Token_return:
case Token_goto:
case Token_try:
case Token_catch:
case Token_throw:
case Token_char:
case Token_size_t:
case Token_wchar_t:
case Token_bool:
case Token_short:
case Token_int:
case Token_long:
case Token_signed:
case Token_unsigned:
case Token_float:
case Token_double:
case Token_void:
case Token_class:
case Token_struct:
case Token_union:
case Token_enum:
case Token_scope:
case Token_template:
generator/parser/parser.cpp view on Meta::CPAN
}
}
if (session->token_stream->lookAhead() != '{')
{
rewind(start);
return false;
}
ADVANCE('{', "{");
ClassSpecifierAST *ast = CreateNode<ClassSpecifierAST>(session->mempool);
ast->win_decl_specifiers = winDeclSpec;
ast->class_key = class_key;
ast->name = name;
ast->base_clause = bases;
while (session->token_stream->lookAhead())
{
if (session->token_stream->lookAhead() == '}')
break;
std::size_t startDecl = session->token_stream->cursor();
DeclarationAST *memSpec = 0;
if (!parseMemberSpecification(memSpec))
{
if (startDecl == session->token_stream->cursor())
advance(); // skip at least one token
skipUntilDeclaration();
}
else
ast->member_specs = snoc(ast->member_specs, memSpec, session->mempool);
}
clearComment();
ADVANCE_NR('}', "}");
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
return true;
}
bool Parser::parseAccessSpecifier(DeclarationAST *&node)
{
std::size_t start = session->token_stream->cursor();
const ListNode<std::size_t> *specs = 0;
bool done = false;
while (!done)
{
switch(session->token_stream->lookAhead())
{
case Token_signals:
case Token_slots:
case Token_k_dcop:
case Token_k_dcop_signals:
case Token_public:
case Token_protected:
case Token_private:
specs = snoc(specs, session->token_stream->cursor(), session->mempool);
advance();
break;
default:
done = true;
break;
}
}
if (!specs)
return false;
ADVANCE(':', ":");
AccessSpecifierAST *ast = CreateNode<AccessSpecifierAST>(session->mempool);
ast->specs = specs;
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
return true;
}
bool Parser::parseMemberSpecification(DeclarationAST *&node)
{
std::size_t start = session->token_stream->cursor();
if (session->token_stream->lookAhead() == ';')
{
advance();
return true;
}
else if (session->token_stream->lookAhead() == Token_Q_OBJECT || session->token_stream->lookAhead() == Token_K_DCOP)
{
advance();
return true;
}
else if (parseTypedef(node))
{
return true;
}
else if (parseUsing(node))
{
return true;
}
else if (parseTemplateDeclaration(node))
{
return true;
}
else if (parseAccessSpecifier(node))
{
return true;
}
rewind(start);
const ListNode<std::size_t> *cv = 0;
parseCvQualify(cv);
generator/parser/parser.cpp view on Meta::CPAN
NameAST *initId = 0;
if (!parseName(initId, AcceptTemplate))
{
reportError(("Identifier expected"));
return false;
}
ADVANCE('(', "(");
ExpressionAST *expr = 0;
parseCommaExpression(expr);
ADVANCE(')', ")");
MemInitializerAST *ast = CreateNode<MemInitializerAST>(session->mempool);
ast->initializer_id = initId;
ast->expression = expr;
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
return true;
}
bool Parser::parseTypeIdList(const ListNode<TypeIdAST*> *&node)
{
TypeIdAST *typeId = 0;
if (!parseTypeId(typeId))
return false;
node = snoc(node, typeId, session->mempool);
while (session->token_stream->lookAhead() == ',')
{
advance();
if (parseTypeId(typeId))
{
node = snoc(node, typeId, session->mempool);
}
else
{
reportError(("Type id expected"));
break;
}
}
return true;
}
bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node)
{
std::size_t start = session->token_stream->cursor();
BaseSpecifierAST *ast = CreateNode<BaseSpecifierAST>(session->mempool);
if (session->token_stream->lookAhead() == Token_virtual)
{
ast->virt = session->token_stream->cursor();
advance();
int tk = session->token_stream->lookAhead();
if (tk == Token_public || tk == Token_protected
|| tk == Token_private)
{
ast->access_specifier = session->token_stream->cursor();
advance();
}
}
else
{
int tk = session->token_stream->lookAhead();
if (tk == Token_public || tk == Token_protected
|| tk == Token_private)
{
ast->access_specifier = session->token_stream->cursor();
advance();
}
if (session->token_stream->lookAhead() == Token_virtual)
{
ast->virt = session->token_stream->cursor();
advance();
}
}
if (!parseName(ast->name, AcceptTemplate))
reportError(("Class name expected"));
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
return true;
}
bool Parser::parseInitializerList(const ListNode<InitializerClauseAST*> *&node)
{
const ListNode<InitializerClauseAST*> *list = 0;
do
{
if (list)
advance(); // skip ',' separator between clauses
InitializerClauseAST *init_clause = 0;
if (!parseInitializerClause(init_clause))
{
return false;
}
list = snoc(list,init_clause,session->mempool);
} while (session->token_stream->lookAhead() == ',');
node = list;
return true;
}
bool Parser::parseInitializerClause(InitializerClauseAST *&node)
{
std::size_t start = session->token_stream->cursor();
InitializerClauseAST *ast = CreateNode<InitializerClauseAST>(session->mempool);
if (session->token_stream->lookAhead() == '{')
{
advance();
const ListNode<InitializerClauseAST*> *initializer_list = 0;
if (session->token_stream->lookAhead() != '}' &&
!parseInitializerList(initializer_list))
{
return false;
}
ADVANCE('}',"}");
( run in 0.876 second using v1.01-cache-2.11-cpan-39bf76dae61 )