Skip to content

Commit

Permalink
Rework grammars constants and add another template
Browse files Browse the repository at this point in the history
  • Loading branch information
KubEF committed May 9, 2024
1 parent 560b701 commit 9ad166f
Show file tree
Hide file tree
Showing 10 changed files with 360 additions and 182 deletions.
3 changes: 3 additions & 0 deletions tests/autotests/constants.py
@@ -1,5 +1,8 @@
LABEL: str = "label"
IS_FINAL: str = "is_final"
IS_START: str = "is_start"
REGEXP = "regexp"
CFG = "cfg"
EBNF = "ebnf"

LABELS: list[str] = ["a", "b", "c", "d", "e", "f", "g", "h"]
14 changes: 7 additions & 7 deletions tests/autotests/fixtures.py
@@ -1,14 +1,14 @@
import pytest
from helper import generate_rnd_graph
from helper import generate_rnd_graph, generate_rnd_thick_graph
from networkx import MultiDiGraph
from constants import LABELS
import random


@pytest.fixture(scope="function", params=range(5))
def graph(request) -> MultiDiGraph:
return generate_rnd_graph(20, 40, LABELS)
funcs = [generate_rnd_thick_graph, generate_rnd_graph]


@pytest.fixture(scope="function", params=range(8))
def small_graph(request) -> MultiDiGraph:
return generate_rnd_graph(1, 20, LABELS)
def graph(request) -> MultiDiGraph:
fun = random.choice(funcs)
# task 6 takes a long time if there are ranges [1, 100]
return fun(1, 40, LABELS)
341 changes: 268 additions & 73 deletions tests/autotests/grammars_constants.py
@@ -1,78 +1,273 @@
from pyformlang.cfg import cfg
from constants import *

