108 lines · javascript
1'use strict';2 3module.exports = {4 scf_dialect : $ => prec.right(choice(5 // operation ::= `scf.condition` `(` $condition `)` attr-dict6 // ($args^ `:` type($args))?7 seq('scf.condition',8 field('condition', $._value_use_list_parens),9 field('attributes', optional($.attribute)),10 field('arguments', optional($._value_use_type_list))),11 12 seq('scf.execute_region',13 field('return', optional($._function_return)),14 field('body', $.region),15 field('attributes', optional($.attribute))),16 17 seq('scf.if', field('condition', $.value_use),18 field('return', optional($._function_return)),19 field('trueblk', $.region),20 field('falseblk',21 optional(seq(token('else'), $.region)))),22 23 // operation ::= `scf.index_switch` $arg attr-dict (`->`24 // type($results)^)?25 // custom<SwitchCases>($cases, $caseRegions)26 // `\n`27 // `` `default` $defaultRegion28 seq('scf.index_switch', field('flag', $._value_use_and_type),29 field('attributes', optional($.attribute)),30 field('result', optional($._function_return)),31 $.scf_case_label, $.region,32 repeat(seq($.scf_case_label, $.region))),33 34 // scf.for %iv = %lb to %ub step %step {35 // ... // body36 // }37 seq('scf.for', field('iv', $.value_use), '=',38 field('lb', $.value_use), token('to'),39 field('ub', $.value_use),40 field('step', seq(token('step'), $.value_use)),41 field('iter_args',42 optional(seq(token('iter_args'),43 $._value_assignment_list))),44 field('return', optional($._function_return)),45 field('body', $.region),46 field('attributes', optional($.attribute))),47 48 seq('scf.forall', field('iv', $._value_use_list_parens),49 field('bounds',50 seq(choice(seq('=', $._value_use_list_parens,51 token('to')),52 token('in')),53 $._value_use_list_parens)),54 field('step', optional(seq(token('step'),55 $._value_use_list_parens))),56 field('shared_outs',57 optional(seq(token('shared_outs'),58 $._value_assignment_list))),59 field('return', optional($._function_return)),60 field('body', $.region),61 field('attributes', optional($.attribute))),62 63 seq('scf.forall.in_parallel', field('body', $.region),64 field('attributes', optional($.attribute))),65 66 seq('scf.parallel', field('iv', $._value_use_list_parens),67 '=', field('lb', $._value_use_list_parens), token('to'),68 field('ub', $._value_use_list_parens),69 field('step',70 seq(token('step'), $._value_use_list_parens)),71 field('init', optional(seq(token('init'),72 $._value_use_list_parens))),73 field('return', optional($._function_return)),74 field('body', $.region),75 field('attributes', optional($.attribute))),76 77 seq('scf.reduce', field('operand', $._value_use_list_parens),78 field('return', $._type_annotation),79 field('body', $.region)),80 81 // operation ::= `scf.reduce.return` $result attr-dict `:`82 // type($result)83 seq('scf.reduce.return', field('result', $.value_use),84 field('attributes', optional($.attribute)),85 field('return', $._type_annotation)),86 87 // op ::= `scf.while` assignments `:` function-type region88 // `do` region89 // `attributes` attribute-dict90 // initializer ::= /* empty */ | `(` assignment-list `)`91 seq('scf.while',92 field('assignments', optional($._value_assignment_list)),93 field('return', $._function_type_annotation),94 field('condblk', $.region), 'do',95 field('doblk', $.region),96 field('attributes',97 optional(seq('attributes', $.attribute)))),98 99 // operation ::= `scf.yield` attr-dict ($results^ `:`100 // type($results))?101 seq('scf.yield', field('attributes', optional($.attribute)),102 field('results', optional($._value_use_type_list))),103 )),104 105 scf_case_label : $ => choice(seq(token('case'), $.integer_literal),106 token('default'))107}108