Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
D
DHParser
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
badw-it
DHParser
Commits
4cbcfacf
Commit
4cbcfacf
authored
Nov 02, 2018
by
eckhart
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- added syntaxtree.Node.__deepcopy__ bugfixes!
parent
465f90f6
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
2 deletions
+53
-2
CHANGES.txt
CHANGES.txt
+2
-1
DHParser/syntaxtree.py
DHParser/syntaxtree.py
+26
-0
test/test_syntaxtree.py
test/test_syntaxtree.py
+25
-1
No files found.
CHANGES.txt
View file @
4cbcfacf
DHParser Version 0.8.4 (pending)
................................
- lookahead parsers can now be unit-tested
- lookahead parsers can now be unit-tested (experimental)
- customized, i.e. faster deepcopy of syntax trees
DHParser Version 0.8.3 (20.8.2018)
...
...
DHParser/syntaxtree.py
View file @
4cbcfacf
...
...
@@ -323,6 +323,10 @@ class Node(collections.abc.Sized):
"""
Equality of nodes: Two nodes are considered as equal, if their tag
name is the same and if their results are equal.
Note: It is not required that two nodes have the same errors attached.
In case you need to check for error equality as well, compare a
serialization that includes error messages, as_sxpr() will do!
"""
return
self
.
tag_name
==
other
.
tag_name
and
self
.
result
==
other
.
result
...
...
@@ -797,6 +801,28 @@ class RootNode(Node):
self
.
omit_tags
=
set
()
self
.
empty_tags
=
set
()
def
__deepcopy__
(
self
,
memodict
=
{}):
duplicate
=
self
.
__class__
(
None
)
if
self
.
children
:
duplicate
.
children
=
copy
.
deepcopy
(
self
.
children
)
duplicate
.
_result
=
duplicate
.
children
else
:
duplicate
.
children
=
NoChildren
duplicate
.
_result
=
self
.
_result
duplicate
.
errors
=
copy
.
deepcopy
(
self
.
errors
)
if
self
.
errors
else
[]
duplicate
.
_pos
=
self
.
_pos
duplicate
.
_len
=
self
.
_len
if
hasattr
(
self
,
'_xml_attr'
):
duplicate
.
_xml_attr
=
copy
.
deepcopy
(
self
.
_xml_attr
)
duplicate
.
all_errors
=
copy
.
deepcopy
(
self
.
all_errors
)
duplicate
.
error_flag
=
self
.
error_flag
duplicate
.
inline_tags
=
self
.
inline_tags
duplicate
.
omit_tags
=
self
.
omit_tags
duplicate
.
empty_tags
=
self
.
empty_tags
duplicate
.
parser
=
self
.
parser
return
duplicate
def
swallow
(
self
,
node
:
Node
)
->
'RootNode'
:
"""
Put `self` in the place of `node` by copying all its data.
...
...
test/test_syntaxtree.py
View file @
4cbcfacf
...
...
@@ -29,6 +29,7 @@ from DHParser.transform import traverse, reduce_single_child, \
replace_by_single_child
,
flatten
,
remove_expendables
from
DHParser.ebnf
import
get_ebnf_grammar
,
get_ebnf_transformer
,
get_ebnf_compiler
from
DHParser.dsl
import
grammar_provider
from
DHParser.error
import
Error
class
TestParseSxpression
:
...
...
@@ -79,6 +80,29 @@ class TestNode:
self
.
recurring_nodes_sexpr
=
'(a (b x) (c (d e) (b y)))'
self
.
recurr_tree
=
parse_sxpr
(
self
.
recurring_nodes_sexpr
)
def
test_deepcopy
(
self
):
tree
=
RootNode
(
parse_sxpr
(
'(a (b c) (d (e f) (h i)))'
))
tree_copy
=
copy
.
deepcopy
(
tree
)
assert
tree
==
tree_copy
assert
tree
.
as_sxpr
()
==
parse_sxpr
(
'(a (b c) (d (e f) (h i)))'
).
as_sxpr
()
assert
tree_copy
.
as_sxpr
()
==
parse_sxpr
(
'(a (b c) (d (e f) (h i)))'
).
as_sxpr
()
tree
.
add_error
(
tree
,
Error
(
'Test Error'
,
0
))
assert
not
tree_copy
.
all_errors
assert
tree
.
as_sxpr
()
!=
parse_sxpr
(
'(a (b c) (d (e f) (h i)))'
).
as_sxpr
()
assert
tree_copy
.
as_sxpr
()
==
parse_sxpr
(
'(a (b c) (d (e f) (h i)))'
).
as_sxpr
()
tree
[
'd'
].
result
=
"x"
assert
tree
!=
tree_copy
assert
tree_copy
==
parse_sxpr
(
'(a (b c) (d (e f) (h i)))'
)
print
(
tree
.
as_sxpr
())
print
(
parse_sxpr
(
'(a (b c) (d x))'
).
as_sxpr
())
assert
tree
==
parse_sxpr
(
'(a (b c) (d x))'
)
# this also checks for errors equality...
assert
parse_sxpr
(
'(a (b c) (d x))'
).
as_sxpr
()
!=
tree
.
as_sxpr
()
def
test_str
(
self
):
assert
str
(
self
.
unique_tree
)
==
"ceh"
assert
str
(
self
.
recurr_tree
)
==
"xey"
...
...
@@ -157,7 +181,7 @@ class TestNode:
def
test_xml_sanitizer
(
self
):
node
=
Node
(
MockParser
(
'tag'
),
'<&>'
)
print
(
node
.
as_xml
())
assert
node
.
as_xml
()
==
'<tag><&></tag>'
class
TestRootNode
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment