Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
9.2.2023: Due to updates GitLab will be unavailable for some minutes between 9:00 and 11:00.
Open sidebar
badw-it
DHParser
Commits
cf262cfd
Commit
cf262cfd
authored
May 05, 2017
by
di68kap
Browse files
transfer from gitlab PyDDSL to gitlab DHParser
parent
ff32c89f
Changes
3
Hide whitespace changes
Inline
Side-by-side
DHParser/ebnf.py
View file @
cf262cfd
...
...
@@ -30,7 +30,7 @@ from .parsers import GrammarBase, mixin_comment, nil_scanner, Forward, RE, Negat
Capture
,
Retrieve
from
.syntaxtree
import
Node
,
traverse
,
remove_enclosing_delimiters
,
reduce_single_child
,
\
replace_by_single_child
,
TOKEN_KEYWORD
,
remove_expendables
,
remove_tokens
,
flatten
,
\
forbid
,
assert_content
,
WHITESPACE_KEYWORD
forbid
,
assert_content
,
WHITESPACE_KEYWORD
,
key_parser_name
,
key_tag_name
from
.versionnumber
import
__version__
...
...
@@ -45,8 +45,6 @@ __all__ = ['get_ebnf_scanner',
'grammar_changed'
]
########################################################################
#
# EBNF scanning
...
...
@@ -221,14 +219,14 @@ EBNF_transformation_table = {
EBNF_validation_table
=
{
# Semantic validation on the AST
"repetition, option, oneormore"
:
[
partial
(
forbid
,
child_
name
s
=
[
'repetition'
,
'option'
,
'oneormore'
]),
[
partial
(
forbid
,
child_
tag
s
=
[
'repetition'
,
'option'
,
'oneormore'
]),
partial
(
assert_content
,
regex
=
r
'(?!§)'
)],
}
def
EBNFTransformer
(
syntax_tree
):
for
processing_table
,
key_func
in
[(
EBNF_transformation_table
,
lambda
node
:
node
.
parser
.
name
),
(
EBNF_validation_table
,
lambda
node
:
node
.
tag_name
)]:
for
processing_table
,
key_func
in
[(
EBNF_transformation_table
,
key_
parser
_
name
),
(
EBNF_validation_table
,
key_
tag_name
)]:
traverse
(
syntax_tree
,
processing_table
,
key_func
)
...
...
DHParser/syntaxtree.py
View file @
cf262cfd
...
...
@@ -36,6 +36,8 @@ __all__ = ['WHITESPACE_KEYWORD',
'Error'
,
'Node'
,
'mock_syntax_tree'
,
'key_parser_name'
,
'key_tag_name'
,
'traverse'
,
'no_operation'
,
'replace_by_single_child'
,
...
...
@@ -481,7 +483,15 @@ WHITESPACE_KEYWORD = 'WSP__'
TOKEN_KEYWORD
=
'TOKEN__'
def
traverse
(
root_node
,
processing_table
,
key_func
=
lambda
node
:
node
.
parser
.
name
):
def
key_parser_name
(
node
):
return
node
.
parser
.
name
def
key_tag_name
(
node
):
return
node
.
tag_name
def
traverse
(
root_node
,
processing_table
,
key_func
=
key_parser_name
):
"""Traverses the snytax tree starting with the given ``node`` depth
first and applies the sequences of callback functions registered
in the ``calltable``-dictionary.
...
...
@@ -660,16 +670,16 @@ def remove_enclosing_delimiters(node):
########################################################################
def
require
(
node
,
child_
names
):
def
require
(
node
,
child_
tag
):
for
child
in
node
.
children
:
if
child
.
parser
.
name
not
in
child_
names
:
if
child
.
tag_
name
not
in
child_
tag
:
node
.
add_error
(
'Element "%s" is not allowed inside "%s".'
%
(
child
.
parser
.
name
,
node
.
parser
.
name
))
def
forbid
(
node
,
child_
name
s
):
def
forbid
(
node
,
child_
tag
s
):
for
child
in
node
.
children
:
if
child
.
parser
.
name
in
child_
name
s
:
if
child
.
tag_
name
in
child_
tag
s
:
node
.
add_error
(
'Element "%s" cannot be nested inside "%s".'
%
(
child
.
parser
.
name
,
node
.
parser
.
name
))
...
...
test/test_ebnf.py
View file @
cf262cfd
...
...
@@ -298,7 +298,7 @@ class TestSelfHosting:
def
test_multiprocessing
(
self
):
with
Pool
(
processes
=
2
)
as
pool
:
res
=
[
pool
.
apply_async
(
self
.
multiprocessing_task
,
())
for
i
in
range
(
4
)]
errors
=
[
r
.
get
(
timeout
=
5
)
for
r
in
res
]
errors
=
[
r
.
get
(
timeout
=
10
)
for
r
in
res
]
for
i
,
e
in
enumerate
(
errors
):
assert
not
e
,
(
"%i: "
%
i
)
+
str
(
e
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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