@@ -416,17 +416,17 @@ WithItem: ast::WithItem = {
416416};
417417
418418FuncDef: ast::LocatedStatement = {
419- <d:Decorator*> <loc:@L> "def" <i:Identifier> <a:Parameters> ":" <s:Suite> => {
420- ast::LocatedStatement {
421- location: loc,
422- node: ast::Statement::FunctionDef {
423- name: i,
424- args: a,
425- body: s,
426- decorator_list: d,
427- }
428- }
429- },
419+ <d:Decorator*> <loc:@L> "def" <i:Identifier> <a:Parameters> ":" <s:Suite> => {
420+ ast::LocatedStatement {
421+ location: loc,
422+ node: ast::Statement::FunctionDef {
423+ name: i,
424+ args: a,
425+ body: s,
426+ decorator_list: d,
427+ }
428+ }
429+ },
430430};
431431
432432Parameters: ast::Parameters = {
@@ -648,28 +648,38 @@ Expression: ast::Expression = {
648648};
649649
650650XorExpression: ast::Expression = {
651- <e1:XorExpression> "^" <e2:AndExpression> => ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::BitXor, b: Box::new(e2) },
652- <e:AndExpression> => e ,
651+ <e1:XorExpression> "^" <e2:AndExpression> => ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::BitXor, b: Box::new(e2) },
652+ AndExpression ,
653653};
654654
655655AndExpression: ast::Expression = {
656- <e1:AndExpression> "&" <e2:ArithmaticExpression> => ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::BitAnd, b: Box::new(e2) },
657- <e:ArithmaticExpression> => e,
656+ <e1:AndExpression> "&" <e2:ShiftExpression> => ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::BitAnd, b: Box::new(e2) },
657+ ShiftExpression,
658+ };
659+
660+ ShiftExpression: ast::Expression = {
661+ <e1:ShiftExpression> <op:ShiftOp> <e2:ArithmaticExpression> => ast::Expression::Binop { a: Box::new(e1), op: op, b: Box::new(e2) },
662+ ArithmaticExpression,
663+ };
664+
665+ ShiftOp: ast::Operator = {
666+ "<<" => ast::Operator::LShift,
667+ ">>" => ast::Operator::RShift,
658668};
659669
660670ArithmaticExpression: ast::Expression = {
661- <a:ArithmaticExpression> <op:AddOp> <b:Term> => ast::Expression::Binop { a: Box::new(a), op: op, b: Box::new(b) },
662- Term,
671+ <a:ArithmaticExpression> <op:AddOp> <b:Term> => ast::Expression::Binop { a: Box::new(a), op: op, b: Box::new(b) },
672+ Term,
663673};
664674
665675AddOp: ast::Operator = {
666- "+" => ast::Operator::Add,
667- "-" => ast::Operator::Sub,
676+ "+" => ast::Operator::Add,
677+ "-" => ast::Operator::Sub,
668678};
669679
670680Term: ast::Expression = {
671- <a:Term> <op:MulOp> <b:Factor> => ast::Expression::Binop { a: Box::new(a), op: op, b: Box::new(b) },
672- Factor,
681+ <a:Term> <op:MulOp> <b:Factor> => ast::Expression::Binop { a: Box::new(a), op: op, b: Box::new(b) },
682+ Factor,
673683};
674684
675685MulOp: ast::Operator = {
@@ -687,12 +697,12 @@ Factor: ast::Expression = {
687697};
688698
689699Power: ast::Expression = {
690- <e:AtomExpr> <e2:("**" Factor)?> => {
691- match e2 {
692- None => e,
693- Some(x) => ast::Expression::Binop { a: Box::new(e), op: ast::Operator::Pow, b: Box::new(x.1) },
694- }
695- }
700+ <e:AtomExpr> <e2:("**" Factor)?> => {
701+ match e2 {
702+ None => e,
703+ Some(x) => ast::Expression::Binop { a: Box::new(e), op: ast::Operator::Pow, b: Box::new(x.1) },
704+ }
705+ }
696706};
697707
698708AtomExpr: ast::Expression = {
@@ -703,57 +713,57 @@ AtomExpr: ast::Expression = {
703713};
704714
705715Subscript: ast::Expression = {
706- <e:Test> => e,
707- <e1:Test?> ":" <e2:Test?> <e3:SliceOp?> => {
708- let s1 = e1.unwrap_or(ast::Expression::None);
709- let s2 = e2.unwrap_or(ast::Expression::None);
710- let s3 = e3.unwrap_or(ast::Expression::None);
711- ast::Expression::Slice { elements: vec![s1, s2, s3] }
712- }
716+ <e:Test> => e,
717+ <e1:Test?> ":" <e2:Test?> <e3:SliceOp?> => {
718+ let s1 = e1.unwrap_or(ast::Expression::None);
719+ let s2 = e2.unwrap_or(ast::Expression::None);
720+ let s3 = e3.unwrap_or(ast::Expression::None);
721+ ast::Expression::Slice { elements: vec![s1, s2, s3] }
722+ }
713723};
714724
715725SliceOp: ast::Expression = {
716726 ":" <e:Test?> => e.unwrap_or(ast::Expression::None)
717727}
718728
719729Atom: ast::Expression = {
720- <s:String> => ast::Expression::String { value: s },
721- <n:Number> => ast::Expression::Number { value: n },
722- <i:Identifier> => ast::Expression::Identifier { name: i },
723- "[" <e:TestListComp?> "]" => {
730+ <s:String> => ast::Expression::String { value: s },
731+ <n:Number> => ast::Expression::Number { value: n },
732+ <i:Identifier> => ast::Expression::Identifier { name: i },
733+ "[" <e:TestListComp?> "]" => {
724734 let elements = e.unwrap_or(Vec::new());
725735 ast::Expression::List { elements }
726- },
727- "[" <e:TestListComp2> "]" => {
736+ },
737+ "[" <e:TestListComp2> "]" => {
728738 // List comprehension:
729739 e
730- },
731- "(" <e:TestList?> <trailing_comma:","?> ")" => {
732- match e {
733- None => ast::Expression::Tuple { elements: Vec::new() },
734- Some(elements) => {
735- if elements.len() == 1 && trailing_comma.is_none() {
736- // This is "(e)", which is equivalent to "e"
737- elements.into_iter().next().unwrap()
738- } else {
739- ast::Expression::Tuple { elements }
740+ },
741+ "(" <e:TestList?> <trailing_comma:","?> ")" => {
742+ match e {
743+ None => ast::Expression::Tuple { elements: Vec::new() },
744+ Some(elements) => {
745+ if elements.len() == 1 && trailing_comma.is_none() {
746+ // This is "(e)", which is equivalent to "e"
747+ elements.into_iter().next().unwrap()
748+ } else {
749+ ast::Expression::Tuple { elements }
750+ }
740751 }
741752 }
742- }
743- },
744- "(" <e:Test> <c:CompFor> ")" => {
753+ },
754+ "(" <e:Test> <c:CompFor> ")" => {
745755 ast::Expression::Comprehension {
746756 kind: Box::new(ast::ComprehensionKind::GeneratorExpression { element: e }),
747757 generators: c,
748758 }
749- },
750- "{" <e:TestDict?> "}" => ast::Expression::Dict { elements: e.unwrap_or(Vec::new()) },
751- "{" <e:TestDictComp> "}" => e,
752- "{" <e:TestSet> "}" => ast::Expression::Set { elements: e },
753- "{" <e:TestSetComp> "}" => e,
754- "True" => ast::Expression::True,
755- "False" => ast::Expression::False,
756- "None" => ast::Expression::None,
759+ },
760+ "{" <e:TestDict?> "}" => ast::Expression::Dict { elements: e.unwrap_or(Vec::new()) },
761+ "{" <e:TestDictComp> "}" => e,
762+ "{" <e:TestSet> "}" => ast::Expression::Set { elements: e },
763+ "{" <e:TestSetComp> "}" => e,
764+ "True" => ast::Expression::True,
765+ "False" => ast::Expression::False,
766+ "None" => ast::Expression::None,
757767};
758768
759769TestListComp: Vec<ast::Expression> = {
@@ -971,6 +981,8 @@ extern {
971981 "//" => lexer::Tok::DoubleSlash,
972982 "^" => lexer::Tok::CircumFlex,
973983 "|" => lexer::Tok::Vbar,
984+ "<<" => lexer::Tok::LeftShift,
985+ ">>" => lexer::Tok::RightShift,
974986 "/" => lexer::Tok::Slash,
975987 "(" => lexer::Tok::Lpar,
976988 ")" => lexer::Tok::Rpar,
0 commit comments