Skip to content

Commit 3fbf4f6

Browse files
authored
Parse for expr and stmt variants + identifier, constant (#78)
1 parent fe25708 commit 3fbf4f6

File tree

4 files changed

+1358
-2
lines changed

4 files changed

+1358
-2
lines changed

ast/asdl_rs.py

+45
Original file line numberDiff line numberDiff line change
@@ -1951,6 +1951,40 @@ def write_pyo3_wrapper(mod, type_info, namespace, f):
19511951
f.write("Ok(())\n}")
19521952

19531953

1954+
def write_parse_def(mod, type_info, f):
1955+
for info in type_info.values():
1956+
if info.enum_name not in ["expr", "stmt"]:
1957+
continue
1958+
1959+
type_name = rust_type_name(info.enum_name)
1960+
cons_name = rust_type_name(info.name)
1961+
1962+
f.write(f"""
1963+
impl Parse for ast::{info.rust_sum_name} {{
1964+
fn lex_starts_at(
1965+
source: &str,
1966+
offset: TextSize,
1967+
) -> SoftKeywordTransformer<Lexer<std::str::Chars>> {{
1968+
ast::{type_name}::lex_starts_at(source, offset)
1969+
}}
1970+
fn parse_tokens(
1971+
lxr: impl IntoIterator<Item = LexResult>,
1972+
source_path: &str,
1973+
) -> Result<Self, ParseError> {{
1974+
let node = ast::{type_name}::parse_tokens(lxr, source_path)?;
1975+
match node {{
1976+
ast::{type_name}::{cons_name}(node) => Ok(node),
1977+
node => Err(ParseError {{
1978+
error: ParseErrorType::InvalidToken,
1979+
offset: node.range().start(),
1980+
source_path: source_path.to_owned(),
1981+
}}),
1982+
}}
1983+
}}
1984+
}}
1985+
""")
1986+
1987+
19541988
def write_ast_mod(mod, type_info, f):
19551989
f.write(
19561990
"""
@@ -1972,6 +2006,7 @@ def write_ast_mod(mod, type_info, f):
19722006
def main(
19732007
input_filename,
19742008
ast_dir,
2009+
parser_dir,
19752010
ast_pyo3_dir,
19762011
module_filename,
19772012
dump_module=False,
@@ -2000,6 +2035,14 @@ def main(
20002035
f.write(auto_gen_msg)
20012036
write(f)
20022037

2038+
for filename, write in [
2039+
("parse", p(write_parse_def, mod, type_info)),
2040+
]:
2041+
with (parser_dir / f"{filename}.rs").open("w") as f:
2042+
f.write(auto_gen_msg)
2043+
write(f)
2044+
2045+
20032046
for filename, write in [
20042047
("to_py_ast", p(write_to_pyo3, mod, type_info)),
20052048
("wrapper_located", p(write_pyo3_wrapper, mod, type_info, "located")),
@@ -2020,6 +2063,7 @@ def main(
20202063
parser = ArgumentParser()
20212064
parser.add_argument("input_file", type=Path)
20222065
parser.add_argument("-A", "--ast-dir", type=Path, required=True)
2066+
parser.add_argument("-P", "--parser-dir", type=Path, required=True)
20232067
parser.add_argument("-O", "--ast-pyo3-dir", type=Path, required=True)
20242068
parser.add_argument("-M", "--module-file", type=Path, required=True)
20252069
parser.add_argument("-d", "--dump-module", action="store_true")
@@ -2028,6 +2072,7 @@ def main(
20282072
main(
20292073
args.input_file,
20302074
args.ast_dir,
2075+
args.parser_dir,
20312076
args.ast_pyo3_dir,
20322077
args.module_file,
20332078
args.dump_module,

0 commit comments

Comments
 (0)