@@ -61,12 +61,33 @@ ExpressionStatement: ast::Statement = {
6161 }
6262 }
6363 },
64+ <e1:Test> <op:AugAssign> <e2:TestList> => {
65+ // TODO: this works in most cases:
66+ let rhs = e2.into_iter().next().unwrap();
67+ ast::Statement::AugAssign { target: e1, op: op, value: rhs }
68+ },
6469};
6570
6671AssignSuffix: Vec<ast::Expression> = {
6772 "=" <e:TestList> => e,
6873};
6974
75+ AugAssign: ast::Operator = {
76+ "+=" => ast::Operator::Add,
77+ "-=" => ast::Operator::Sub,
78+ "*=" => ast::Operator::Mult,
79+ "@=" => ast::Operator::MatMult,
80+ "/=" => ast::Operator::Div,
81+ "%=" => ast::Operator::Mod,
82+ "&=" => ast::Operator::BitAnd,
83+ "|=" => ast::Operator::BitOr,
84+ "^=" => ast::Operator::BitXor,
85+ "<<=" => ast::Operator::LShift,
86+ ">>=" => ast::Operator::RShift,
87+ "**=" => ast::Operator::Pow,
88+ "//=" => ast::Operator::FloorDiv,
89+ };
90+
7091FlowStatement: ast::Statement = {
7192 "break" => ast::Statement::Break,
7293 "continue" => ast::Statement::Continue,
@@ -132,10 +153,12 @@ Test: ast::Expression = {
132153
133154OrTest: ast::Expression = {
134155 <e:AndTest> => e,
156+ <e1:OrTest> "or" <e2:AndTest> => ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::Or, b: Box::new(e2) },
135157};
136158
137159AndTest: ast::Expression = {
138160 <e:NotTest> => e,
161+ <e1:AndTest> "and" <e2:NotTest> => ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::And, b: Box::new(e2) },
139162};
140163
141164NotTest: ast::Expression = {
@@ -299,12 +322,24 @@ extern {
299322 "=" => lexer::Tok::Equal,
300323 "+=" => lexer::Tok::PlusEqual,
301324 "-=" => lexer::Tok::MinusEqual,
325+ "*=" => lexer::Tok::StarEqual,
326+ "@=" => lexer::Tok::AtEqual,
327+ "/=" => lexer::Tok::SlashEqual,
328+ "%=" => lexer::Tok::PercentEqual,
329+ "&=" => lexer::Tok::AmperEqual,
330+ "|=" => lexer::Tok::VbarEqual,
331+ "^=" => lexer::Tok::CircumflexEqual,
332+ "<<=" => lexer::Tok::LeftShiftEqual,
333+ ">>=" => lexer::Tok::RightShiftEqual,
334+ "**=" => lexer::Tok::DoubleStarEqual,
335+ "//=" => lexer::Tok::DoubleSlashEqual,
302336 "==" => lexer::Tok::EqEqual,
303337 "!=" => lexer::Tok::NotEqual,
304338 "<" => lexer::Tok::Less,
305339 "<=" => lexer::Tok::LessEqual,
306340 ">" => lexer::Tok::Greater,
307341 ">=" => lexer::Tok::GreaterEqual,
342+ "and" => lexer::Tok::And,
308343 "as" => lexer::Tok::As,
309344 "assert" => lexer::Tok::Assert,
310345 "break" => lexer::Tok::Break,
@@ -317,6 +352,7 @@ extern {
317352 "is" => lexer::Tok::Is,
318353 "import" => lexer::Tok::Import,
319354 "not" => lexer::Tok::Not,
355+ "or" => lexer::Tok::Or,
320356 "pass" => lexer::Tok::Pass,
321357 "return" => lexer::Tok::Return,
322358 "while" => lexer::Tok::While,
0 commit comments