@@ -7,10 +7,21 @@ PROGRAM
77 }
88
99EXPRESSION
10- = e :EXPR _ SEMICOLON _ COMMENT * _ {return e}
10+ = COMMENT _ {return null }
11+ / e :EXPR _ SEMICOLON _ COMMENT * _ {return e}
12+ / e :GATE _ COMMENT * _ {return e}
1113
1214EXPR
13- = INCLUDE / REG / CNOT_GATE / UNITARY_GATE
15+ = INCLUDE
16+ / MEASURE
17+ / RESET
18+ / BARRIER
19+ / REG
20+ / CNOT_GATE
21+ / UNITARY_GATE
22+ / OPAQUE_GATE
23+ / GATE
24+ / APPLY_GATE
1425
1526VERSION = "OPENQASM" _ major :INT "." minor :INT SEMICOLON
1627 { return major + " ." + minor}
@@ -30,56 +41,125 @@ REG = type:("creg"/"qreg") _ name:LOWERCAMELCASE _ "[" _ n:INT _ "]"
3041
3142CNOT_GATE = "CX" _ a :ARGUMENT _ "," _ b :ARGUMENT
3243 { return {
33- type: " cnot" ,
44+ type: " application" ,
45+ name: ' cnot' ,
3446 argument: [a,b]
3547 }}
3648
37- UNITARY_GATE = "U" _ "(" _ theta :MATH_EXPR _ "," _ phi :MATH_EXPR _ "," _ lambda :MATH_EXPR _ ")" _ ARGUMENT
38- { return {
49+ MEASURE = "measure" _ a :ARGUMENT _ "->" _ b :CARGUMENT
50+ {return {
51+ type: " measure" ,
52+ arguments: [a, b]
53+ }}
54+
55+ RESET = "reset" _ a :ARGUMENT
56+ {return {
57+ type: " reset" ,
58+ arguments: a
59+ }}
60+
61+ BARRIER = "barrier" _ a :ARGUMENT_LIST
62+ {return {
63+ type: " reset" ,
64+ arguments: a
65+ }}
66+
67+ OPAQUE_GATE = "opaque" _ name :LOWERCAMELCASE _ params :("(" _ ps :ARGUMENT_LIST _ ")" {return ps})? _ args :ARGUMENT_LIST
68+ {return {
3969 type: " gate" ,
40- data : [theta, phi, lambda],
41- argument: 3
70+ name: name,
71+ argument: args,
72+ params: params,
73+ body: []
74+ }}
75+
76+ GATE = "gate" _ name :LOWERCAMELCASE _ params :("(" _ ps :ARGUMENT_LIST _ ")" {return ps})? _ args :ARGUMENT_LIST _ "{" _ expr :EXPRESSION * _ "}"
77+ {return {
78+ type: " gate" ,
79+ name: name,
80+ argument: args,
81+ params: params || [],
82+ body: expr .filter (function (x ) {
83+ return x !== null
84+ })
85+ }}
86+
87+ APPLY_GATE = name :LOWERCAMELCASE _ params :("(" _ ps :MATH_EXPR_LIST _ ")" {return ps})? _ args :ARGUMENT_LIST
88+ {return {
89+ type: ' application' ,
90+ name: name,
91+ params: params || [],
92+ argument: args
93+ }}
94+
95+ UNITARY_GATE = "U" _ "(" _ params :MATH_EXPR_LIST _ ")" _ a :ARGUMENT
96+ { return {
97+ type: " unitary-gate" ,
98+ params: params,
99+ argument: a
42100 }}
43101
44102QUBIT = reg :LOWERCAMELCASE _ "[" _ index :INT _ "]"
45103 { return {
46104 type: " qubit" ,
47- data: reg,
105+ name: reg,
106+ argument: index
107+ }}
108+
109+ BIT = reg :LOWERCAMELCASE _ "[" _ index :INT _ "]"
110+ { return {
111+ type: " bit" ,
112+ name: reg,
48113 argument: index
49114 }}
50115
51116ARGUMENT = (QUBIT / LOWERCAMELCASE )
117+
118+ ARGUMENT_LIST
119+ = h :ARGUMENT _ "," _ t :ARGUMENT_LIST {return [h].concat (t)}
120+ / ARGUMENT
121+
122+ CARGUMENT = (BIT / LOWERCAMELCASE )
52123
53124// MATH EXPRESSION ==========================
125+ MATH_EXPR_LIST
126+ = h :MATH_EXPR _ "," _ t : MATH_EXPR_LIST {return [h].concat (t)}
127+ / MATH_EXPR
128+
54129MATH_EXPR
55130 = additive
56131
57132additive
58- = _ left :subtractive _ "+" _ right :additive { return left + right; }
133+ = _ left :subtractive _ "+" _ right :additive { return left + " + " + right; }
59134 / subtractive
60135
61136subtractive
62- = left :multiplicative _ "-" _ right :additive { return left - right }
137+ = left :multiplicative _ "-" _ right :additive { return left + " - " + right }
63138 / multiplicative
64139
65140multiplicative
66- = left :exponential _ "*" _ right :additive { return left * right; }
141+ = left :divisable _ "*" _ right :additive { return left + " *" + right }
142+ / divisable
143+
144+ divisable
145+ = left : exponential _ "/" _ right :additive { return left + " /" + right }
67146 / exponential
68147
69148exponential
70- = left : negative _ "^" _ right :additive { return Math . pow (left, right) }
149+ = left : negative _ "^" _ right :additive { return " pow(" + left + " , " + right + " ) " }
71150 / negative
72151
73152negative
74- = "-" _ right :func { return - right }
153+ = "-" _ right :func { return " - " + right }
75154 / func
76155
77156func
78- = op :unaryop _ "(" _ exp :additive _ ")" { return op ( exp) }
157+ = op :UNARYOP _ "(" _ exp :additive _ ")" _ { return op + " ( " + exp + " ) " }
79158 / primary
80159
81160primary
82- = number
161+ = NUMBER
162+ / LOWERCAMELCASE
83163 / "(" additive :additive ")" { return additive; }
84164
85165// UTILITIES ================================
@@ -95,19 +175,18 @@ LOWERCAMELCASE = f:[a-z] r:[a-zA-Z0-9]* {return f + r.join("")}
95175
96176UPPERCAMELCASE = f :[A-Z] r :[a-zA-Z0-9]* {return f + r .join (" " )}
97177
98-
99- number "real"
178+ NUMBER "real"
100179 = ("pi" / "PI" / "Pi" ) { return Math .PI }
101180 / INT
102181 / digits :[0-9]+ { return parseInt (digits .join (" " ), 10 ); }
103182
104- unaryop
105- = "sin" { return Math . sin }
106- / "cos" { return Math . cos }
107- / "tan" { return Math . tan }
108- / "exp" { return Math . exp }
109- / ("ln" / "log" ) { return Math . log }
110- / "sqrt" { return Math . sqrt }
183+ UNARYOP
184+ = "sin"
185+ / "cos"
186+ / "tan"
187+ / "exp"
188+ / ("ln" / "log" ) {return " log" }
189+ / "sqrt"
111190
112191// optional whitespace
113192_ = [ \t\r\n ]*
0 commit comments