Improve +processpre directive parsing to include #warning

This commit is contained in:
Sei Lisa 2020-10-29 20:17:50 +01:00
parent d5b83d50c4
commit 13e48ff956

View file

@ -427,12 +427,15 @@ class parser(object):
if directive[len(directive)-1:] == '\\': if directive[len(directive)-1:] == '\\':
raise EParseInvalidBackslash(self) raise EParseInvalidBackslash(self)
# compile the RE lazily, to avoid penalizing programs not using it
if self.parse_directive_re is None: if self.parse_directive_re is None:
self.parse_directive_re = re.compile( self.parse_directive_re = re.compile(
r'^#\s*(?:' r'^#\s*(?:'
r'(?:line)?\s+(\d+)(?:\s+("(?:\\.|[^"])*")(?:\s+\d+)*)?' r'(?:line)?\s+(\d+)(?:\s+("(?:\\.|[^"])*")(?:\s+\d+)*)?'
r'|' r'|'
r'([a-z0-9_]+)\s+([a-z0-9_]+)\s+([-+,a-z0-9_]+)' r'(?:pragma)\s+(?:OPT)\s+([-+,a-z0-9_]+)'
r'|'
r'([a-z0-9_]+)(?:\s+(.*)?)' # others
r')\s*$' r')\s*$'
, re.I , re.I
) )
@ -460,10 +463,8 @@ class parser(object):
actlinenum = self.script.count('\n', 0, self.pos) actlinenum = self.script.count('\n', 0, self.pos)
self.linedir.append((actlinenum, reflinenum, filename)) self.linedir.append((actlinenum, reflinenum, filename))
del actlinenum, reflinenum, filename del actlinenum, reflinenum, filename
else: elif match.group(3): # '#pragma OPT <options>' found
assert match.group(3) is not None opts = match.group(3).lower().split(',')
if match.group(3).lower() == 'pragma' and match.group(4) == 'OPT':
opts = match.group(5).lower().split(',')
for opt in opts: for opt in opts:
if opt != '': if opt != '':
if opt[0] == '-': if opt[0] == '-':
@ -472,13 +473,19 @@ class parser(object):
self.SetOpt(opt[1:], True) self.SetOpt(opt[1:], True)
else: else:
self.SetOpt(opt, True) self.SetOpt(opt, True)
elif match.group(4) == 'warning':
if match.group(5):
warning("Warning: #warning " + match.group(5))
else:
warning("Warning: #warning")
# else ignore
def GetToken(self): def GetToken(self):
"""Lexer""" """Lexer"""
try: try:
while self.pos < self.length: while self.pos < self.length:
# If an error occurs, it will happen at the start of this token. # In case of error, report it at the start of this token.
self.errorpos = self.pos self.errorpos = self.pos
c = self.script[self.pos] c = self.script[self.pos]