mirror of
https://github.com/python/cpython.git
synced 2025-11-03 11:23:31 +00:00
- Added support for inherent pointer types (typedefs of arrays)
- Added a debug class variable to enable parser debugging.
This commit is contained in:
parent
da70485694
commit
ededa90f67
1 changed files with 34 additions and 0 deletions
|
|
@ -32,6 +32,9 @@ Error = "scantools.Error"
|
||||||
|
|
||||||
class Scanner:
|
class Scanner:
|
||||||
|
|
||||||
|
# Set to 1 in subclass to debug your scanner patterns.
|
||||||
|
debug = 0
|
||||||
|
|
||||||
def __init__(self, input = None, output = None, defsoutput = None):
|
def __init__(self, input = None, output = None, defsoutput = None):
|
||||||
self.initsilent()
|
self.initsilent()
|
||||||
self.initblacklists()
|
self.initblacklists()
|
||||||
|
|
@ -119,6 +122,7 @@ if missing: raise "Missing Types"
|
||||||
|
|
||||||
def initrepairinstructions(self):
|
def initrepairinstructions(self):
|
||||||
self.repairinstructions = self.makerepairinstructions()
|
self.repairinstructions = self.makerepairinstructions()
|
||||||
|
self.inherentpointertypes = self.makeinherentpointertypes()
|
||||||
|
|
||||||
def makerepairinstructions(self):
|
def makerepairinstructions(self):
|
||||||
"""Parse the repair file into repair instructions.
|
"""Parse the repair file into repair instructions.
|
||||||
|
|
@ -211,6 +215,9 @@ if missing: raise "Missing Types"
|
||||||
list.append((fpat, patterns, replacements))
|
list.append((fpat, patterns, replacements))
|
||||||
return list
|
return list
|
||||||
|
|
||||||
|
def makeinherentpointertypes(self):
|
||||||
|
return []
|
||||||
|
|
||||||
def openrepairfile(self, filename = "REPAIR"):
|
def openrepairfile(self, filename = "REPAIR"):
|
||||||
try:
|
try:
|
||||||
return open(filename, "r")
|
return open(filename, "r")
|
||||||
|
|
@ -395,14 +402,24 @@ if missing: raise "Missing Types"
|
||||||
while 1:
|
while 1:
|
||||||
try: line = self.getline()
|
try: line = self.getline()
|
||||||
except EOFError: break
|
except EOFError: break
|
||||||
|
if self.debug:
|
||||||
|
self.report("LINE: %s" % `line`)
|
||||||
if self.comment1.match(line) >= 0:
|
if self.comment1.match(line) >= 0:
|
||||||
line = self.comment1.group('rest')
|
line = self.comment1.group('rest')
|
||||||
|
if self.debug:
|
||||||
|
self.report("\tafter comment1: %s" % `line`)
|
||||||
while self.comment2.match(line) >= 0:
|
while self.comment2.match(line) >= 0:
|
||||||
line = self.comment2.group('rest1')+self.comment2.group('rest2')
|
line = self.comment2.group('rest1')+self.comment2.group('rest2')
|
||||||
|
if self.debug:
|
||||||
|
self.report("\tafter comment2: %s" % `line`)
|
||||||
if self.defsfile and self.sym.match(line) >= 0:
|
if self.defsfile and self.sym.match(line) >= 0:
|
||||||
|
if self.debug:
|
||||||
|
self.report("\tmatches sym.")
|
||||||
self.dosymdef()
|
self.dosymdef()
|
||||||
continue
|
continue
|
||||||
if self.head.match(line) >= 0:
|
if self.head.match(line) >= 0:
|
||||||
|
if self.debug:
|
||||||
|
self.report("\tmatches head.")
|
||||||
self.dofuncspec()
|
self.dofuncspec()
|
||||||
continue
|
continue
|
||||||
except EOFError:
|
except EOFError:
|
||||||
|
|
@ -411,6 +428,8 @@ if missing: raise "Missing Types"
|
||||||
|
|
||||||
def dosymdef(self):
|
def dosymdef(self):
|
||||||
name, defn = self.sym.group('name', 'defn')
|
name, defn = self.sym.group('name', 'defn')
|
||||||
|
if self.debug:
|
||||||
|
self.report("\tsym: name=%s, defn=%s" % (`name`, `defn`))
|
||||||
if not name in self.blacklistnames:
|
if not name in self.blacklistnames:
|
||||||
self.defsfile.write("%s = %s\n" % (name, defn))
|
self.defsfile.write("%s = %s\n" % (name, defn))
|
||||||
else:
|
else:
|
||||||
|
|
@ -421,16 +440,29 @@ if missing: raise "Missing Types"
|
||||||
raw = self.line
|
raw = self.line
|
||||||
while self.tail.search(raw) < 0:
|
while self.tail.search(raw) < 0:
|
||||||
line = self.getline()
|
line = self.getline()
|
||||||
|
if self.debug:
|
||||||
|
self.report("* CONTINUATION LINE: %s" % `line`)
|
||||||
if self.comment1.match(line) >= 0:
|
if self.comment1.match(line) >= 0:
|
||||||
line = self.comment1.group('rest')
|
line = self.comment1.group('rest')
|
||||||
|
if self.debug:
|
||||||
|
self.report("\tafter comment1: %s" % `line`)
|
||||||
while self.comment2.match(line) >= 0:
|
while self.comment2.match(line) >= 0:
|
||||||
line = self.comment2.group('rest1')+self.comment2.group('rest2')
|
line = self.comment2.group('rest1')+self.comment2.group('rest2')
|
||||||
|
if self.debug:
|
||||||
|
self.report("\tafter comment1: %s" % `line`)
|
||||||
raw = raw + line
|
raw = raw + line
|
||||||
|
if self.debug:
|
||||||
|
self.report("* WHOLE LINE: %s" % `raw`)
|
||||||
self.processrawspec(raw)
|
self.processrawspec(raw)
|
||||||
|
|
||||||
def processrawspec(self, raw):
|
def processrawspec(self, raw):
|
||||||
if self.whole.search(raw) < 0:
|
if self.whole.search(raw) < 0:
|
||||||
self.report("Bad raw spec: %s", `raw`)
|
self.report("Bad raw spec: %s", `raw`)
|
||||||
|
if self.debug:
|
||||||
|
if self.type.search(raw) < 0:
|
||||||
|
self.report("(Type already doesn't match)")
|
||||||
|
else:
|
||||||
|
self.report("(Type matched: %s)" % `self.type.group('type')`)
|
||||||
return
|
return
|
||||||
type, name, args = self.whole.group('type', 'name', 'args')
|
type, name, args = self.whole.group('type', 'name', 'args')
|
||||||
type = regsub.gsub("\*", " ptr", type)
|
type = regsub.gsub("\*", " ptr", type)
|
||||||
|
|
@ -486,6 +518,8 @@ if missing: raise "Missing Types"
|
||||||
elif type[-4:] == "_ptr":
|
elif type[-4:] == "_ptr":
|
||||||
type = type[:-4]
|
type = type[:-4]
|
||||||
mode = "OutMode"
|
mode = "OutMode"
|
||||||
|
elif type in self.inherentpointertypes:
|
||||||
|
mode = "OutMode"
|
||||||
if type[-4:] == "_far":
|
if type[-4:] == "_far":
|
||||||
type = type[:-4]
|
type = type[:-4]
|
||||||
return type, name, mode
|
return type, name, mode
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue