ISA parser: Don't look for operands in strings.
authorGabe Black <gblack@eecs.umich.edu>
Thu, 8 Sep 2011 10:21:14 +0000 (03:21 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 8 Sep 2011 10:21:14 +0000 (03:21 -0700)
src/arch/isa_parser.py

index e7598ffe88ef302944054ecc2fa4af1374120dee..863c7c70ef1ffd8e5e6280535c44adf45b2bf740 100755 (executable)
@@ -687,8 +687,9 @@ class OperandList(object):
     def __init__(self, parser, code):
         self.items = []
         self.bases = {}
-        # delete comments so we don't match on reg specifiers inside
-        code = commentRE.sub('', code)
+        # delete strings and comments so we don't match on operands inside
+        for regEx in (stringRE, commentRE):
+            code = regEx.sub('', code)
         # search for operands
         next_pos = 0
         while 1:
@@ -802,8 +803,9 @@ class SubOperandList(OperandList):
     def __init__(self, parser, code, master_list):
         self.items = []
         self.bases = {}
-        # delete comments so we don't match on reg specifiers inside
-        code = commentRE.sub('', code)
+        # delete strings and comments so we don't match on operands inside
+        for regEx in (stringRE, commentRE):
+            code = regEx.sub('', code)
         # search for operands
         next_pos = 0
         while 1:
@@ -854,6 +856,9 @@ class SubOperandList(OperandList):
                     error("Code block has more than one memory operand.")
                 self.memOperand = op_desc
 
+# Regular expression object to match C++ strings
+stringRE = re.compile(r'"([^"\\]|\\.)*"')
+
 # Regular expression object to match C++ comments
 # (used in findOperands())
 commentRE = re.compile(r'(^)?[^\S\n]*/(?:\*(.*?)\*/[^\S\n]*|/[^\n]*)($)?',