[llvm-commits] [llvm] r73877 - in /llvm/trunk/tools/llvm-mc: AsmLexer.cpp AsmLexer.h AsmParser.cpp AsmParser.h llvm-mc.cpp

Chris Lattner sabre at nondot.org
Sun Jun 21 23:32:03 PDT 2009


Author: lattner
Date: Mon Jun 22 01:32:03 2009
New Revision: 73877

URL: http://llvm.org/viewvc/llvm-project?rev=73877&view=rev
Log:
Implement full support for parsing primary expressions.  We can now parse
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
	      	         ^


Modified:
    llvm/trunk/tools/llvm-mc/AsmLexer.cpp
    llvm/trunk/tools/llvm-mc/AsmLexer.h
    llvm/trunk/tools/llvm-mc/AsmParser.cpp
    llvm/trunk/tools/llvm-mc/AsmParser.h
    llvm/trunk/tools/llvm-mc/llvm-mc.cpp

Modified: llvm/trunk/tools/llvm-mc/AsmLexer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmLexer.cpp?rev=73877&r1=73876&r2=73877&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/AsmLexer.cpp (original)
+++ llvm/trunk/tools/llvm-mc/AsmLexer.cpp Mon Jun 22 01:32:03 2009
@@ -235,6 +235,7 @@
   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;

Modified: llvm/trunk/tools/llvm-mc/AsmLexer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmLexer.h?rev=73877&r1=73876&r2=73877&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/AsmLexer.h (original)
+++ llvm/trunk/tools/llvm-mc/AsmLexer.h Mon Jun 22 01:32:03 2009
@@ -39,8 +39,7 @@
     // No-value.
     EndOfStatement,
     Colon,
-    Plus,
-    Minus,
+    Plus, Minus, Tilde,
     Slash,    // '/'
     LParen, RParen,
     Star, Comma, Dollar

Modified: llvm/trunk/tools/llvm-mc/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmParser.cpp?rev=73877&r1=73876&r2=73877&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/AsmParser.cpp (original)
+++ llvm/trunk/tools/llvm-mc/AsmParser.cpp Mon Jun 22 01:32:03 2009
@@ -213,10 +213,25 @@
   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 @@
     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);
+}
   
   
   

Modified: llvm/trunk/tools/llvm-mc/AsmParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmParser.h?rev=73877&r1=73876&r2=73877&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/AsmParser.h (original)
+++ llvm/trunk/tools/llvm-mc/AsmParser.h Mon Jun 22 01:32:03 2009
@@ -39,6 +39,8 @@
   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

Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=73877&r1=73876&r2=73877&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
+++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Mon Jun 22 01:32:03 2009
@@ -99,6 +99,7 @@
     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;





More information about the llvm-commits mailing list