Add support for parsing [expr].

This is submitted by Joerg Sonnenberger and fixes his PR8685.

llvm-svn: 125595
This commit is contained in:
Roman Divacky 2011-02-15 20:43:39 +00:00
parent 8003924d10
commit 4e0f4957bc
3 changed files with 28 additions and 0 deletions

View File

@ -173,6 +173,7 @@ private:
bool ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc);
bool ParseBinOpRHS(unsigned Precedence, const MCExpr *&Res, SMLoc &EndLoc);
bool ParseParenExpr(const MCExpr *&Res, SMLoc &EndLoc);
bool ParseBracketExpr(const MCExpr *&Res, SMLoc &EndLoc);
/// ParseIdentifier - Parse an identifier or string (as a quoted identifier)
/// and set \arg Res to the identifier contents.
@ -492,6 +493,20 @@ bool AsmParser::ParseParenExpr(const MCExpr *&Res, SMLoc &EndLoc) {
return false;
}
/// ParseBracketExpr - Parse a bracket expression and return it.
/// NOTE: This assumes the leading '[' has already been consumed.
///
/// bracketexpr ::= expr]
///
bool AsmParser::ParseBracketExpr(const MCExpr *&Res, SMLoc &EndLoc) {
if (ParseExpression(Res)) return true;
if (Lexer.isNot(AsmToken::RBrac))
return TokError("expected ']' in brackets expression");
EndLoc = Lexer.getLoc();
Lex();
return false;
}
/// ParsePrimaryExpr - Parse a primary expression and return it.
/// primaryexpr ::= (parenexpr
/// primaryexpr ::= symbol
@ -587,6 +602,9 @@ bool AsmParser::ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
case AsmToken::LParen:
Lex(); // Eat the '('.
return ParseParenExpr(Res, EndLoc);
case AsmToken::LBrac:
Lex(); // Eat the '['.
return ParseBracketExpr(Res, EndLoc);
case AsmToken::Minus:
Lex(); // Eat the operator.
if (ParsePrimaryExpr(Res, EndLoc))

View File

@ -35,6 +35,8 @@ k:
check_expr 1 << 1, 2
check_expr 2 >> 1, 1
check_expr (~0 >> 1), -1
check_expr [~0 >> 1], -1
check_expr 4 * [4 + (3 + [2 * 2] + 1)], 48
check_expr 3 - 2, 1
check_expr 1 ^ 3, 2
check_expr 1 && 2, 1

View File

@ -0,0 +1,8 @@
// RUN: not llvm-mc -triple i386-unknown-unknown %s 2> %t1 > %t2
// RUN: FileCheck < %t1 %s
// CHECK: error: expected ']' in brackets expression
.size x, [.-x)
// CHECK: error: expected ')' in parentheses expression
.size y, (.-y]