Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
badw-it
DHParser
Commits
c2f0a268
Commit
c2f0a268
authored
Feb 02, 2019
by
eckhart
Browse files
- slight refactoring
parent
524501e5
Changes
1
Hide whitespace changes
Inline
Side-by-side
DHParser/parse.py
View file @
c2f0a268
...
@@ -380,29 +380,6 @@ class Parser:
...
@@ -380,29 +380,6 @@ class Parser:
"""
"""
return
Alternative
(
self
,
other
)
return
Alternative
(
self
,
other
)
def
_return_node
(
self
,
node
:
Node
)
->
Node
:
# Node(self.tag_name, node) # unoptimized code
if
node
and
node
.
_result
:
return
Node
(
self
.
tag_name
,
node
)
if
self
.
pname
else
node
if
self
.
pname
:
return
Node
(
self
.
tag_name
,
())
else
:
# avoid creation of a node object for empty nodes
return
EMPTY_NODE
@
cython
.
locals
(
N
=
cython
.
int
)
def
_return_node_from_results
(
self
,
results
:
Tuple
[
Node
,
...])
->
Node
:
# return Node(self.tag_name, results) # unoptimized code
N
=
len
(
results
)
if
N
>
1
:
return
Node
(
self
.
tag_name
,
results
)
elif
N
==
1
:
return
self
.
_return_node
(
results
[
0
])
elif
self
.
pname
:
return
Node
(
self
.
tag_name
,
())
else
:
# avoid creation of a node object for empty nodes
return
EMPTY_NODE
def
_parse
(
self
,
text
:
StringView
)
->
Tuple
[
Optional
[
Node
],
StringView
]:
def
_parse
(
self
,
text
:
StringView
)
->
Tuple
[
Optional
[
Node
],
StringView
]:
"""Applies the parser to the given `text` and returns a node with
"""Applies the parser to the given `text` and returns a node with
...
@@ -1255,13 +1232,42 @@ class DropWhitespace(Whitespace):
...
@@ -1255,13 +1232,42 @@ class DropWhitespace(Whitespace):
########################################################################
########################################################################
#
#
#
Containing
parser classes, i.e. parsers that contain other parsers
#
Meta
parser classes, i.e. parsers that contain other parsers
# to which they delegate parsing
# to which they delegate parsing
#
#
########################################################################
########################################################################
class
UnaryParser
(
Parser
):
class
MetaParser
(
Parser
):
def
_return_value
(
self
,
node
:
Optional
[
Node
])
->
Node
:
# Node(self.tag_name, node) # unoptimized code
assert
node
is
None
or
isinstance
(
node
,
Node
)
if
node
and
node
.
_result
:
return
Node
(
self
.
tag_name
,
node
)
if
self
.
pname
else
node
if
self
.
pname
:
return
Node
(
self
.
tag_name
,
())
else
:
# avoid creation of a node object for empty nodes
return
EMPTY_NODE
@
cython
.
locals
(
N
=
cython
.
int
)
def
_return_values
(
self
,
results
:
Tuple
[
Node
,
...])
->
Node
:
# return Node(self.tag_name, results) # unoptimized code
assert
isinstance
(
results
,
Tuple
)
N
=
len
(
results
)
if
N
>
1
:
return
Node
(
self
.
tag_name
,
results
)
elif
N
==
1
:
return
self
.
_return_value
(
results
[
0
])
elif
self
.
pname
:
return
Node
(
self
.
tag_name
,
())
else
:
# avoid creation of a node object for empty nodes
return
EMPTY_NODE
class
UnaryParser
(
MetaParser
):
"""
"""
Base class of all unary parsers, i.e. parser that contains
Base class of all unary parsers, i.e. parser that contains
one and only one other parser, like the optional parser for example.
one and only one other parser, like the optional parser for example.
...
@@ -1291,7 +1297,7 @@ class UnaryParser(Parser):
...
@@ -1291,7 +1297,7 @@ class UnaryParser(Parser):
return
False
return
False
class
NaryParser
(
Parser
):
class
NaryParser
(
Meta
Parser
):
"""
"""
Base class of all Nnary parsers, i.e. parser that
Base class of all Nnary parsers, i.e. parser that
contains one or more other parsers, like the alternative
contains one or more other parsers, like the alternative
...
@@ -1359,7 +1365,7 @@ class Option(UnaryParser):
...
@@ -1359,7 +1365,7 @@ class Option(UnaryParser):
def
_parse
(
self
,
text
:
StringView
)
->
Tuple
[
Optional
[
Node
],
StringView
]:
def
_parse
(
self
,
text
:
StringView
)
->
Tuple
[
Optional
[
Node
],
StringView
]:
node
,
text
=
self
.
parser
(
text
)
node
,
text
=
self
.
parser
(
text
)
return
self
.
_return_
nod
e
(
node
),
text
return
self
.
_return_
valu
e
(
node
),
text
def
__repr__
(
self
):
def
__repr__
(
self
):
return
'['
+
(
self
.
parser
.
repr
[
1
:
-
1
]
if
isinstance
(
self
.
parser
,
Alternative
)
return
'['
+
(
self
.
parser
.
repr
[
1
:
-
1
]
if
isinstance
(
self
.
parser
,
Alternative
)
...
@@ -1400,7 +1406,7 @@ class ZeroOrMore(Option):
...
@@ -1400,7 +1406,7 @@ class ZeroOrMore(Option):
infinite_loop_error
=
Error
(
dsl_error_msg
(
self
,
'Infinite Loop encountered.'
),
infinite_loop_error
=
Error
(
dsl_error_msg
(
self
,
'Infinite Loop encountered.'
),
node
.
pos
)
node
.
pos
)
results
+=
(
node
,)
results
+=
(
node
,)
node
=
self
.
_return_
node_from_result
s
(
results
)
# type: Node
node
=
self
.
_return_
value
s
(
results
)
# type: Node
if
infinite_loop_error
:
if
infinite_loop_error
:
self
.
grammar
.
tree__
.
add_error
(
node
,
infinite_loop_error
)
self
.
grammar
.
tree__
.
add_error
(
node
,
infinite_loop_error
)
return
node
,
text
return
node
,
text
...
@@ -1452,7 +1458,7 @@ class OneOrMore(UnaryParser):
...
@@ -1452,7 +1458,7 @@ class OneOrMore(UnaryParser):
results
+=
(
node
,)
results
+=
(
node
,)
if
results
==
():
if
results
==
():
return
None
,
text
return
None
,
text
node
=
self
.
_return_
node_from_result
s
(
results
)
# type: Node
node
=
self
.
_return_
value
s
(
results
)
# type: Node
if
infinite_loop_error
:
if
infinite_loop_error
:
self
.
grammar
.
tree__
.
add_error
(
node
,
infinite_loop_error
)
self
.
grammar
.
tree__
.
add_error
(
node
,
infinite_loop_error
)
return
node
,
text_
return
node
,
text_
...
@@ -1583,7 +1589,7 @@ class Series(NaryParser):
...
@@ -1583,7 +1589,7 @@ class Series(NaryParser):
results
+=
(
node
,)
results
+=
(
node
,)
# assert len(results) <= len(self.parsers) \
# assert len(results) <= len(self.parsers) \
# or len(self.parsers) >= len([p for p in results if p.tag_name != ZOMBIE_TAG])
# or len(self.parsers) >= len([p for p in results if p.tag_name != ZOMBIE_TAG])
node
=
self
.
_return_
node_from_result
s
(
results
)
# type: Node
node
=
self
.
_return_
value
s
(
results
)
# type: Node
if
error
:
if
error
:
raise
ParserError
(
node
,
text
,
first_throw
=
True
)
raise
ParserError
(
node
,
text
,
first_throw
=
True
)
return
node
,
text_
return
node
,
text_
...
@@ -1795,7 +1801,7 @@ class AllOf(NaryParser):
...
@@ -1795,7 +1801,7 @@ class AllOf(NaryParser):
parsers
=
[]
parsers
=
[]
assert
len
(
results
)
<=
len
(
self
.
parsers
)
\
assert
len
(
results
)
<=
len
(
self
.
parsers
)
\
or
len
(
self
.
parsers
)
>=
len
([
p
for
p
in
results
if
p
.
tag_name
!=
ZOMBIE_TAG
])
or
len
(
self
.
parsers
)
>=
len
([
p
for
p
in
results
if
p
.
tag_name
!=
ZOMBIE_TAG
])
node
=
self
.
_return_
node_from_result
s
(
results
)
# type: Node
node
=
self
.
_return_
value
s
(
results
)
# type: Node
if
error
:
if
error
:
raise
ParserError
(
node
,
text
,
first_throw
=
True
)
raise
ParserError
(
node
,
text
,
first_throw
=
True
)
return
node
,
text_
return
node
,
text_
...
@@ -1851,7 +1857,7 @@ class SomeOf(NaryParser):
...
@@ -1851,7 +1857,7 @@ class SomeOf(NaryParser):
parsers
=
[]
parsers
=
[]
assert
len
(
results
)
<=
len
(
self
.
parsers
)
assert
len
(
results
)
<=
len
(
self
.
parsers
)
if
results
:
if
results
:
return
self
.
_return_
node_from_result
s
(
results
),
text_
return
self
.
_return_
value
s
(
results
),
text_
else
:
else
:
return
None
,
text
return
None
,
text
...
@@ -2009,7 +2015,7 @@ class Capture(UnaryParser):
...
@@ -2009,7 +2015,7 @@ class Capture(UnaryParser):
self
.
grammar
.
push_rollback__
(
location
,
self
.
_rollback
)
# lambda: stack.pop())
self
.
grammar
.
push_rollback__
(
location
,
self
.
_rollback
)
# lambda: stack.pop())
# caching will be blocked by parser guard (see way above),
# caching will be blocked by parser guard (see way above),
# because it would prevent recapturing of rolled back captures
# because it would prevent recapturing of rolled back captures
return
self
.
_return_
nod
e
(
node
),
text_
return
self
.
_return_
valu
e
(
node
),
text_
else
:
else
:
return
None
,
text
return
None
,
text
...
...
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