Skip to content
Draft
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
pass build
  • Loading branch information
qingshi163 committed Jan 31, 2023
commit 14b023cf9ccbedb6457a50070bd86c54a312c3ab
37 changes: 26 additions & 11 deletions compiler/parser/src/peg_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@ impl Parser {
let mut locations = vec![];
for tok in lexer {
let (begin, tok, end) = tok?;
if tok == Tok::Comment {
continue;
}
tokens.push(tok);
locations.push((begin, end));
}

Ok(Self { tokens, locations })
}

pub fn parse(&self, mode: Mode) -> Result<ast::Mod, peg::error::ParseError<usize>> {
pub fn parse(&self, mode: Mode) -> Result<ast::Mod, peg::error::ParseError<String>> {
match mode {
Mode::Module => python_parser::file(self, self),
Mode::Interactive => python_parser::interactive(self, self),
Expand All @@ -43,7 +46,7 @@ impl Parser {
}

impl peg::Parse for Parser {
type PositionRepr = usize;
type PositionRepr = String;

fn start<'input>(&'input self) -> usize {
0
Expand All @@ -54,7 +57,7 @@ impl peg::Parse for Parser {
}

fn position_repr<'input>(&'input self, p: usize) -> Self::PositionRepr {
p
format!("p: {}, curr: {}", p, self.tokens[p])
}
}

Expand Down Expand Up @@ -263,9 +266,9 @@ peg::parser! { grammar python_parser(zelf: &Parser) for Parser {
}>)

rule function_def() -> Stmt =
loc(<dec:decorator()* [Def] name:name() p:par(<params()>)
loc(<dec:decorator()* [Def] name:name() p:par(<params()?>)
r:([Rarrow] z:expression() {z})? [Colon] tc:func_type_comment() b:block() {
StmtKind::FunctionDef { name, args: Box::new(p), body: b, decorator_list: dec, returns: option_box(r), type_comment: tc }
StmtKind::FunctionDef { name, args: Box::new(p.unwrap_or_else(make_empty_arguments)), body: b, decorator_list: dec, returns: option_box(r), type_comment: tc }
}>)

rule params() -> Arguments = parameters()
Expand Down Expand Up @@ -387,8 +390,8 @@ peg::parser! { grammar python_parser(zelf: &Parser) for Parser {
loc(<[Try] [Colon] b:block() f:finally_block() {
StmtKind::Try { body: b, handlers: vec![], orelse: vec![], finalbody: f }
}>) /
loc(<[Try] [Colon] b:block() ex:except_block()+ el:else_block_opt() f:finally_block() {
StmtKind::Try { body: b, handlers: ex, orelse: el, finalbody: f }
loc(<[Try] [Colon] b:block() ex:except_block()+ el:else_block_opt() f:finally_block()? {
StmtKind::Try { body: b, handlers: ex, orelse: el, finalbody: f.unwrap_or_default() }
}>)
// TODO: except star
// loc(<[Try] [Colon] b:block() ex:except_star_block()+ el:else_block_opt() f:finally_block() {
Expand Down Expand Up @@ -654,10 +657,10 @@ peg::parser! { grammar python_parser(zelf: &Parser) for Parser {
rule group() -> Expr = par(<yield_expr() / named_expression()>)

rule lambdef() -> Expr =
loc(<[Lambda] a:lambda_params() [Colon] b:expression() {
ExprKind::Lambda { args: Box::new(a), body: Box::new(b) }
loc(<[Lambda] a:lambda_params()? [Colon] b:expression() {
ExprKind::Lambda { args: Box::new(a.unwrap_or_else(make_empty_arguments)), body: Box::new(b) }
}>)

rule lambda_params() -> Arguments = lambda_parameters()

rule lambda_parameters() -> Arguments =
Expand All @@ -676,7 +679,7 @@ peg::parser! { grammar python_parser(zelf: &Parser) for Parser {
e:lambda_star_etc() {
make_arguments(vec![], Default::default(), vec![], vec![], Some(e))
}

rule lambda_slash_no_default() -> Vec<Arg> =
a:lambda_param_no_default()+ [Slash] lambda_param_split() {a}

Expand Down Expand Up @@ -1041,3 +1044,15 @@ fn make_arguments(
defaults: posdefaults,
}
}

fn make_empty_arguments() -> ast::Arguments {
ast::Arguments {
posonlyargs: Default::default(),
args: Default::default(),
vararg: Default::default(),
kwonlyargs: Default::default(),
kw_defaults: Default::default(),
kwarg: Default::default(),
defaults: Default::default(),
}
}