Skip to content
This repository was archived by the owner on Apr 1, 2018. It is now read-only.

Commit a18e71d

Browse files
committed
Changes To Grammar
1 parent e71374c commit a18e71d

File tree

2 files changed

+105
-24
lines changed

2 files changed

+105
-24
lines changed

QASM/src/grammar.pegjs

Lines changed: 103 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,21 @@ PROGRAM
77
}
88

99
EXPRESSION
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

1214
EXPR
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

1526
VERSION = "OPENQASM" _ major:INT "." minor:INT SEMICOLON
1627
{ return major + "." + minor}
@@ -30,56 +41,125 @@ REG = type:("creg"/"qreg") _ name:LOWERCAMELCASE _ "[" _ n:INT _ "]"
3041

3142
CNOT_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

44102
QUBIT = 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

51116
ARGUMENT = (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+
54129
MATH_EXPR
55130
= additive
56131

57132
additive
58-
= _ left:subtractive _ "+" _ right:additive { return left + right; }
133+
= _ left:subtractive _ "+" _ right:additive { return left + "+" + right; }
59134
/ subtractive
60135

61136
subtractive
62-
= left:multiplicative _ "-" _ right:additive { return left - right }
137+
= left:multiplicative _ "-" _ right:additive { return left + "-" + right }
63138
/ multiplicative
64139

65140
multiplicative
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

69148
exponential
70-
= left: negative _ "^" _ right:additive { return Math.pow(left, right) }
149+
= left: negative _ "^" _ right:additive { return "pow(" + left + ", " + right + ")" }
71150
/ negative
72151

73152
negative
74-
= "-" _ right:func { return -right }
153+
= "-" _ right:func { return "-" + right }
75154
/ func
76155

77156
func
78-
= op:unaryop _ "(" _ exp:additive _ ")" { return op(exp) }
157+
= op:UNARYOP _ "(" _ exp:additive _ ")" _ { return op + "(" + exp + ")" }
79158
/ primary
80159

81160
primary
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

96176
UPPERCAMELCASE = 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]*

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ Some other considerations for the future development of this software, and the s
5555

5656
Can also max at 30 qubits, or the number storage will have to be changed
5757

58+
`grammar.pegjs` needs to be formatted and parts rewritten, conditionals not implemented yet.
59+
5860
## License
5961

6062
This software is licensed under the MIT licence (see `LICENSE.md`)

0 commit comments

Comments
 (0)