diff --git a/src/daidepp/__init__.py b/src/daidepp/__init__.py index 734318c..d17191d 100644 --- a/src/daidepp/__init__.py +++ b/src/daidepp/__init__.py @@ -1,2 +1,2 @@ +from daidepp.daide_visitor import daide_visitor from daidepp.grammar import create_daide_grammar -from daidepp.node_visitor import daide_visitor diff --git a/src/daidepp/node_visitor.py b/src/daidepp/daide_visitor.py similarity index 97% rename from src/daidepp/node_visitor.py rename to src/daidepp/daide_visitor.py index 1880ea5..3df807d 100644 --- a/src/daidepp/node_visitor.py +++ b/src/daidepp/daide_visitor.py @@ -417,17 +417,6 @@ def visit_wve(self, node, visited_children): def visit_power(self, node, visited_children): return node.text - def visit_province(self, node, visited_children): - if isinstance(visited_children[0], str): - return node.text - - _, province, _, coast, _ = visited_children[0] - - return province + " " + coast - - def visit_coast(self, node, visited_children): - return node.text - def visit_prov_coast(self, node, visited_children): return node.text @@ -447,6 +436,24 @@ def visit_unit(self, node, visited_children): def visit_unit_type(self, node, visited_children): return node.text + def visit_province(self, node, visited_children): + if isinstance(visited_children, str): + return node.text + return visited_children[0] + + def visit_prov_landlock(self, node, visited_children): + return node.text + + def visit_prov_land_sea(self, node, visited_children): + return node.text + + def visit_prov_coast(self, node, visited_children): + _, province, _, coast, _ = visited_children[0] + return province.text + " " + coast.text + + def visit_coast(self, node, visited_children): + return node.text + def visit_turn(self, node, visited_children): season, _, year = visited_children return season + " " + year.text diff --git a/src/daidepp/grammar.py b/src/daidepp/grammar.py index 087e59b..dc80497 100644 --- a/src/daidepp/grammar.py +++ b/src/daidepp/grammar.py @@ -21,8 +21,8 @@ def _set_try_tokens(self): self.try_tokens: List[str] = try_tokens_strings @staticmethod - def from_level(level: DAIDE_LEVEL): - return create_daide_grammar(level) + def from_level(level: DAIDE_LEVEL, allow_just_arrangment: bool = False): + return create_daide_grammar(level, allow_just_arrangment) DAIDE_LEVEL = Literal[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130] @@ -58,6 +58,9 @@ def from_level(level: DAIDE_LEVEL): "try_tokens": '"PRP" / "PCE" / "ALY" / "VSS" / "DRW" / "SLO" / "NOT" / "YES" / "REJ" / "BWX" / "FCT"', } +# prov_no_coast: all province tokens without coasts +# province: all provinces including coasts + # Order Proposals LEVEL_20: GRAMMAR_DICT = { "xdo": '"XDO" lpar order rpar', @@ -77,10 +80,12 @@ def from_level(level: DAIDE_LEVEL): "wve": 'power ws "WVE"', "unit_type": '"AMY" / "FLT"', "unit": "power ws unit_type ws province", - "province": "prov_coast / prov_no_coast / prov_sea / (lpar prov_coast ws coast rpar)", + "prov_no_coast": "prov_land_sea / prov_landlock / prov_sea", + "prov_coast": '(lpar "STP" ws "SCS" rpar) / (lpar "STP" ws "SCS" rpar) / (lpar "SPA" ws "NCS" rpar) / (lpar "SPA" ws "SCS" rpar) / (lpar "BUL" ws "ECS" rpar) / (lpar "BUL" ws "SCS" rpar)', + "province": "prov_land_sea / prov_landlock / prov_sea / prov_coast", "coast": '"NCS" / "ECS" / "SCS" / "WCS"', - "prov_coast": '"ALB" / "ANK" / "APU" / "ARM" / "BEL" / "BER" / "BRE" / "BUL" / "CLY" / "CON" / "DEN" / "EDI" / "FIN" / "GAS" / "GRE" / "HOL" / "KIE" / "LON" / "LVN" / "LVP" / "MAR" / "NAF" / "NAP" / "NWY" / "PIC" / "PIE" / "POR" / "PRU" / "ROM" / "RUM" / "SEV" / "SMY" / "SPA" / "STP" / "SWE" / "SYR" / "TRI" / "TUN" / "TUS" / "VEN" / "YOR" / "WAL"', - "prov_no_coast": '"BOH" / "BUD" / "BUR" / "MOS" / "MUN" / "GAL" / "PAR" / "RUH" / "SER" / "SIL" / "TYR" / "UKR" / "VIE" / "WAR" ', + "prov_land_sea": '"ALB" / "ANK" / "APU" / "ARM" / "BEL" / "BER" / "BRE" / "BUL" / "CLY" / "CON" / "DEN" / "EDI" / "FIN" / "GAS" / "GRE" / "HOL" / "KIE" / "LON" / "LVN" / "LVP" / "MAR" / "NAF" / "NAP" / "NWY" / "PIC" / "PIE" / "POR" / "PRU" / "ROM" / "RUM" / "SEV" / "SMY" / "SPA" / "STP" / "SWE" / "SYR" / "TRI" / "TUN" / "TUS" / "VEN" / "YOR" / "WAL"', + "prov_landlock": '"BOH" / "BUD" / "BUR" / "MOS" / "MUN" / "GAL" / "PAR" / "RUH" / "SER" / "SIL" / "TYR" / "UKR" / "VIE" / "WAR" ', "prov_sea": '"ADR" / "AEG" / "BAL" / "BAR" / "BLA" / "BOT" / "EAS" / "ENG" / "HEL" / "ION" / "IRI" / "LYO" / "MAO" / "NAO" / "NTH" / "NWG" / "SKA" / "TYS" / "WES"', "supply_center": '"ANK" / "BEL" / "BER" / "BRE" / "BUD" / "BUL" / "CON" / "DEN" / "EDI" / "GRE" / "HOL" / "KIE" / "LON" / "LVP" / "MAR" / "MOS" / "MUN" / "NAP" / "NWY" / "PAR" / "POR" / "ROM" / "RUM" / "SER" / "SEV" / "SMY" / "SPA" / "STP" / "SWE" / "TRI" / "TUN" / "VEN" / "VIE" / "WAR"', "arrangement": f"{TRAIL_TOKEN}mto / xdo / dmz", diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..ea5b7c3 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,9 @@ +import pytest + + +@pytest.fixture(scope="session") +def sample_daide_messages(): + return [ + "PRP(XDO((ENG FLT EDI) SUP (ENG AMY LVP) MTO CLY))", + "PRP(XDO((ENG FLT (STP SCS)) SUP (ENG AMY LVP) MTO CLY))", + ] diff --git a/tests/test_daide_visitor.py b/tests/test_daide_visitor.py new file mode 100644 index 0000000..98bbcb5 --- /dev/null +++ b/tests/test_daide_visitor.py @@ -0,0 +1,12 @@ +from typing import List + + +def test_basic_visitor(sample_daide_messages: List[str]): + from daidepp.daide_visitor import daide_visitor + from daidepp.grammar import create_daide_grammar + + grammar = create_daide_grammar(level=130) + for message in sample_daide_messages: + tree = grammar.parse(message) + daide_visitor.visit(tree) + assert True