Skip to content

Commit ab67bb8

Browse files
author
whitequark
committedMay 8, 2015
Factor out pyparser.parse.
1 parent 3f61113 commit ab67bb8

File tree

4 files changed

+67
-33
lines changed

4 files changed

+67
-33
lines changed
 

‎doc/index.rst

+14-8
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,35 @@ It parses source code into an AST that is a superset of Python's
66
built-in :mod:`ast` module, but returns precise location information
77
for every token.
88

9-
:mod:`source` Module
10-
--------------------
9+
:mod:`pyparser` Module
10+
----------------------
11+
12+
.. automodule:: pyparser
13+
:members:
14+
15+
:mod:`pyparser.source` Module
16+
-----------------------------
1117

1218
.. automodule:: pyparser.source
1319
:members:
1420
:show-inheritance:
1521

16-
:mod:`diagnostic` Module
17-
------------------------
22+
:mod:`pyparser.diagnostic` Module
23+
---------------------------------
1824

1925
.. automodule:: pyparser.diagnostic
2026
:members:
2127
:show-inheritance:
2228

23-
:mod:`lexer` Module
24-
-------------------
29+
:mod:`pyparser.lexer` Module
30+
----------------------------
2531

2632
.. automodule:: pyparser.lexer
2733
:members:
2834
:show-inheritance:
2935

30-
:mod:`ast` Module
31-
-----------------
36+
:mod:`pyparser.ast` Module
37+
--------------------------
3238

3339
.. automodule:: pyparser.ast
3440
:members: commonloc, beginendloc, keywordloc,

‎pyparser/__init__.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from __future__ import absolute_import, division, print_function, unicode_literals
2+
import sys, pyparser.source, pyparser.lexer, pyparser.parser
3+
4+
def parse(source, filename='<unknown>', mode='exec',
5+
flags=[], version=sys.version_info[0:2]):
6+
"""
7+
Parse a string into an abstract syntax tree.
8+
This is the replacement for the built-in :meth:`..ast.parse`.
9+
10+
:param str source: Source code in the correct encoding
11+
:param filename: Filename of the source (used in diagnostics)
12+
:param mode: Execution mode. Pass ``"exec"`` to parse a module,
13+
``"single"`` to parse a single (interactive) statement,
14+
and ``"eval"`` to parse an expression. In the last two cases,
15+
``source`` must be terminated with an empty line
16+
(i.e. end with ``"\\n\\n"``).
17+
:param flags: Future flags. Equivalent to ``from __future__ import <flags>``.
18+
:param int,int version: A tuple of the major and minor version
19+
of Python syntax to recognize.
20+
:return ast.AST: abstract syntax tree
21+
:raise diagnostic.DiagnosticException:
22+
if the source code is not well-formed
23+
"""
24+
buffer = pyparser.source.Buffer(source, filename)
25+
lexer = pyparser.lexer.Lexer(buffer, version)
26+
parser = pyparser.parser.Parser(lexer)
27+
28+
parser.add_flags(flags)
29+
30+
if mode == 'exec':
31+
return parser.file_input()
32+
elif mode == 'single':
33+
return parser.single_input()
34+
elif mode == 'eval':
35+
return parser.eval_input()

‎pyparser/__main__.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from __future__ import absolute_import, division, print_function, unicode_literals
2+
from . import parse, diagnostic
3+
import sys, time, codecs
4+
5+
for filename in sys.argv[1:]:
6+
with codecs.open(filename, encoding='utf-8') as f:
7+
input = f.read()
8+
try:
9+
start = time.time()
10+
root = parse(input, filename)
11+
interval = time.time() - start
12+
13+
print(root)
14+
print("elapsed: %.2f (%.2f kb/s)" % (interval, len(input)/interval/1000),
15+
file=sys.stderr)
16+
except diagnostic.DiagnosticException as e:
17+
print("\n".join(e.diagnostic.render()),
18+
file=sys.stderr)

‎pyparser/parser.py

-25
Original file line numberDiff line numberDiff line change
@@ -1409,28 +1409,3 @@ def yield_expr(self, stmt_loc, exprs):
14091409
"""yield_expr: 'yield' [testlist]"""
14101410
return ast.Yield(value=exprs,
14111411
yield_loc=stmt_loc, loc=stmt_loc.join(exprs.loc))
1412-
1413-
import sys
1414-
1415-
def for_code(code, version=sys.version_info[0:2]):
1416-
return Parser(lexer.Lexer(source.Buffer(code), version))
1417-
1418-
def main():
1419-
import time, codecs
1420-
for filename in sys.argv[1:]:
1421-
with codecs.open(filename, encoding='utf-8') as f:
1422-
input = f.read()
1423-
try:
1424-
start = time.time()
1425-
root = for_code(input).file_input()
1426-
interval = time.time() - start
1427-
1428-
print(root)
1429-
print("elapsed: %.2f (%.2f kb/s)" % (interval, len(input)/interval/1000),
1430-
file=sys.stderr)
1431-
except diagnostic.DiagnosticException as e:
1432-
print(e.render,
1433-
file=sys.stderr)
1434-
1435-
if __name__ == "__main__":
1436-
main()

0 commit comments

Comments
 (0)
Please sign in to comment.