Implement full support for parsing primary expressions. We can now parse
authorChris Lattner <sabre@nondot.org>
Mon, 22 Jun 2009 06:32:03 +0000 (06:32 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 22 Jun 2009 06:32:03 +0000 (06:32 +0000)
all of health and voronoi (ignoring directives).  We only get 409 lines into
176.gcc though because we don't have binary operators yet:

Parsing 176.gcc.llc.s:409: unexpected token in operand list
movsbl _arityvec+1(,%edi,8), %eax
                ^

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73877 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-mc/AsmLexer.cpp
tools/llvm-mc/AsmLexer.h
tools/llvm-mc/AsmParser.cpp
tools/llvm-mc/AsmParser.h
tools/llvm-mc/llvm-mc.cpp

index 740215b683e92897ef9227b4c01d9d8dec3b1cbd..36faeb3facf8f5a2158d14989a037be42153f7bd 100644 (file)
@@ -235,6 +235,7 @@ asmtok::TokKind AsmLexer::LexToken() {
   case ':': return asmtok::Colon;
   case '+': return asmtok::Plus;
   case '-': return asmtok::Minus;
+  case '~': return asmtok::Tilde;
   case '(': return asmtok::LParen;
   case ')': return asmtok::RParen;
   case '*': return asmtok::Star;
index bad2cb931b954eebad997c835655d594c6dfb9ec..a6c93230c6cda364b78c450b6455957edbf7b177 100644 (file)
@@ -39,8 +39,7 @@ namespace asmtok {
     // No-value.
     EndOfStatement,
     Colon,
-    Plus,
-    Minus,
+    Plus, Minus, Tilde,
     Slash,    // '/'
     LParen, RParen,
     Star, Comma, Dollar
index c9583549bdf26067c71adfeeb096c022eeae6b24..397c5fe9c7cebe523df4cd16433d6fd7926eec32 100644 (file)
@@ -213,10 +213,25 @@ bool AsmParser::ParseX86MemOperand(X86Operand &Op) {
   return false;
 }
 
+/// ParseParenExpr - Parse a paren expression and return it.
+/// NOTE: This assumes the leading '(' has already been consumed.
+///
+/// parenexpr ::= expr)
+///
+bool AsmParser::ParseParenExpr(int64_t &Res) {
+  if (ParseExpression(Res)) return true;
+  if (Lexer.isNot(asmtok::RParen))
+    return TokError("expected ')' in parentheses expression");
+  Lexer.Lex();
+  return false;
+}
 
-/// ParseExpression - Parse an expression and return it.
-/// FIXME: This should handle real expressions, we do something trivial for now.
-bool AsmParser::ParseExpression(int64_t &Res) {
+/// ParsePrimaryExpr - Parse a primary expression and return it.
+///  primaryexpr ::= (parenexpr
+///  primaryexpr ::= symbol
+///  primaryexpr ::= number
+///  primaryexpr ::= ~,+,- primaryexpr
+bool AsmParser::ParsePrimaryExpr(int64_t &Res) {
   switch (Lexer.getKind()) {
   default:
     return TokError("unknown token in expression");
@@ -230,8 +245,27 @@ bool AsmParser::ParseExpression(int64_t &Res) {
     Res = Lexer.getCurIntVal();
     Lexer.Lex(); // Eat identifier.
     return false;
+  case asmtok::LParen:
+    Lexer.Lex(); // Eat the '('.
+    return ParseParenExpr(Res);
+  case asmtok::Tilde:
+  case asmtok::Plus:
+  case asmtok::Minus:
+    Lexer.Lex(); // Eat the operator.
+    return ParsePrimaryExpr(Res);
   }
 }
+
+/// ParseExpression - Parse an expression and return it.
+/// 
+///  expr ::= expr +,- expr          -> lowest.
+///  expr ::= expr |,^,&,! expr      -> middle.
+///  expr ::= expr *,/,%,<<,>> expr  -> highest.
+///  expr ::= primaryexpr
+///
+bool AsmParser::ParseExpression(int64_t &Res) {
+  return ParsePrimaryExpr(Res);
+}
   
   
   
index 670d987bfc3465136c6296f4ba31deb317029541..82eb433b61efa058dd032b278e6613d00c7e169f 100644 (file)
@@ -39,6 +39,8 @@ private:
   bool ParseX86Operand(X86Operand &Op);
   bool ParseX86MemOperand(X86Operand &Op);
   bool ParseExpression(int64_t &Res);
+  bool ParsePrimaryExpr(int64_t &Res);
+  bool ParseParenExpr(int64_t &Res);
 };
 
 } // end namespace llvm
index 7d0c571c723c29f7a514f45bc278972d9868a108..52205c48d0fb7fc2bcffc2ea30747df60f5d4d0a 100644 (file)
@@ -99,6 +99,7 @@ static int AsLexInput(const char *ProgName) {
     case asmtok::Colon:  outs() << "Colon\n"; break;
     case asmtok::Plus:   outs() << "Plus\n"; break;
     case asmtok::Minus:  outs() << "Minus\n"; break;
+    case asmtok::Tilde:  outs() << "Tilde\n"; break;
     case asmtok::Slash:  outs() << "Slash\n"; break;
     case asmtok::LParen: outs() << "LParen\n"; break;
     case asmtok::RParen: outs() << "RParen\n"; break;