Skip to content

Commit f538d8a

Browse files
committed
refactored old code and bgun implementation on truth table
1 parent 49a20bf commit f538d8a

7 files changed

Lines changed: 111 additions & 73 deletions

File tree

evaluation_function/evaluation.py

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33

44
from evaluation_function.domain.evaluators import *
55
from evaluation_function.domain.formula import *
6-
from evaluation_function.parsing.tokenizer import *
7-
from evaluation_function.parsing.tree_builder import *
6+
7+
from evaluation_function.parsing.parser import formula_parser
8+
9+
10+
from evaluation_function.parsing.tree_builder_error import BuildError
811

912

1013
def evaluation_function(
@@ -73,28 +76,10 @@ def evaluation_function(
7376
feedback = None
7477
is_correct = False
7578

76-
# tokenize response
77-
tokenizer = Tokenizer(response)
78-
tokens = []
7979

80+
# parse response into Formula
8081
try:
81-
while True:
82-
token = tokenizer.next_token()
83-
tokens.append(token)
84-
if token.type == TokenType.EOF:
85-
break
86-
87-
except ValueError as e:
88-
return Result(
89-
is_correct=False,
90-
feedback_items=[(ValueError, str(e))]
91-
)
92-
93-
94-
# parse tokens into Formula
95-
try:
96-
builder = TreeBuilder(tokens)
97-
formula = builder.build()
82+
formula = formula_parser(response)
9883

9984
except BuildError as e:
10085
return Result(
@@ -104,33 +89,15 @@ def evaluation_function(
10489
except ValueError as e:
10590
return Result(
10691
is_correct=False,
107-
feedback_items=[(BuildError, str(e))]
92+
feedback_items=[(ValueError, str(e))]
10893
)
10994

11095

11196
if equivalence:
112-
113-
answer_tokenizer = Tokenizer(answer)
114-
answer_tokens = []
11597

11698
# tokenise answer
11799
try:
118-
while True:
119-
answer_token = answer_tokenizer.next_token()
120-
answer_tokens.append(answer_token)
121-
if answer_token.type == TokenType.EOF:
122-
break
123-
124-
except ValueError as e:
125-
return Result(
126-
is_correct=False,
127-
feedback_items=[(ValueError, str(e))]
128-
)
129-
130-
# parse answer tokens into Formula
131-
try:
132-
answer_builder = TreeBuilder(answer_tokens)
133-
answer_formula = answer_builder.build()
100+
answer_formula = formula_parser(answer)
134101

135102
except BuildError as e:
136103
return Result(
@@ -140,7 +107,7 @@ def evaluation_function(
140107
except ValueError as e:
141108
return Result(
142109
is_correct=False,
143-
feedback_items=[(BuildError, str(e))]
110+
feedback_items=[(ValueError, str(e))]
144111
)
145112

146113
is_correct = EquivalenceEvaluator(formula, answer_formula).evaluate()
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
from evaluation_function.domain.formula import *
3+
from evaluation_function.parsing.tokenizer import *
4+
from evaluation_function.parsing.tree_builder import *
5+
6+
def formula_parser(input: str) -> Formula:
7+
8+
# tokenize input
9+
tokenizer = Tokenizer(input)
10+
tokens = []
11+
12+
token = Token()
13+
while token.type != TokenType.EOF:
14+
token = tokenizer.next_token()
15+
tokens.append(token)
16+
17+
# parse tokens into Formula
18+
builder = TreeBuilder(tokens)
19+
formula = builder.build()
20+
21+
return formula

evaluation_function/parsing/token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class TokenType(Enum):
1616

1717

1818
class Token:
19-
def __init__(self, token_type: TokenType, value: str, position: int):
19+
def __init__(self, token_type: TokenType = None, value: str = "", position: int = -1):
2020
self.type = token_type
2121
self.value = value
2222
self.position = position

evaluation_function/parsing/tree_builder.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,7 @@
55
from .expression_builder import ExpressionBuilder
66
from .primary_builder import PrimaryBuilder
77
from .binary_operator_builder import BinaryOperatorBuilder
8-
9-
10-
class BuildError(Exception):
11-
def __init__(self, message: str, position: int):
12-
self.message = message
13-
self.position = position
14-
super().__init__(f"{message} at position {position}")
15-
8+
from .tree_builder_error import BuildError
169

1710
class TreeBuilder:
1811
def __init__(self, tokens: List[Token], expression_builder: Optional[ExpressionBuilder] = None):
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class BuildError(Exception):
2+
def __init__(self, message: str, position: int):
3+
self.message = message
4+
self.position = position
5+
super().__init__(f"{message} at position {position}")

evaluation_function/preview.py

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
from typing import Any
22
from lf_toolkit.preview import Result, Params, Preview
33

4-
from evaluation_function.domain.evaluators import *
54
from evaluation_function.domain.formula import *
6-
from evaluation_function.parsing.tokenizer import *
7-
from evaluation_function.parsing.tree_builder import *
5+
from evaluation_function.parsing.parser import formula_parser
6+
from evaluation_function.parsing.tree_builder_error import BuildError
87

98
def preview_function(response: Any, params: Params) -> Result:
109
"""
@@ -30,25 +29,9 @@ def preview_function(response: Any, params: Params) -> Result:
3029
feedback = None
3130
is_correct = False
3231

33-
# tokenize response
34-
tokenizer = Tokenizer(response)
35-
tokens = []
36-
37-
try:
38-
while True:
39-
token = tokenizer.next_token()
40-
tokens.append(token)
41-
if token.type == TokenType.EOF:
42-
break
43-
44-
except ValueError as e:
45-
return Result(preview=Preview(feedback = str(e)))
46-
47-
48-
# parse tokens into Formula
32+
# parse response into Formula
4933
try:
50-
builder = TreeBuilder(tokens)
51-
formula = builder.build()
34+
formula = formula_parser(response)
5235

5336
except BuildError as e:
5437
return Result(preview=Preview(feedback = str(e)))
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
from evaluation_function.domain.formula import (
3+
Formula,
4+
Atom
5+
)
6+
7+
8+
from evaluation_function.domain.evaluators import _extract_atoms
9+
from evaluation_function.domain.formula import *
10+
from evaluation_function.parsing.parser import formula_parser
11+
12+
from evaluation_function.parsing.tree_builder_error import BuildError
13+
14+
15+
# assume table sent through is of type list[list[str]]
16+
def evaluate(input: list[list[str]]) -> bool:
17+
18+
if len(input) == 0:
19+
raise Exception("no input was given")
20+
elif len(input) == 1:
21+
raise Exception("Must provide names and its truth values")
22+
23+
# find the atoms of the formula
24+
formulas = input[0]
25+
existing_atoms = set()
26+
27+
for i in range(len(formulas)):
28+
formula_string = formulas[i]
29+
error_message = f"formula in column {i+1} incorrect: "
30+
31+
# parse tokens into Formula
32+
try:
33+
formula = formula_parser(formula_string)
34+
35+
except BuildError as e:
36+
raise Exception(error_message + str(e))
37+
except ValueError as e:
38+
raise Exception(error_message + str(e))
39+
40+
# formula is valid
41+
42+
# if formula is an atom, keep track of it
43+
if isinstance(formula, Atom):
44+
existing_atoms.add(formula)
45+
46+
# otherwise check all atoms in formula is to the left on the table (i.e all atoms in formula has been defined)
47+
else:
48+
current_atoms = _extract_atoms(formula)
49+
50+
for atom in current_atoms:
51+
52+
# if an atom is undefined, erro
53+
if atom not in existing_atoms:
54+
raise Exception(f"in column {i+1}, atom {atom} in formula {formula_string} is undefined")
55+
56+
# all formula and its order in the table is valid
57+
58+
59+
60+
61+
62+
63+
64+
65+
66+
67+
68+
69+

0 commit comments

Comments
 (0)