Alien-SmokeQt
view release on metacpan or search on metacpan
generator/parser/parser.cpp view on Meta::CPAN
if (!parseDeclaration(declaration))
{
reportError(("Expected a declaration"));
}
TemplateDeclarationAST *ast = CreateNode<TemplateDeclarationAST>(session->mempool);
ast->exported = exported;
ast->template_parameters = params;
ast->declaration = declaration;
UPDATE_POS(ast, start, declaration ? declaration->end_token : _M_last_valid_token+1);
node = ast;
return true;
}
bool Parser::parseOperator(OperatorAST *&node)
{
std::size_t start = session->token_stream->cursor();
OperatorAST *ast = CreateNode<OperatorAST>(session->mempool);
switch(session->token_stream->lookAhead())
{
case Token_new:
case Token_delete:
{
ast->op = session->token_stream->cursor();
advance();
if (session->token_stream->lookAhead() == '['
&& session->token_stream->lookAhead(1) == ']')
{
ast->open = session->token_stream->cursor();
advance();
ast->close = session->token_stream->cursor();
advance();
}
}
break;
case '+':
case '-':
case '*':
case '/':
case '%':
case '^':
case '&':
case '|':
case '~':
case '!':
case '=':
case '<':
case '>':
case ',':
case Token_assign:
case Token_shift:
case Token_eq:
case Token_not:
case Token_not_eq:
case Token_leq:
case Token_geq:
case Token_and:
case Token_or:
case Token_incr:
case Token_decr:
case Token_ptrmem:
case Token_arrow:
ast->op = session->token_stream->cursor();
advance();
break;
default:
if (session->token_stream->lookAhead() == '('
&& session->token_stream->lookAhead(1) == ')')
{
ast->op = ast->open = session->token_stream->cursor();
advance();
ast->close = session->token_stream->cursor();
advance();
}
else if (session->token_stream->lookAhead() == '['
&& session->token_stream->lookAhead(1) == ']')
{
ast->op = ast->open = session->token_stream->cursor();
advance();
ast->close = session->token_stream->cursor();
advance();
}
else
{
return false;
}
}
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
return true;
}
bool Parser::parseCvQualify(const ListNode<std::size_t> *&node)
{
std::size_t start = session->token_stream->cursor();
int tk;
while (0 != (tk = session->token_stream->lookAhead())
&& (tk == Token_const || tk == Token_volatile))
{
node = snoc(node, session->token_stream->cursor(), session->mempool);
advance();
}
return start != session->token_stream->cursor();
}
bool Parser::parseSimpleTypeSpecifier(TypeSpecifierAST *&node,
bool onlyIntegral)
{
std::size_t start = session->token_stream->cursor();
generator/parser/parser.cpp view on Meta::CPAN
while (session->token_stream->lookAhead() == Token_shift)
{
std::size_t op = session->token_stream->cursor();
advance();
ExpressionAST *rightExpr = 0;
if (!parseAdditiveExpression(rightExpr))
return false;
BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
ast->op = op;
ast->left_expression = node;
ast->right_expression = rightExpr;
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
}
return true;
}
bool Parser::parseRelationalExpression(ExpressionAST *&node, bool templArgs)
{
std::size_t start = session->token_stream->cursor();
if (!parseShiftExpression(node))
return false;
while (session->token_stream->lookAhead() == '<'
|| (session->token_stream->lookAhead() == '>' && !templArgs)
|| session->token_stream->lookAhead() == Token_leq
|| session->token_stream->lookAhead() == Token_geq)
{
std::size_t op = session->token_stream->cursor();
advance();
ExpressionAST *rightExpr = 0;
if (!parseShiftExpression(rightExpr))
return false;
BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
ast->op = op;
ast->left_expression = node;
ast->right_expression = rightExpr;
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
}
return true;
}
bool Parser::parseEqualityExpression(ExpressionAST *&node, bool templArgs)
{
std::size_t start = session->token_stream->cursor();
if (!parseRelationalExpression(node, templArgs))
return false;
while (session->token_stream->lookAhead() == Token_eq
|| session->token_stream->lookAhead() == Token_not_eq)
{
std::size_t op = session->token_stream->cursor();
advance();
ExpressionAST *rightExpr = 0;
if (!parseRelationalExpression(rightExpr, templArgs))
return false;
BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
ast->op = op;
ast->left_expression = node;
ast->right_expression = rightExpr;
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
}
return true;
}
bool Parser::parseAndExpression(ExpressionAST *&node, bool templArgs)
{
std::size_t start = session->token_stream->cursor();
if (!parseEqualityExpression(node, templArgs))
return false;
while (session->token_stream->lookAhead() == '&')
{
std::size_t op = session->token_stream->cursor();
advance();
ExpressionAST *rightExpr = 0;
if (!parseEqualityExpression(rightExpr, templArgs))
return false;
BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
ast->op = op;
ast->left_expression = node;
ast->right_expression = rightExpr;
UPDATE_POS(ast, start, _M_last_valid_token+1);
node = ast;
}
return true;
}
bool Parser::parseExclusiveOrExpression(ExpressionAST *&node, bool templArgs)
{
std::size_t start = session->token_stream->cursor();
if (!parseAndExpression(node, templArgs))
return false;
while (session->token_stream->lookAhead() == '^')
{
std::size_t op = session->token_stream->cursor();
advance();
( run in 0.910 second using v1.01-cache-2.11-cpan-e1769b4cff6 )