Added concept 'isa' other_concept functionality

This commit is contained in:
2019-12-21 22:02:07 +01:00
parent 2474b08150
commit a683d4cd42
13 changed files with 489 additions and 61 deletions
+53 -24
View File
@@ -6,7 +6,7 @@ from core.sheerka import Sheerka, ExecutionContext
from parsers.ConceptLexerParser import OrderedChoice, StrMatch, ConceptMatch
from parsers.PythonParser import PythonParser, PythonNode
from core.tokenizer import Keywords, Tokenizer
from parsers.DefaultParser import DefaultParser, NameNode, SyntaxErrorNode, CannotHandleErrorNode
from parsers.DefaultParser import DefaultParser, NameNode, SyntaxErrorNode, CannotHandleErrorNode, IsaConceptNode
from parsers.DefaultParser import UnexpectedTokenErrorNode, DefConceptNode
from parsers.BnfParser import BnfParser
@@ -55,24 +55,24 @@ from parsers.BnfParser import BnfParser
# return left_as_string == right_as_string
#
def get_concept(name, where=None, pre=None, post=None, body=None, definition=None):
concept = DefConceptNode([], name=NameNode(list(Tokenizer(name))))
def get_def_concept(name, where=None, pre=None, post=None, body=None, definition=None):
def_concept = DefConceptNode([], name=NameNode(list(Tokenizer(name))))
if body:
concept.body = get_concept_part(body)
def_concept.body = get_concept_part(body)
if where:
concept.where = get_concept_part(where)
def_concept.where = get_concept_part(where)
if pre:
concept.pre = get_concept_part(pre)
def_concept.pre = get_concept_part(pre)
if post:
concept.post = get_concept_part(post)
def_concept.post = get_concept_part(post)
if definition:
concept.definition = ReturnValueConcept(
def_concept.definition = ReturnValueConcept(
"parsers.Bnf",
True,
definition)
return concept
return def_concept
def get_context():
@@ -145,16 +145,16 @@ def get_concept_part(part):
@pytest.mark.parametrize("text, expected", [
("def concept hello", get_concept(name="hello")),
("def concept hello ", get_concept(name="hello")),
("def concept a + b", get_concept(name="a + b")),
("def concept a+b", get_concept(name="a + b")),
("def concept 'a+b'+c", get_concept(name="'a+b' + c")),
("def concept 'as if'", get_concept(name="'as if'")),
("def concept 'as' if", get_concept(name="'as if'")),
("def concept hello as 'hello'", get_concept(name="hello", body="'hello'")),
("def concept hello as 1", get_concept(name="hello", body="1")),
("def concept hello as 1 + 1", get_concept(name="hello", body="1 + 1")),
("def concept hello", get_def_concept(name="hello")),
("def concept hello ", get_def_concept(name="hello")),
("def concept a + b", get_def_concept(name="a + b")),
("def concept a+b", get_def_concept(name="a + b")),
("def concept 'a+b'+c", get_def_concept(name="'a+b' + c")),
("def concept 'as if'", get_def_concept(name="'as if'")),
("def concept 'as' if", get_def_concept(name="'as if'")),
("def concept hello as 'hello'", get_def_concept(name="hello", body="'hello'")),
("def concept hello as 1", get_def_concept(name="hello", body="1")),
("def concept hello as 1 + 1", get_def_concept(name="hello", body="1 + 1")),
])
def test_i_can_parse_def_concept(text, expected):
parser = DefaultParser()
@@ -178,7 +178,7 @@ as res = a + b
parser = DefaultParser()
res = parser.parse(get_context(), text)
return_value = res.value
expected_concept = get_concept(
expected_concept = get_def_concept(
name="a plus b",
where="a,b",
pre="isinstance(a, int) and isinstance(b, float)",
@@ -199,7 +199,7 @@ def func(x):
func(a)
"""
expected_concept = get_concept(
expected_concept = get_def_concept(
name="add one to a ",
body=PythonNode(
"def func(x):\n return x+1\nfunc(a)",
@@ -223,7 +223,7 @@ def concept add one to a as:
func(a)
"""
expected_concept = get_concept(
expected_concept = get_def_concept(
name="add one to a ",
body=PythonNode(
"def func(x):\n return x+1\nfunc(a)",
@@ -292,7 +292,7 @@ def test_name_is_mandatory():
def test_concept_keyword_is_mandatory_but_the_concept_is_recognized():
text = "def hello as a where b pre c post d"
expected_concept = get_concept(name="hello", body="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(get_context(), text)
return_value = res.value
@@ -342,7 +342,7 @@ def test_i_can_parse_def_concept_from_regex():
node = res.value.value
definition = OrderedChoice(ConceptMatch("a_concept"), StrMatch("a_string"))
parser_result = ParserResultConcept(BnfParser(), "a_concept | 'a_string'", definition, definition)
expected = get_concept(name="name", body="__definition[0]", definition=parser_result)
expected = get_def_concept(name="name", body="__definition[0]", definition=parser_result)
assert res.status
assert res.who == parser.name
@@ -370,3 +370,32 @@ def test_i_can_detect_not_for_me():
assert not res.status
assert context.sheerka.isinstance(res.value, BuiltinConcepts.NOT_FOR_ME)
assert isinstance(res.value.body[0], CannotHandleErrorNode)
def test_i_can_parse_is_a():
parser = DefaultParser()
text = "the name of my 'concept' isa the name of the set"
res = parser.parse(get_context(), text)
expected = IsaConceptNode([],
concept=NameNode(list(Tokenizer("the name of my 'concept'"))),
set=NameNode(list(Tokenizer("the name of the set"))))
assert res.status
assert res.who == parser.name
assert res.value.source == text
assert isinstance(res.value, ParserResultConcept)
assert res.value.value == expected
@pytest.mark.parametrize("text", [
"concept",
"isa number",
"name isa",
])
def test_i_cannot_parse_invalid_entries(text):
parser = DefaultParser()
res = parser.parse(get_context(), text)
assert not res.status
assert isinstance(res.body, ParserResultConcept)
assert isinstance(res.body.body[0], UnexpectedTokenErrorNode)