REGEXP_CFG: dict[str, list[cfg.CFG]] = {
"a": [cfg.CFG.from_text("S -> a"), cfg.CFG.from_text("S -> N B\nB -> $\nN -> a")],
"a*": [
cfg.CFG.from_text("S -> $ | a S"),
cfg.CFG.from_text("S -> $ | S S | a"),
cfg.CFG.from_text("S -> S a S | $"),
],
"a b c": [cfg.CFG.from_text("S -> a b c"), cfg.CFG.from_text("S -> a B\nB -> b c")],
"a*b*": [
cfg.CFG.from_text("S -> S1 S2\nS2 -> $ | b S2\nS1 -> $ | a S1"),
cfg.CFG.from_text("S -> $ | S1 | a S\nS1 -> $ | b S1"),
],
"(a b)*": [
cfg.CFG.from_text("S -> $ | a b S"),
cfg.CFG.from_text("S -> $ | S S1\nS1 -> a b"),
],
"a b*c*": [
cfg.CFG.from_text("S -> S1 S2 S3\nS1 -> a\nS2 -> $ | S2 b\nS3 -> $ | c S3"),
cfg.CFG.from_text("S -> a S2 S3\nS2 -> S2 b | $\nS3 -> c | $ | S3 S3"),
],
"(a|b|c|d|e)*": [
cfg.CFG.from_text("S -> $ | S1 S\nS1 -> a | b | c | d | e"),
cfg.CFG.from_text("S -> $ | a | b | c | d | e | S S"),
cfg.CFG.from_text("S -> $ | a S | b S | c S | e S | d S"),
],
"((a | b) * c)*(d | e)": [
cfg.CFG.from_text(
"S -> S1 S2\nS1 -> S1 S1 | $ | S3 c\n S2 -> d | e\n S3 -> b S3 | $ | a S3"
),
cfg.CFG.from_text("S -> S1 d | S1 e\nS1 -> S1 S3 c | $\nS3 -> b S3 | $ | a S3"),
],
}
GRAMMARS: list[list[cfg.CFG]] = [
[
cfg.CFG.from_text("S -> $ | a S b | S S"),
cfg.CFG.from_text("S -> $ | a S b S"),
cfg.CFG.from_text("S -> $ | S a S b"),
cfg.CFG.from_text("S -> $ | a S b | S S S"),
],
[
cfg.CFG.from_text("S -> $ | a S b | c S d | S S"),
cfg.CFG.from_text("S -> $ | a S b S | c S d S"),
cfg.CFG.from_text("S -> $ | S a S b | S c S d"),
cfg.CFG.from_text("S -> $ | a S b | c S d S | S S S"),
],
[
cfg.CFG.from_text("S -> $ | S1 S S2\nS1 -> a | c\n S2 -> b | d\n S -> S S"),
cfg.CFG.from_text("S -> $ | S1 S S2 S\n S1 -> a | c\nS2 -> b | d"),
cfg.CFG.from_text("S -> $ | S a S b | S a S d | S c S d | S c S b"),
cfg.CFG.from_text("S -> $ | S1 S S2 | S S S\nS1 -> a | c\nS2-> b | d"),
],
[
cfg.CFG.from_text("S -> S S | Se S1 Se\nSe -> $ | Se e\nS1 -> $ | a S1 b"),
cfg.CFG.from_text("S -> S1 | S S | e\nS1 -> $ | a S1 b"),
cfg.CFG.from_text("S -> S2 S | $\n S2 -> e | S1\n S1 -> $ | a S1 b"),
cfg.CFG.from_text("S -> $ | S1 S | e S\n S1 -> $ | a S1 b"),
],
[
cfg.CFG.from_text("S -> a S | $"),
cfg.CFG.from_text("S -> S1 | a\nS1 -> a S1 | $"),
],
GRAMMARS_TABLE: list[dict[str, list[str | cfg.CFG]]] = [
{
REGEXP: ["a"],
CFG: [
cfg.CFG.from_text("S -> a"),
cfg.CFG.from_text(
"""
S -> N B
B -> $
N -> a
"""
),
],
EBNF: ["S -> a"],
},
{
REGEXP: ["a*"],
CFG: [
cfg.CFG.from_text("S -> $ | a S"),
cfg.CFG.from_text("S -> $ | S S | a"),
cfg.CFG.from_text("S -> S a S | $"),
],
EBNF: ["S -> a*"],
},
{
REGEXP: ["a b c"],
CFG: [
cfg.CFG.from_text("S -> a b c"),
cfg.CFG.from_text(
"""
S -> a B
B -> b c
"""
),
],
EBNF: ["S -> a b c"],
},
{
REGEXP: ["a*b*"],
CFG: [
cfg.CFG.from_text(
"""
S -> S1 S2
S2 -> $ | b S2
S1 -> $ | a S1
"""
),
cfg.CFG.from_text(
"""
S -> $ | S1 | a S
S1 -> $ | b S1
"""
),
],
EBNF: ["S -> a*b*"],
},
{
REGEXP: ["(a b)*"],
CFG: [
cfg.CFG.from_text("S -> $ | a b S"),
cfg.CFG.from_text(
"""
S -> $ | S S1
S1 -> a b
"""
),
],
EBNF: ["S -> (a b)*"],
},
{
REGEXP: ["a b*c*"],
CFG: [
cfg.CFG.from_text(
"""
S -> S1 S2 S3
S1 -> a
S2 -> $ | S2 b
S3 -> $ | c S3
"""
),
cfg.CFG.from_text(
"""
S -> a S2 S3
S2 -> S2 b | $
S3 -> c | $ | S3 S3
"""
),
],
EBNF: ["S -> a b*c*"],
},
{
REGEXP: ["(a|b|c|d|e)*"],
CFG: [
cfg.CFG.from_text(
"""
S -> $ | S1 S
S1 -> a | b | c | d | e
"""
),
cfg.CFG.from_text("S -> $ | a | b | c | d | e | S S"),
cfg.CFG.from_text("S -> $ | a S | b S | c S | e S | d S"),
],
EBNF: ["S -> (a|b|c|d|e)*"],
},
{
REGEXP: ["((a | b) * c)*(d | e)"],
CFG: [
cfg.CFG.from_text(
"""
S -> S1 S2
S1 -> S1 S1 | $ | S3 c
S2 -> d | e
S3 -> b S3 | $ | a S3
"""
),
cfg.CFG.from_text(
"""
S -> S1 d | S1 e
S1 -> S1 S3 c | $
S3 -> b S3 | $ | a S3
"""
),
],
EBNF: ["S -> ((a | b) * c)*(d | e)"],
},
{
REGEXP: set(),
CFG: [
cfg.CFG.from_text("S -> $ | a S b | S S"),
cfg.CFG.from_text("S -> $ | a S b S"),
cfg.CFG.from_text("S -> $ | S a S b"),
cfg.CFG.from_text("S -> $ | a S b | S S S"),
],
EBNF: ["S -> $ | a S b | S S"],
},
{
REGEXP: set(),
CFG: [
cfg.CFG.from_text("S -> $ | a S b | c S d | S S"),
cfg.CFG.from_text("S -> $ | a S b S | c S d S"),
cfg.CFG.from_text("S -> $ | S a S b | S c S d"),
cfg.CFG.from_text("S -> $ | a S b | c S d S | S S S"),
],
EBNF: ["S -> $ | a S b | c S d | S S"],
},
{
REGEXP: set(),
CFG: [
cfg.CFG.from_text(
"""
S -> $ | S1 S S2 | S S
S1 -> a | c
S2 -> b | d
"""
),
cfg.CFG.from_text(
"""
S -> $ | S1 S S2 S
S1 -> a | c
S2 -> b | d
"""
),
cfg.CFG.from_text("S -> $ | S a S b | S a S d | S c S d | S c S b"),
cfg.CFG.from_text(
"""
S -> $ | S1 S S2 | S S S
S1 -> a | c
S2-> b | d
"""
),
],
EBNF: ["S -> $ | S a S b | S a S d | S c S d | S c S b"],
},
{
REGEXP: set(),
CFG: [
cfg.CFG.from_text(
"""
S -> S S | Se S1 Se
Se -> $ | Se e
S1 -> $ | a S1 b
"""
),
cfg.CFG.from_text(
"""
S -> S1 | S S | e
S1 -> $ | a S1 b
"""
),
cfg.CFG.from_text(
"""
S -> S2 S | $
S2 -> e | S1
S1 -> $ | a S1 b
"""
),
cfg.CFG.from_text(
"""
S -> $ | S1 S | e S
S1 -> $ | a S1 b
"""
),
],
EBNF: [
"""
S -> S1 | S S | e
S1 -> $ | a S1 b
"""
],
},
{
REGEXP: set(),
CFG: [
cfg.CFG.from_text("S -> a S | $"),
cfg.CFG.from_text(
"""
S -> S1 | a
S1 -> a S1 | $
"""
),
],
EBNF: ["S -> a S | $"],
},
{
REGEXP: set(),
CFG: [
cfg.CFG.from_text(
"""
S -> S1 | S2
S1 -> Sab | S1 c
Sab -> $ | a Sab b
S2 -> Sbc | a S2
Sbc -> $ | b Sbc c
"""
)
],
EBNF: [
"""
S -> ( Sab c* ) | ( a* Sbc ) | $
Sab -> a Sab b | $
Sbc -> b Sbc c | $
"""
],
},
{
REGEXP: set(),
CFG: [cfg.CFG.from_text("S -> a | b | S c S | S d S | e S f | g S")],
EBNF: ["S -> a | b | (S ( c | d ) S ) | ( e S f ) | ( g S )"],
},
{
REGEXP: set(),
CFG: [
cfg.CFG.from_text(
"S -> $ | a S b | b S a | e S f | S S | c S d | d S c | f S e"
),
],
EBNF: [
"S -> ( ( a S b ) | ( b S a ) | ( c S d ) | ( d S c ) | ( e S f ) | (f S e) )*"
],
},
]
GRAMMARS_DIFFERENT: list[cfg.CFG] = [
cfg.CFG.from_text(
"S -> S1 | S2\nS1 -> Sab | S1 c\nSab -> $ | a Sab b\nS2 -> Sbc | a S2\nSbc -> b Sbc c"
),
cfg.CFG.from_text("S -> a | b | S c S | S d S | e S f | g S"),
cfg.CFG.from_text("S -> $ | a S b | b S a | e S f | S S | c S d | f S c | f S e"),

REGEXP_CFG: list[tuple[str, list[cfg.CFG]]] = [
(regexp, ds[CFG]) for ds in GRAMMARS_TABLE for regexp in ds[REGEXP]
]
EBNF_GRAMMARS: list[str] = [
"""S -> ( Sab c* ) | ( a* Sbc )
Sab -> a ( Sab | $ ) b
Sbc -> b ( Sbc | $ ) c""",
"S -> a | b | (S ( c | d ) S ) | ( e S f ) | ( g S )",
"S -> ( ( a S b ) | ( b S a ) | ( c S d ) | ( d S c ) | ( e S f ) | (f S e) )*",
GRAMMARS: list[list[cfg.CFG]] = [ds[CFG] for ds in GRAMMARS_TABLE if len(ds[CFG]) > 1]
GRAMMARS_DIFFERENT: list[cfg.CFG] = [ds[CFG][0] for ds in GRAMMARS_TABLE]
CFG_EBNF: list[tuple[list[cfg.CFG], list[str]]] = [
(ds[CFG], ds[EBNF]) for ds in GRAMMARS_TABLE
]

0 comments on commit 9ad166f

Please sign in to comment.