Skip to content

Commit 8b0c23c

Browse files
committed
Cleanup new parsing modules
1 parent e71b96f commit 8b0c23c

File tree

6 files changed

+150
-148
lines changed

6 files changed

+150
-148
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ src/robotframework.egg-info
2121
log.html
2222
output.xml
2323
report.html
24-
src/robot/parsing/newparser/parser.out
24+
src/robot/parsing/parser.out

src/robot/parsing/__init__.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,28 @@ def print_suite(suite):
4949
print_suite(suite)
5050
"""
5151

52+
from robot.errors import DataError
5253

54+
from .lexer import TestCaseFileLexer, ResourceFileLexer
55+
from .nodes import TestCaseSection
56+
from .parser import RobotFrameworkParser
57+
58+
59+
# TODO: remove/inline
5360
TEST_EXTENSIONS = {"robot", "txt", "tsv", "rest", "rst"}
5461

5562

63+
def get_test_case_file_ast(source):
64+
return RobotFrameworkParser(TestCaseFileLexer()).parse(source)
65+
66+
67+
def get_resource_file_ast(source):
68+
ast = RobotFrameworkParser(ResourceFileLexer()).parse(source)
69+
if any(isinstance(s, TestCaseSection) for s in ast.sections):
70+
raise DataError("Resource file '%s' cannot contain tests or tasks." % source)
71+
return ast
72+
73+
5674
def disable_curdir_processing(method):
5775
"""Decorator to disable processing `${CURDIR}` variable."""
5876
def decorated(*args, **kwargs):

src/robot/parsing/builder.py renamed to src/robot/parsing/lexerwrapper.py

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,11 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16-
import os
16+
import os.path
1717

18-
from robot.errors import DataError
1918
from robot.output import LOGGER
2019
from robot.utils import Utf8Reader
2120

22-
from .lexer import TestCaseFileLexer, ResourceFileLexer
23-
from .nodes import TestCaseSection
24-
from .parser import RobotFrameworkParser
25-
from .vendor import yacc
26-
27-
28-
def get_test_case_file_ast(source):
29-
lexer = TestCaseFileLexer()
30-
parser = yacc.yacc(module=RobotFrameworkParser())
31-
return parser.parse(lexer=LexerWrapper(lexer, source))
32-
33-
34-
def get_resource_file_ast(source):
35-
lexer = ResourceFileLexer()
36-
parser = yacc.yacc(module=RobotFrameworkParser())
37-
ast = parser.parse(lexer=LexerWrapper(lexer, source))
38-
if any(isinstance(s, TestCaseSection) for s in ast.sections):
39-
raise DataError("Resource file '%s' cannot contain tests or tasks." % source)
40-
return ast
41-
4221

4322
class LexerWrapper(object):
4423

@@ -49,8 +28,8 @@ def __init__(self, lexer, source):
4928
self.tokens = lexer.get_tokens()
5029

5130
def token(self):
31+
"""Adapter for yacc.yacc"""
5232
token = next(self.tokens, None)
53-
# print(repr(token))
5433
if token and token.type == token.ERROR:
5534
self._report_error(token)
5635
return self._next_token_after_eos()

src/robot/parsing/parser.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16+
from .vendor import yacc
17+
1618
from .lexer import Token
19+
from .lexerwrapper import LexerWrapper
1720
from .nodes import (
1821
DataFile, SettingSection, VariableSection, TestCaseSection,
1922
KeywordSection, Variable, DocumentationSetting, SuiteSetupSetting,
@@ -29,6 +32,13 @@
2932
class RobotFrameworkParser(object):
3033
tokens = Token.DATA_TOKENS
3134

35+
def __init__(self, lexer):
36+
self.lexer = lexer
37+
38+
def parse(self, source):
39+
parser = yacc.yacc(module=self)
40+
return parser.parse(lexer=LexerWrapper(self.lexer, source))
41+
3242
def p_datafile(self, p):
3343
'''datafile :
3444
| sections'''
@@ -43,8 +53,7 @@ def p_section(self, p):
4353
'''section : setting_section
4454
| variable_section
4555
| testcase_section
46-
| keyword_section
47-
'''
56+
| keyword_section'''
4857
p[0] = p[1]
4958

5059
def p_setting_section(self, p):
@@ -202,11 +211,11 @@ def p_keyword_section(self, p):
202211

203212
def p_keyword_header(self, p):
204213
'''keyword_header : KEYWORD_HEADER
205-
| keyword_header KEYWORD_HEADER'''
214+
| keyword_header KEYWORD_HEADER'''
206215

207216
def p_tests(self, p):
208217
'''tests : test
209-
| tests test'''
218+
| tests test'''
210219
append_to_list_value(p)
211220

212221
def p_keywords(self, p):
@@ -216,33 +225,31 @@ def p_keywords(self, p):
216225

217226
def p_test(self, p):
218227
'''test : NAME EOS
219-
| NAME EOS body_items'''
228+
| NAME EOS body_items'''
220229
if len(p) == 3:
221230
p[0] = TestCase(p[1], [])
222231
else:
223232
p[0] = TestCase(p[1], p[3])
224233

225234
def p_keyword(self, p):
226235
'''keyword : NAME EOS
227-
| NAME EOS body_items'''
236+
| NAME EOS body_items'''
228237
if len(p) == 3:
229238
p[0] = Keyword(p[1], [])
230239
else:
231240
p[0] = Keyword(p[1], p[3])
232241

233242
def p_body_items(self, p):
234243
'''body_items : body_item
235-
| body_items body_item
236-
'''
244+
| body_items body_item'''
237245
append_to_list_value(p)
238246

239247
def p_body_item(self, p):
240248
'''body_item : forloop
241249
| setting
242250
| step
243251
| templatearguments
244-
| invalid_forloop
245-
'''
252+
| invalid_forloop'''
246253
p[0] = p[1]
247254

248255
def p_step(self, p):
@@ -279,8 +286,7 @@ def p_for_body(self, p):
279286
'''for_body : step
280287
| for_body step
281288
| templatearguments
282-
| for_body templatearguments
283-
'''
289+
| for_body templatearguments'''
284290
append_to_list_value(p)
285291

286292
def p_templatearguments(self, p):
@@ -298,8 +304,7 @@ def p_assignments(self, p):
298304

299305
def p_arguments(self, p):
300306
'''arguments : args
301-
| empty_arg
302-
'''
307+
| empty_arg'''
303308
p[0] = p[1]
304309

305310
def p_args(self, p):

src/robot/parsing/parsetab.py

Lines changed: 106 additions & 106 deletions
Large diffs are not rendered by default.

src/robot/running/builder/builders.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
from robot.errors import DataError
1919
from robot.output import LOGGER
20-
from robot.parsing import builder
21-
from robot.parsing.nodes import TestCaseSection #TODO: get rid of this
20+
from robot.parsing import (get_test_case_file_ast, get_resource_file_ast,
21+
TestCaseSection)
2222
from robot.utils import abspath
2323

2424
from .testsettings import TestDefaults
@@ -54,7 +54,7 @@ def build(self, *paths):
5454
class ResourceFileBuilder(object):
5555

5656
def build(self, path):
57-
data = builder.get_resource_file_ast(path)
57+
data = get_resource_file_ast(path)
5858
return build_resource(data, path)
5959

6060

@@ -118,7 +118,7 @@ def build_suite(source, datapath=None, parent_defaults=None):
118118
suite = TestSuite(name=format_name(source), source=source)
119119
defaults = TestDefaults(parent_defaults)
120120
if datapath:
121-
ast = builder.get_test_case_file_ast(datapath)
121+
ast = get_test_case_file_ast(datapath)
122122
#print(ast.dump(ast))
123123
SettingsBuilder(suite, defaults).visit(ast)
124124
SuiteBuilder(suite, defaults).visit(ast)

0 commit comments

Comments
 (0)