Fixes: Parsing of GCC asm definitions.

This commit is contained in:
Roberto Raggi
2009-02-05 11:37:51 +01:00
committed by Roberto Raggi
parent 40eabdd008
commit d7defc6fe0
5 changed files with 92 additions and 25 deletions

View File

@@ -627,22 +627,92 @@ bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node)
bool Parser::parseAsmDefinition(DeclarationAST *&node)
{
if (LA() == T_ASM) {
AsmDefinitionAST *ast = new (_pool) AsmDefinitionAST;
ast->asm_token = consumeToken();
parseCvQualifiers(ast->cv_qualifier_seq);
if (LA() == T_LPAREN) {
ast->lparen_token = cursor();
if (skip(T_LPAREN, T_RPAREN))
ast->rparen_token = consumeToken();
if (LA() != T_ASM)
return false;
AsmDefinitionAST *ast = new (_pool) AsmDefinitionAST;
ast->asm_token = consumeToken();
if (LA() == T_VOLATILE)
ast->volatile_token = consumeToken();
match(T_LPAREN, &ast->lparen_token);
unsigned string_literal_token = 0;
match(T_STRING_LITERAL, &string_literal_token);
while (LA() == T_STRING_LITERAL) {
consumeToken();
}
if (LA() == T_COLON) {
consumeToken(); // skip T_COLON
parseAsmOperandList();
if (LA() == T_COLON) {
consumeToken();
parseAsmOperandList();
if (LA() == T_COLON) {
consumeToken();
parseAsmClobberList();
}
} else if (LA() == T_COLON_COLON) {
consumeToken();
parseAsmClobberList();
}
} else if (LA() == T_COLON_COLON) {
consumeToken();
parseAsmClobberList();
}
match(T_RPAREN, &ast->rparen_token);
match(T_SEMICOLON, &ast->semicolon_token);
node = ast;
return true;
}
bool Parser::parseAsmOperandList()
{
if (parseAsmOperand()) {
while (LA() == T_COMMA) {
consumeToken();
parseAsmOperand();
}
match(T_SEMICOLON, &ast->semicolon_token);
node = ast;
return true;
}
return false;
}
bool Parser::parseAsmOperand()
{
unsigned string_literal_token = 0;
match(T_STRING_LITERAL, &string_literal_token);
if (LA() == T_LBRACKET) {
/*unsigned lbracket_token = */ consumeToken();
match(T_STRING_LITERAL, &string_literal_token);
unsigned rbracket_token = 0;
match(T_RBRACKET, &rbracket_token);
}
unsigned lparen_token = 0, rparen_token = 0;
match(T_LPAREN, &lparen_token);
ExpressionAST *expression = 0;
parseExpression(expression);
match(T_RPAREN, &rparen_token);
return true;
}
bool Parser::parseAsmClobberList()
{
if (LA() != T_STRING_LITERAL)
return false;
unsigned string_literal_token = consumeToken();
while (LA() == T_COMMA) {
consumeToken();
match(T_STRING_LITERAL, &string_literal_token);
}
return true;
}
bool Parser::parseTemplateDeclaration(DeclarationAST *&node)
{
if (! (LA(1) == T_TEMPLATE || ((LA(1) == T_EXPORT || LA(1) == T_EXTERN)