Skip to content

Commit 9af733d

Browse files
committed
Integrate parser generation into mx build
1 parent a96ded0 commit 9af733d

File tree

28 files changed

+59
-41
lines changed

28 files changed

+59
-41
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ language
5353
/request_cache/
5454
/org.eclipse.jdt.core.prefs
5555
Python3.g4.stamp
56+
python.gram.stamp
5657
*.orig
5758
/*.diff
5859
/testenv
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
QUIETLY$(MX_VERBOSE) = @
2+
3+
PARSER_PATH ?= ../com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser
4+
PYTHON ?= python3
5+
6+
TARGET=${PARSER_PATH}/Parser.java
7+
8+
GRAMMAR=${PARSER_PATH}/python.gram
9+
TOKENS=${PARSER_PATH}/Tokens
10+
11+
PEGEN_FILES=$(shell find pegen pegjava -name '*.py')
12+
13+
STAMP=${GRAMMAR}.stamp
14+
15+
.PHONY: default clean
16+
default: ${STAMP}
17+
18+
${STAMP}: ${GRAMMAR} ${TOKENS} ${PEGEN_FILES} main_parser_gen.py
19+
$(QUIETLY) ${PYTHON} main_parser_gen.py ${GRAMMAR} ${TOKENS} ${TARGET}
20+
$(QUIETLY) touch $@
21+
22+
clean:
23+
$(QUIETLY) rm -f ${TARGET}
24+
$(QUIETLY) rm -f ${STAMP}

graalpython/com.oracle.graal.python.pegparser/src/python/mainParserGen.py renamed to graalpython/com.oracle.graal.python.pegparser.generator/main_parser_gen.py

Lines changed: 18 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -36,63 +36,42 @@
3636
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
39-
39+
import argparse
4040
import os
4141
import sys
4242
import tokenize
4343

44-
from os import path
45-
4644
from pegen.build import generate_token_definitions
47-
from pegen.grammar import Grammar
4845
from pegen.grammar_parser import GeneratedParser as GrammarParser
4946
from pegen.tokenizer import Tokenizer
5047
from pegjava.java_generator import JavaParserGenerator
5148

52-
verbose_tokenizer = False
53-
verbose_parser = False
5449

5550
def main():
56-
__dir__ = path.dirname(__file__)
57-
grammar_file = path.relpath(path.join(__dir__, "pegjava", "python.gram"), os.getcwd())
58-
print("Reading", grammar_file)
59-
with open(grammar_file) as file:
60-
tokenizer = Tokenizer(tokenize.generate_tokens(file.readline), verbose=verbose_tokenizer)
61-
parser = GrammarParser(tokenizer, verbose=verbose_parser)
51+
parser = argparse.ArgumentParser()
52+
parser.add_argument("grammar_file")
53+
parser.add_argument("tokens_file")
54+
parser.add_argument("output_file")
55+
parser.add_argument("--verbose", action="store_true")
56+
parser.add_argument("--debug", action="store_true")
57+
58+
args = parser.parse_args()
59+
60+
with open(args.grammar_file) as file:
61+
tokenizer = Tokenizer(tokenize.generate_tokens(file.readline), verbose=args.verbose)
62+
parser = GrammarParser(tokenizer, verbose=args.verbose)
6263
grammar = parser.start()
6364

6465
if not grammar:
65-
sys.exit("Fail")
66+
sys.exit("Failed to generate grammar")
6667

67-
tokens_file = path.join(__dir__, "pegjava", "Tokens")
68-
with open(tokens_file, "r") as tok_file:
68+
with open(args.tokens_file, "r") as tok_file:
6969
all_tokens, exact_tokens, non_exact_tokens = generate_token_definitions(tok_file)
70-
# print("all_tokens")
71-
# print(all_tokens)
7270

73-
# print("exact_tokens")
74-
# print(exact_tok)
71+
with open(args.output_file, "w") as file:
72+
gen = JavaParserGenerator(grammar, all_tokens, exact_tokens, non_exact_tokens, file, debug=args.debug)
73+
gen.generate(os.path.relpath(args.grammar_file, os.path.dirname(args.output_file)))
7574

76-
# print("non_exact_tokens")
77-
# print(non_exact_tok)
78-
output_file = path.join(__dir__, "..", "java", "com", "oracle", "graal", "python", "pegparser", "Parser.java")
79-
with open(output_file, "w") as file:
80-
gen: ParserGenerator = JavaParserGenerator(grammar, all_tokens, exact_tokens, non_exact_tokens, file, debug=False)
81-
gen.generate(grammar_file)
82-
# print("[")
83-
# for rule in rules:
84-
# print(f" {rule},")
85-
# print("]")
86-
# for rule in rules:
87-
# print(rule.name, end=": ", file=sys.stderr)
88-
# print(*(" ".join(alt) for alt in rule.alts), sep=" | ", file=sys.stderr)
89-
#
90-
#
91-
#
92-
# outfile = "../src/genPythonParser/GenParser.java"
93-
# print("Updating", outfile, file=sys.stderr)
94-
# with open(outfile, "w") as stream:
95-
# generate(rules, stream)
9675

9776
if __name__ == '__main__':
9877
main()

0 commit comments

Comments
 (0)