summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@trolltech.com>2009-02-05 11:37:51 +0100
committerRoberto Raggi <qtc-committer@nokia.com>2009-02-05 14:30:24 +0100
commitd7defc6fe07d0a1682ef02eb48d87a5dd5b5fd7e (patch)
treed319e049665760738c8eefea7406d5e09d0d0ee1 /src/shared/cplusplus/Parser.cpp
parent40eabdd008c04a605999f518e47691fa79e7241a (diff)
downloadqt-creator-d7defc6fe07d0a1682ef02eb48d87a5dd5b5fd7e.tar.gz
Fixes: Parsing of GCC asm definitions.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r--src/shared/cplusplus/Parser.cpp90
1 files changed, 80 insertions, 10 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 4dfbcb995a..32d9b0ac7f 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -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)