mirror of
https://github.com/Brandon-Rozek/matmod.git
synced 2024-12-12 09:17:52 -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.current_line = 0
|
||||||
self.reststr = ""
|
self.reststr = ""
|
||||||
|
|
||||||
def __next__(self):
|
def next_line(self):
|
||||||
if self.reststr != "":
|
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
|
self.current_line += 1
|
||||||
return contents
|
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):
|
def set_reststr(self, reststr: str):
|
||||||
self.reststr = reststr
|
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:
|
def process_implications(infile: SourceFile, current_model_parts: ModelBuilder) -> bool:
|
||||||
"""Stage 5"""
|
"""Stage 5"""
|
||||||
if infile.reststr == "":
|
mimplication = parse_single_implication(infile, current_model_parts.size)
|
||||||
infile.reststr = next(infile).strip()
|
|
||||||
|
|
||||||
mimplication, reststr = parse_single_implication(infile.reststr, infile.current_line, current_model_parts.size)
|
|
||||||
infile.reststr = reststr
|
|
||||||
if mimplication is None:
|
if mimplication is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -237,14 +250,7 @@ def process_implications(infile: SourceFile, current_model_parts: ModelBuilder)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def process_necessitations(infile: SourceFile, current_model_parts: ModelBuilder) -> bool:
|
def process_necessitations(infile: SourceFile, current_model_parts: ModelBuilder) -> bool:
|
||||||
# TODO: In progress
|
mnecessitation = parse_single_necessitation(infile, current_model_parts.size)
|
||||||
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
|
|
||||||
if mnecessitation is None:
|
if mnecessitation is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -285,7 +291,7 @@ def parse_header(infile: SourceFile) -> UglyHeader:
|
||||||
"""
|
"""
|
||||||
Parse the header line from the ugly data format.
|
Parse the header line from the ugly data format.
|
||||||
"""
|
"""
|
||||||
header_line = next(infile).strip()
|
header_line = infile.next_line()
|
||||||
header_tokens = header_line.split(" ")
|
header_tokens = header_line.split(" ")
|
||||||
assert header_tokens[0] in ["0", "1"]
|
assert header_tokens[0] in ["0", "1"]
|
||||||
assert header_tokens[6] 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.
|
Parse the line representing the matrix size.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
size = int(next(infile))
|
size = int(infile.next_line())
|
||||||
# HACK: When necessitation and custom connectives are enabled
|
# HACK: When necessitation and custom connectives are enabled
|
||||||
# MaGIC may produce -1s at the beginning of the file
|
# MaGIC may produce -1s at the beginning of the file
|
||||||
if first_run:
|
if first_run:
|
||||||
while size == -1:
|
while size == -1:
|
||||||
size = int(next(infile))
|
size = int(infile.next_line())
|
||||||
|
|
||||||
if size == -1:
|
if size == -1:
|
||||||
return None
|
return None
|
||||||
|
@ -330,7 +336,7 @@ def parse_single_negation(infile: SourceFile, size: int) -> Optional[ModelFuncti
|
||||||
"""
|
"""
|
||||||
Parse the line representing the negation table.
|
Parse the line representing the negation table.
|
||||||
"""
|
"""
|
||||||
line = next(infile).strip()
|
line = infile.next_line()
|
||||||
if line == '-1':
|
if line == '-1':
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -410,7 +416,7 @@ def parse_single_order(infile: SourceFile, size: int) -> Optional[Tuple[ModelFun
|
||||||
"""
|
"""
|
||||||
Parse the line representing the ordering table
|
Parse the line representing the ordering table
|
||||||
"""
|
"""
|
||||||
line = next(infile).strip()
|
line = infile.next_line()
|
||||||
if line == '-1':
|
if line == '-1':
|
||||||
return None
|
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.
|
Parse the line representing which model values are designated.
|
||||||
"""
|
"""
|
||||||
line = next(infile).strip()
|
line = infile.next_line()
|
||||||
if line == '-1':
|
if line == '-1':
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -477,17 +483,26 @@ def parse_single_designated(infile: SourceFile, size: int) -> Optional[Set[Model
|
||||||
|
|
||||||
return designated_values
|
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,
|
Take the current string, parse an implication table from it,
|
||||||
and return along with it the remainder of the string
|
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 = {}
|
mapping = {}
|
||||||
table_i = 0
|
table_i = 0
|
||||||
|
@ -502,18 +517,26 @@ def parse_single_implication(instr: str, line: int, size: int) -> Tuple[ModelFun
|
||||||
mapping[(x, y)] = r
|
mapping[(x, y)] = r
|
||||||
|
|
||||||
mimplication = ModelFunction(2, mapping, "→")
|
mimplication = ModelFunction(2, mapping, "→")
|
||||||
reststr = " ".join(table[(size + 1)**2:])
|
return mimplication
|
||||||
return mimplication, reststr
|
|
||||||
|
|
||||||
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.
|
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
|
return None
|
||||||
|
|
||||||
row = instr.split(" ")
|
row = []
|
||||||
assert len(row) >= size + 1, f"Necessitation table doesn't match size at line {line}"
|
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 = {}
|
mapping = {}
|
||||||
|
|
||||||
for i, j in zip(range(size + 1), row):
|
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
|
mapping[(x, )] = y
|
||||||
|
|
||||||
mnecessitation = ModelFunction(1, mapping, "!")
|
mnecessitation = ModelFunction(1, mapping, "!")
|
||||||
reststr = " ".join(row[(size + 1):])
|
|
||||||
|
|
||||||
return mnecessitation, reststr
|
return mnecessitation
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Reference in a new issue