Refactored Caching, Refactored BnfNodeParser, Introduced Sphinx

This commit is contained in:
2020-05-12 17:21:10 +02:00
parent 7d3a490bc5
commit 6e343ba996
110 changed files with 13865 additions and 7540 deletions
+43 -54
View File
@@ -1,14 +1,14 @@
import pytest
import ast
import pytest
from core.builtin_concepts import ParserResultConcept, BuiltinConcepts, ReturnValueConcept
from core.concept import Concept, DEFINITION_TYPE_BNF, DEFINITION_TYPE_DEF
from parsers.BnfNodeParser import OrderedChoice, StrMatch, ConceptExpression
from parsers.PythonParser import PythonParser, PythonNode
from core.concept import DEFINITION_TYPE_BNF, DEFINITION_TYPE_DEF
from core.tokenizer import Keywords, Tokenizer, LexerError
from parsers.BnfNodeParser import OrderedChoice, ConceptExpression, StrMatch
from parsers.BnfParser import BnfParser
from parsers.DefaultParser import DefaultParser, NameNode, SyntaxErrorNode, CannotHandleErrorNode, IsaConceptNode
from parsers.DefaultParser import UnexpectedTokenErrorNode, DefConceptNode
from parsers.BnfParser import BnfParser
from parsers.PythonParser import PythonParser, PythonNode
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
@@ -63,6 +63,11 @@ def get_concept_part(part):
class TestDefaultParser(TestUsingMemoryBasedSheerka):
def init_parser(self, *concepts):
sheerka, concept, *updated = self.init_concepts(*concepts, singleton=True)
parser = DefaultParser()
return sheerka, concept, parser, *updated
@pytest.mark.parametrize("text, expected", [
("def concept hello", get_def_concept(name="hello")),
("def concept hello ", get_def_concept(name="hello")),
@@ -76,8 +81,8 @@ class TestDefaultParser(TestUsingMemoryBasedSheerka):
("def concept hello as 1 + 1", get_def_concept(name="hello", body="1 + 1")),
])
def test_i_can_parse_def_concept(self, text, expected):
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
node = res.value.value
assert res.status
@@ -93,8 +98,8 @@ pre isinstance(a, int) and isinstance(b, float)
post isinstance(res, int)
as res = a + b
"""
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
expected_concept = get_def_concept(
name="a plus b",
@@ -123,8 +128,8 @@ func(a)
ast.parse("def func(x):\n return x+1\nfunc(a)", mode="exec"))
)
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
assert res.status
@@ -146,8 +151,8 @@ def concept add one to a as:
ast.parse("def func(x):\n return x+1\nfunc(a)", mode="exec"))
)
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
assert res.status
@@ -162,8 +167,8 @@ def func(x):
func(a)
"""
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
assert not res.status
@@ -178,9 +183,7 @@ def concept add one to a as
return x+1
func(a)
"""
context = self.get_context()
parser = DefaultParser()
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
@@ -190,8 +193,8 @@ def concept add one to a as
def test_name_is_mandatory(self):
text = "def concept as 'hello'"
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
assert not res.status
@@ -203,8 +206,8 @@ def concept add one to a as
text = "def hello as a where b pre c post d"
expected_concept = get_def_concept(name="hello", body="a", where="b", pre="c", post="d")
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
assert not res.status
@@ -221,10 +224,7 @@ def concept add one to a as
"def concept hello as 1+"
])
def test_i_can_detect_error_in_declaration(self, text):
context = self.get_context()
sheerka = context.sheerka
parser = DefaultParser()
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
@@ -234,21 +234,18 @@ def concept add one to a as
def test_new_line_is_not_allowed_in_the_name(self):
text = "def concept hello \n my friend as 'hello'"
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
return_value = res.value
assert not res.status
assert return_value.value == [SyntaxErrorNode([], "Newline are not allowed in name.")]
def test_i_can_parse_def_concept_from_bnf(self):
context = self.get_context()
a_concept = Concept("a_concept")
context.sheerka.add_in_cache(a_concept)
text = "def concept name from bnf a_concept | 'a_string' as __definition[0]"
parser = DefaultParser()
sheerka, context, parser, a_concept = self.init_parser("a_concept")
res = parser.parse(context, text)
node = res.value.value
definition = OrderedChoice(ConceptExpression(a_concept, rule_name="a_concept"), StrMatch("a_string"))
parser_result = ParserResultConcept(BnfParser(), "a_concept | 'a_string'", None, definition, definition)
@@ -261,12 +258,8 @@ def concept add one to a as
assert node == expected
def test_i_can_parse_def_concept_where_bnf_references_itself(self):
context = self.get_context()
a_concept = Concept("a_concept")
context.sheerka.add_in_cache(a_concept)
text = "def concept name from bnf 'a' + name?"
parser = DefaultParser()
sheerka, context, parser, a_concept = self.init_parser("a_concept")
parser.parse(context, text)
assert not parser.has_error
@@ -277,9 +270,8 @@ def concept add one to a as
"def concept name from as here is my body"
])
def test_i_can_detect_empty_bnf_declaration(self, text):
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
assert not res.status
assert res.value.value[0] == SyntaxErrorNode([], "Empty declaration")
@@ -288,8 +280,8 @@ def concept add one to a as
"def concept addition from a plus b as a + b",
"def concept addition from def a plus b as a + b"])
def test_i_can_def_concept_from_definition(self, text):
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
expected = get_def_concept("addition", definition="a plus b", body="a + b")
node = res.value.value
@@ -301,8 +293,7 @@ def concept add one to a as
def test_i_can_detect_not_for_me(self):
text = "hello world"
context = self.get_context()
parser = DefaultParser()
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
assert not res.status
@@ -310,9 +301,9 @@ def concept add one to a as
assert isinstance(res.value.body[0], CannotHandleErrorNode)
def test_i_can_parse_is_a(self):
parser = DefaultParser()
text = "the name of my 'concept' isa the name of the set"
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
expected = IsaConceptNode([],
concept=NameNode(list(Tokenizer("the name of my 'concept'"))),
set=NameNode(list(Tokenizer("the name of the set"))))
@@ -331,8 +322,8 @@ def concept add one to a as
"def concept_name"
])
def test_i_cannot_parse_invalid_entries(self, text):
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
assert not res.status
assert isinstance(res.body, ParserResultConcept)
@@ -347,8 +338,8 @@ def concept add one to a as
("def concept c::", "Concept identifiers not found", ""),
])
def test_i_cannot_parse_when_tokenizer_fails(self, text, error_msg, error_text):
parser = DefaultParser()
res = parser.parse(self.get_context(), text)
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
assert not res.status
assert isinstance(res.body, ParserResultConcept)
@@ -357,10 +348,8 @@ def concept add one to a as
assert res.body.body[0].text == error_text
def test_i_cannot_parse_bnf_definition_referencing_unknown_concept(self):
context = self.get_context()
text = "def concept name from bnf unknown"
parser = DefaultParser()
sheerka, context, parser = self.init_parser()
res = parser.parse(context, text)
assert not res.status