mirror of
https://github.com/Brandon-Rozek/matmod.git
synced 2024-12-03 12:46:59 -05:00
Finished parse refactor
This commit is contained in:
parent
4e4e19e117
commit
e293e5ac3e
1 changed files with 57 additions and 35 deletions
|
@ -23,14 +23,31 @@ class SourceFile:
|
|||
self.current_line = 0
|
||||
self.reststr = ""
|
||||
|
||||
def __next__(self):
|
||||
def next_line(self):
|
||||
if self.reststr != "":
|
||||
return self.reststr
|
||||
reststr = self.reststr
|
||||
self.reststr = ""
|
||||
return reststr
|
||||
|
||||
contents = next(self.fileobj)
|
||||
contents = next(self.fileobj).strip()
|
||||
self.current_line += 1
|
||||
return contents
|
||||
|
||||
def __next__(self):
|
||||
"""
|
||||
Grabs the next word token from the stream
|
||||
"""
|
||||
if self.reststr == "":
|
||||
self.reststr = next(self.fileobj).strip()
|
||||
self.current_line += 1
|
||||
|
||||
tokens = self.reststr.split(" ")
|
||||
next_token = tokens[0]
|
||||
self.reststr = " ".join(tokens[1:])
|
||||
|
||||
return next_token
|
||||
|
||||
|
||||
def set_reststr(self, reststr: str):
|
||||
self.reststr = reststr
|
||||
|
||||
|
@ -220,11 +237,7 @@ def process_designateds(infile: SourceFile, current_model_parts: ModelBuilder) -
|
|||
|
||||
def process_implications(infile: SourceFile, current_model_parts: ModelBuilder) -> bool:
|
||||
"""Stage 5"""
|
||||
if infile.reststr == "":
|
||||
infile.reststr = next(infile).strip()
|
||||
|
||||
mimplication, reststr = parse_single_implication(infile.reststr, infile.current_line, current_model_parts.size)
|
||||
infile.reststr = reststr
|
||||
mimplication = parse_single_implication(infile, current_model_parts.size)
|
||||
if mimplication is None:
|
||||
return False
|
||||
|
||||
|
@ -237,14 +250,7 @@ def process_implications(infile: SourceFile, current_model_parts: ModelBuilder)
|
|||
return True
|
||||
|
||||
def process_necessitations(infile: SourceFile, current_model_parts: ModelBuilder) -> bool:
|
||||
# TODO: In progress
|
||||
if infile.reststr != "":
|
||||
infile.reststr = next(infile).strip()
|
||||
|
||||
# TODO: This should match the implication way of doing things when
|
||||
# custom conenctives are involved (returning reststr)
|
||||
mnecessitation, reststr = parse_single_necessitation_from_str(infile.reststr, infile.current_line, current_model_parts.size)
|
||||
infile.reststr = reststr
|
||||
mnecessitation = parse_single_necessitation(infile, current_model_parts.size)
|
||||
if mnecessitation is None:
|
||||
return False
|
||||
|
||||
|
@ -285,7 +291,7 @@ def parse_header(infile: SourceFile) -> UglyHeader:
|
|||
"""
|
||||
Parse the header line from the ugly data format.
|
||||
"""
|
||||
header_line = next(infile).strip()
|
||||
header_line = infile.next_line()
|
||||
header_tokens = header_line.split(" ")
|
||||
assert header_tokens[0] in ["0", "1"]
|
||||
assert header_tokens[6] in ["0", "1"]
|
||||
|
@ -314,12 +320,12 @@ def parse_size(infile: SourceFile, first_run: bool) -> Optional[int]:
|
|||
Parse the line representing the matrix size.
|
||||
"""
|
||||
|
||||
size = int(next(infile))
|
||||
size = int(infile.next_line())
|
||||
# HACK: When necessitation and custom connectives are enabled
|
||||
# MaGIC may produce -1s at the beginning of the file
|
||||
if first_run:
|
||||
while size == -1:
|
||||
size = int(next(infile))
|
||||
size = int(infile.next_line())
|
||||
|
||||
if size == -1:
|
||||
return None
|
||||
|
@ -330,7 +336,7 @@ def parse_single_negation(infile: SourceFile, size: int) -> Optional[ModelFuncti
|
|||
"""
|
||||
Parse the line representing the negation table.
|
||||
"""
|
||||
line = next(infile).strip()
|
||||
line = infile.next_line()
|
||||
if line == '-1':
|
||||
return None
|
||||
|
||||
|
@ -410,7 +416,7 @@ def parse_single_order(infile: SourceFile, size: int) -> Optional[Tuple[ModelFun
|
|||
"""
|
||||
Parse the line representing the ordering table
|
||||
"""
|
||||
line = next(infile).strip()
|
||||
line = infile.next_line()
|
||||
if line == '-1':
|
||||
return None
|
||||
|
||||
|
@ -461,7 +467,7 @@ def parse_single_designated(infile: SourceFile, size: int) -> Optional[Set[Model
|
|||
"""
|
||||
Parse the line representing which model values are designated.
|
||||
"""
|
||||
line = next(infile).strip()
|
||||
line = infile.next_line()
|
||||
if line == '-1':
|
||||
return None
|
||||
|
||||
|
@ -477,17 +483,26 @@ def parse_single_designated(infile: SourceFile, size: int) -> Optional[Set[Model
|
|||
|
||||
return designated_values
|
||||
|
||||
def parse_single_implication(instr: str, line: int, size: int) -> Tuple[ModelFunction, str]:
|
||||
def parse_single_implication(infile: SourceFile, size: int) -> Tuple[ModelFunction]:
|
||||
"""
|
||||
Take the current string, parse an implication table from it,
|
||||
and return along with it the remainder of the string
|
||||
"""
|
||||
if instr == "-1":
|
||||
return None, ""
|
||||
|
||||
table = instr.split(" ")
|
||||
try:
|
||||
first_token = next(infile)
|
||||
if first_token == "-1":
|
||||
return None
|
||||
except StopIteration:
|
||||
return None
|
||||
|
||||
assert len(table) >= (size + 1)**2, f"Implication table does not match expected size at line {line}"
|
||||
table = []
|
||||
try:
|
||||
table = [first_token] + [next(infile) for _ in range((size + 1)**2 - 1)]
|
||||
except StopIteration:
|
||||
pass
|
||||
|
||||
assert len(table) == (size + 1)**2, f"Implication table does not match expected size at line {infile.current_line}"
|
||||
|
||||
mapping = {}
|
||||
table_i = 0
|
||||
|
@ -502,18 +517,26 @@ def parse_single_implication(instr: str, line: int, size: int) -> Tuple[ModelFun
|
|||
mapping[(x, y)] = r
|
||||
|
||||
mimplication = ModelFunction(2, mapping, "→")
|
||||
reststr = " ".join(table[(size + 1)**2:])
|
||||
return mimplication, reststr
|
||||
return mimplication
|
||||
|
||||
def parse_single_necessitation_from_str(instr: str, line: int, size: int) -> Optional[ModelFunction]:
|
||||
def parse_single_necessitation(infile: SourceFile, size: int) -> Optional[ModelFunction]:
|
||||
"""
|
||||
Parse the line representing the necessitation table.
|
||||
"""
|
||||
if instr == "-1":
|
||||
try:
|
||||
first_token = next(infile)
|
||||
if first_token == "-1":
|
||||
return None
|
||||
except StopIteration:
|
||||
return None
|
||||
|
||||
row = instr.split(" ")
|
||||
assert len(row) >= size + 1, f"Necessitation table doesn't match size at line {line}"
|
||||
row = []
|
||||
try:
|
||||
row = [first_token] + [next(infile) for _ in range(size)]
|
||||
except StopIteration:
|
||||
pass
|
||||
|
||||
assert len(row) == size + 1, f"Necessitation table doesn't match size at line {infile.current_line}"
|
||||
mapping = {}
|
||||
|
||||
for i, j in zip(range(size + 1), row):
|
||||
|
@ -522,9 +545,8 @@ def parse_single_necessitation_from_str(instr: str, line: int, size: int) -> Opt
|
|||
mapping[(x, )] = y
|
||||
|
||||
mnecessitation = ModelFunction(1, mapping, "!")
|
||||
reststr = " ".join(row[(size + 1):])
|
||||
|
||||
return mnecessitation, reststr
|
||||
return mnecessitation
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Reference in a new issue