mirror of
https://github.com/catseye/SixtyPical.git
synced 2025-02-03 06:34:32 +00:00
Start of typedef support.
This commit is contained in:
parent
0be721667a
commit
74f8675761
@ -19,6 +19,7 @@ class Parser(object):
|
|||||||
def __init__(self, text):
|
def __init__(self, text):
|
||||||
self.scanner = Scanner(text)
|
self.scanner = Scanner(text)
|
||||||
self.symbols = {} # token -> SymEntry
|
self.symbols = {} # token -> SymEntry
|
||||||
|
self.typedefs = {} # token -> Type AST
|
||||||
for token in ('a', 'x', 'y'):
|
for token in ('a', 'x', 'y'):
|
||||||
self.symbols[token] = SymEntry(None, LocationRef(TYPE_BYTE, token))
|
self.symbols[token] = SymEntry(None, LocationRef(TYPE_BYTE, token))
|
||||||
for token in ('c', 'z', 'n', 'v'):
|
for token in ('c', 'z', 'n', 'v'):
|
||||||
@ -35,7 +36,11 @@ class Parser(object):
|
|||||||
def program(self):
|
def program(self):
|
||||||
defns = []
|
defns = []
|
||||||
routines = []
|
routines = []
|
||||||
while self.scanner.on('byte', 'word', 'table', 'vector', 'buffer', 'pointer'): # 'routine',
|
while self.scanner.on('typedef'):
|
||||||
|
typedef = self.typedef()
|
||||||
|
typenames = ['byte', 'word', 'table', 'vector', 'buffer', 'pointer'] # 'routine',
|
||||||
|
typenames.extend(self.typedefs.keys())
|
||||||
|
while self.scanner.on(*typenames):
|
||||||
defn = self.defn()
|
defn = self.defn()
|
||||||
name = defn.name
|
name = defn.name
|
||||||
if name in self.symbols:
|
if name in self.symbols:
|
||||||
@ -78,6 +83,15 @@ class Parser(object):
|
|||||||
|
|
||||||
return Program(defns=defns, routines=routines)
|
return Program(defns=defns, routines=routines)
|
||||||
|
|
||||||
|
def typedef(self):
|
||||||
|
self.scanner.expect('typedef')
|
||||||
|
type_ = self.defn_type()
|
||||||
|
name = self.defn_name()
|
||||||
|
if name in self.typedefs:
|
||||||
|
raise SyntaxError('Type "%s" already declared' % name)
|
||||||
|
self.typedefs[name] = type_
|
||||||
|
return type_
|
||||||
|
|
||||||
def defn(self):
|
def defn(self):
|
||||||
type_ = self.defn_type()
|
type_ = self.defn_type()
|
||||||
name = self.defn_name()
|
name = self.defn_name()
|
||||||
@ -131,9 +145,14 @@ class Parser(object):
|
|||||||
elif self.scanner.consume('buffer'):
|
elif self.scanner.consume('buffer'):
|
||||||
size = self.defn_size()
|
size = self.defn_size()
|
||||||
return BufferType(size)
|
return BufferType(size)
|
||||||
else:
|
elif self.scanner.consume('pointer'):
|
||||||
self.scanner.expect('pointer')
|
|
||||||
return PointerType()
|
return PointerType()
|
||||||
|
else:
|
||||||
|
type_name = self.scanner.token
|
||||||
|
self.scanner.scan()
|
||||||
|
if type_name not in self.typedefs:
|
||||||
|
raise SyntaxError("Undefined type '%s'" % type_name)
|
||||||
|
return self.typedefs[type_name]
|
||||||
|
|
||||||
def defn_name(self):
|
def defn_name(self):
|
||||||
self.scanner.check_type('identifier')
|
self.scanner.check_type('identifier')
|
||||||
|
@ -153,6 +153,26 @@ Tables of different types.
|
|||||||
| }
|
| }
|
||||||
= ok
|
= ok
|
||||||
|
|
||||||
|
Typedefs of different types.
|
||||||
|
|
||||||
|
| typedef byte octet
|
||||||
|
| typedef table[256] octet twokay
|
||||||
|
| typedef routine trashes a game_routine
|
||||||
|
| vector game_routine start_game
|
||||||
|
|
|
||||||
|
| routine main {
|
||||||
|
| }
|
||||||
|
= ok
|
||||||
|
|
||||||
|
Can't have two typedefs with the same name.
|
||||||
|
|
||||||
|
| typedef byte frank
|
||||||
|
| typedef word frank
|
||||||
|
|
|
||||||
|
| routine main {
|
||||||
|
| }
|
||||||
|
? SyntaxError
|
||||||
|
|
||||||
Explicit memory address.
|
Explicit memory address.
|
||||||
|
|
||||||
| byte screen @ 1024
|
| byte screen @ 1024
|
||||||
|
Loading…
x
Reference in New Issue
Block a user