├── .gitignore ├── QASM.g4 ├── README.md └── examples └── antlr4_parse_tree.svg /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/java,linux,macos,windows 3 | 4 | ### Java ### 5 | # Compiled class file 6 | *.class 7 | 8 | # Log file 9 | *.log 10 | 11 | # BlueJ files 12 | *.ctxt 13 | 14 | # Mobile Tools for Java (J2ME) 15 | .mtj.tmp/ 16 | 17 | # Package Files # 18 | *.jar 19 | *.war 20 | *.ear 21 | *.zip 22 | *.tar.gz 23 | *.rar 24 | 25 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 26 | hs_err_pid* 27 | 28 | ### Linux ### 29 | *~ 30 | 31 | # temporary files which can be created if a process still has a handle open of a deleted file 32 | .fuse_hidden* 33 | 34 | # KDE directory preferences 35 | .directory 36 | 37 | # Linux trash folder which might appear on any partition or disk 38 | .Trash-* 39 | 40 | # .nfs files are created when an open file is removed but is still being accessed 41 | .nfs* 42 | 43 | ### macOS ### 44 | *.DS_Store 45 | .AppleDouble 46 | .LSOverride 47 | 48 | # Icon must end with two \r 49 | Icon 50 | 51 | # Thumbnails 52 | ._* 53 | 54 | # Files that might appear in the root of a volume 55 | .DocumentRevisions-V100 56 | .fseventsd 57 | .Spotlight-V100 58 | .TemporaryItems 59 | .Trashes 60 | .VolumeIcon.icns 61 | .com.apple.timemachine.donotpresent 62 | 63 | # Directories potentially created on remote AFP share 64 | .AppleDB 65 | .AppleDesktop 66 | Network Trash Folder 67 | Temporary Items 68 | .apdisk 69 | 70 | ### Windows ### 71 | # Windows thumbnail cache files 72 | Thumbs.db 73 | ehthumbs.db 74 | ehthumbs_vista.db 75 | 76 | # Folder config file 77 | Desktop.ini 78 | 79 | # Recycle Bin used on file shares 80 | $RECYCLE.BIN/ 81 | 82 | # Windows Installer files 83 | *.cab 84 | *.msi 85 | *.msm 86 | *.msp 87 | 88 | # Windows shortcuts 89 | *.lnk 90 | 91 | 92 | # End of https://www.gitignore.io/api/java,linux,macos,windows 93 | 94 | 95 | .antlr 96 | QASM.interp 97 | QASM.tokens 98 | QASMLexer.interp 99 | QASMLexer.java 100 | QASMLexer.tokens 101 | QASMParser.java -------------------------------------------------------------------------------- /QASM.g4: -------------------------------------------------------------------------------- 1 | grammar QASM; 2 | 3 | mainprog 4 | : version statement* 5 | ; 6 | 7 | statement 8 | : decl 9 | | gatedecl goplist '}' 10 | | gatedecl '}' 11 | | 'opaque' ID idlist ';' 12 | | 'opaque' ID '(' ')' idlist ';' 13 | | 'opaque' ID '(' idlist ')' idlist ';' 14 | | qop 15 | | 'if' '(' ID '==' INT ')' qop 16 | | 'barrier' anylist ';' 17 | ; 18 | 19 | version 20 | : 'OPENQASM' REAL ';' 21 | ; 22 | 23 | decl 24 | : 'qreg' ID '[' INT ']' ';' 25 | | 'creg' ID '[' INT ']' ';' 26 | ; 27 | 28 | gatedecl 29 | : 'gate' ID idlist '{' 30 | | 'gate' ID '(' ')' idlist '{' 31 | | 'gate' ID '(' idlist ')' idlist '{' 32 | ; 33 | 34 | goplist 35 | : (uop | 'barrier' idlist ';')+ 36 | ; 37 | 38 | qop 39 | : uop 40 | | 'measure' argument '->' argument ';' 41 | | 'reset' argument ';' 42 | ; 43 | 44 | uop 45 | : 'U' '(' explist ')' argument ';' 46 | | 'CX' argument ',' argument ';' 47 | | ID anylist ';' 48 | | ID '(' ')' anylist ';' 49 | | ID '(' explist ')' anylist ';' 50 | ; 51 | 52 | anylist 53 | : idlist 54 | | mixedlist 55 | ; 56 | 57 | idlist 58 | : (ID ',')* ID 59 | ; 60 | 61 | mixedlist 62 | : (ID '[' INT ']' ',')* ID 63 | | (ID '[' INT ']' ',')* ID '[' INT ']' 64 | | ((ID ',')* ID ',')* ID '[' INT ']' 65 | ; 66 | 67 | argument 68 | : ID 69 | | ID '[' INT ']' 70 | ; 71 | 72 | explist 73 | : (exp ',')* exp 74 | ; 75 | 76 | exp 77 | : REAL 78 | | INT 79 | | 'pi' 80 | | ID 81 | | exp '+' exp 82 | | exp '-' exp 83 | | exp '*' exp 84 | | exp '/' exp 85 | | '-' exp 86 | | exp '^' exp 87 | | '(' exp ')' 88 | | unaryop '(' exp ')' 89 | ; 90 | 91 | unaryop 92 | : 'sin' | 'cos' | 'tan' | 'exp' | 'ln' | 'sqrt' 93 | ; 94 | 95 | // Other / REGEX Tokens 96 | 97 | ID 98 | : [a-z][A-Za-z0-9_]* 99 | ; 100 | 101 | REAL 102 | : INT '.' [0-9]+ ([eE][+-]? [0-9]+)? 103 | ; 104 | 105 | INT 106 | : [+-]? [0-9]+ 107 | ; 108 | 109 | WS 110 | : [ \t\u000C\r\n]+ -> skip 111 | ; 112 | 113 | COMMENT 114 | : '/*' .*? '*/' -> skip 115 | ; 116 | 117 | LINE_COMMENT 118 | : '//' ~[\r\n]* -> skip 119 | ; 120 | 121 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OPENQASM 2.0 Grammar 2 | 3 | > This is the grammar for OPENQASM 2.0, written for Antlr4. 4 | > NOTE: This grammar doesn't have 'include' statements, as that should be done in preprocessing 5 | 6 | ## Usage 7 | 8 | You should have antlr4 installed: [here](http://www.antlr.org/download.html). 9 | 10 | You can test the parser and see an AST like so: 11 | 12 | ``` 13 | $ antlr4 ./QASM.g4 14 | $ javac QASM*.java 15 | ``` 16 | 17 | ``` 18 | $ grun QASM mainprog -gui 19 | ``` 20 | 21 | ## Examples 22 | 23 | The following parse tree is from the QASM code below: 24 | 25 | ![Parse Tree](https://raw.github.com/qcgpu/QASM-Grammar/master/examples/antlr4_parse_tree.svg?sanitize=true) 26 | 27 | ```AS 28 | // Repetition code syndrome measurement 29 | OPENQASM 2.0; 30 | qreg q[3]; 31 | qreg a[2]; 32 | creg c[3]; 33 | creg syn[2]; 34 | gate syndrome d1,d2,d3,a1,a2 35 | { 36 | cx d1,a1; cx d2,a1; 37 | cx d2,a2; cx d3,a2; 38 | } 39 | x q[0]; // error 40 | barrier q; 41 | syndrome q[0],q[1],q[2],a[0],a[1]; 42 | measure a -> syn; 43 | if(syn==1) x q[0]; 44 | if(syn==2) x q[2]; 45 | if(syn==3) x q[1]; 46 | measure q -> c; 47 | ``` 48 | 49 | 50 | ## BNF Grammar 51 | 52 | This grammar is based off the BNF grammar, detailed in [this paper](https://arxiv.org/pdf/1707.03429.pdf): 53 | 54 | ```bnf 55 | mainprogram: "OPENQASM" real ";" program 56 | 57 | program: statement | program statement 58 | 59 | statement: decl 60 | :| gatedecl goplist } 61 | :| gatedecl } 62 | :| "opaque" id idlist ";" 63 | :| "opaque" id "( )" idlist ";" 64 | :| "opaque" id "(" idlist ")" idlist ";" 65 | :| qop 66 | :| "if (" id "==" nninteger ")" qop 67 | :| "barrier" anylist ";" 68 | 69 | decl: "qreg" id [ nninteger ] ";" | "creg" id [ nninteger ] ";" 70 | 71 | gatedecl: "gate" id idlist { 72 | :| "gate" id "( )" idlist { 73 | :| "gate" id "(" idlist ")" idlist { 74 | 75 | goplist: uop 76 | :| "barrier" idlist ";" 77 | :| goplist uop 78 | :| goplist "barrier" idlist ";" 79 | 80 | qop: uop 81 | :| "measure" argument "->" argument ";" 82 | :| "reset" argument ";" 83 | 84 | uop: "U (" explist ")" argument ";" 85 | :| "CX" argument "," argument ";" 86 | :| id anylist ";" | id "( )" anylist ";" 87 | :| id "(" explist ")" anylist ";" 88 | 89 | anylist: idlist | mixedlist 90 | 91 | idlist: id | idlist "," id 92 | 93 | mixedlist: id [ nninteger ] | miedlist "," id 94 | :| mixedlist "," id [ nninteger ] 95 | :| idlist "," id [ nninteger ] 96 | 97 | argument: id | id [ nninteger ] 98 | 99 | explist: exp | explist "," exp 100 | 101 | exp: real | nninteger | "pi" | id 102 | :| exp + exp | exp - exp | exp * exp 103 | :| exp / exp | -exp | exp ^ exp 104 | :| "(" exp ")" | unaryop "(" exp ")" 105 | 106 | unaryop: "sin" | "cos" | "tan" | "exp" | "ln" | "sqrt" 107 | 108 | id := [a-z][A-Za-z0-9_]* 109 | real := ([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([eE][-+]?[0-9]+)? 110 | nninteger := [1-9]+[0-9]*|0 111 | ``` 112 | 113 | ## Licence 114 | 115 | Copyright Adam Kelly, MIT License -------------------------------------------------------------------------------- /examples/antlr4_parse_tree.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 18 | 19 | 21 | image/svg+xml 22 | 24 | 25 | 26 | 27 | 28 | 30 | 54 | 61 | 68 | 75 | 82 | 89 | 96 | 103 | 110 | 117 | 124 | 131 | 138 | 145 | 152 | 159 | 166 | 173 | 180 | 187 | 194 | 201 | 208 | 215 | 222 | 229 | 236 | 243 | 250 | 257 | 264 | 271 | 278 | 285 | 292 | 299 | 306 | 313 | 320 | 327 | 334 | 341 | 348 | 355 | 362 | 369 | 376 | 383 | 390 | 397 | 404 | 411 | 418 | 425 | 432 | 439 | 446 | 453 | 460 | 467 | 474 | 481 | 488 | 495 | 502 | 509 | 516 | 523 | 530 | 537 | 544 | 551 | 558 | 565 | 572 | 579 | 586 | 593 | 600 | 607 | 614 | 621 | 628 | 635 | 642 | 649 | 656 | 663 | 670 | 677 | 684 | 691 | 698 | 705 | 712 | 719 | 726 | 733 | 740 | 747 | 754 | 761 | 768 | 775 | 782 | 789 | 796 | 803 | 810 | 817 | 824 | 831 | 838 | 845 | 852 | 859 | 866 | 873 | 880 | 887 | 894 | 901 | 908 | 915 | 922 | 929 | 936 | 943 | 950 | 957 | 964 | 971 | 978 | 985 | 992 | 999 | 1006 | 1013 | 1020 | 1027 | 1034 | 1041 | 1048 | 1055 | 1062 | 1069 | 1076 | 1083 | 1090 | 1097 | 1104 | 1111 | 1118 | 1125 | 1132 | 1139 | 1146 | 1153 | 1160 | 1167 | 1174 | 1181 | 1188 | 1195 | 1202 | 1209 | 1216 | 1223 | 1230 | 1237 | 1244 | 1251 | 1258 | 1265 | 1272 | 1279 | 1286 | 1293 | 1300 | 1307 | 1314 | 1321 | 1328 | 1335 | 1342 | 1349 | 1356 | 1363 | 1370 | 1377 | 1384 | 1391 | 1398 | 1405 | 1412 | 1419 | 1426 | 1433 | 1440 | 1447 | 1454 | 1461 | 1468 | 1476 | idlist 1481 | 1489 | [ 1494 | 1502 | if 1507 | 1515 | [ 1520 | 1528 | statement 1533 | 1541 | statement 1546 | 1554 | ] 1559 | 1567 | , 1572 | 1580 | anylist 1585 | 1593 | statement 1598 | 1606 | q 1611 | 1619 | idlist 1624 | 1632 | ] 1637 | 1645 | 1 1650 | 1658 | mixedlist 1663 | 1671 | ; 1676 | 1684 | x 1689 | 1697 | 3 1702 | 1710 | anylist 1715 | 1723 | uop 1728 | 1736 | } 1741 | 1749 | q 1754 | 1762 | anylist 1767 | 1775 | x 1780 | 1788 | d2 1793 | 1801 | [ 1806 | 1814 | if 1819 | 1827 | a2 1832 | 1840 | c 1845 | 1853 | q 1858 | 1866 | 1 1871 | 1879 | , 1884 | 1892 | ; 1897 | 1905 | argument 1910 | 1918 | statement 1923 | 1931 | [ 1936 | 1944 | [ 1949 | 1957 | [ 1962 | 1970 | 2.0 1975 | 1983 | 2 1988 | 1996 | ] 2001 | 2009 | statement 2014 | 2022 | 2 2027 | 2035 | decl 2040 | 2048 | decl 2053 | 2061 | idlist 2066 | 2074 | d2 2079 | 2087 | statement 2092 | 2100 | argument 2105 | 2113 | ; 2118 | 2126 | version 2131 | 2139 | ] 2144 | 2152 | [ 2157 | 2165 | , 2170 | 2178 | , 2183 | 2191 | syndrome 2196 | 2204 | measure 2209 | 2217 | == 2222 | 2230 | statement 2235 | 2243 | 3 2248 | 2256 | q 2261 | 2269 | q 2274 | 2282 | cx 2287 | 2295 | statement 2300 | 2308 | statement 2313 | 2321 | ; 2326 | 2334 | d1 2339 | 2347 | idlist 2352 | 2360 | measure 2365 | 2373 | qop 2378 | 2386 | c 2391 | 2399 | idlist 2404 | 2412 | ] 2417 | 2425 | 0 2430 | 2438 | decl 2443 | 2451 | ( 2456 | 2464 | ) 2469 | 2477 | uop 2482 | 2490 | cx 2495 | 2503 | ( 2508 | 2516 | anylist 2521 | 2529 | , 2534 | 2542 | a1 2547 | 2555 | , 2560 | 2568 | a1 2573 | 2581 | ; 2586 | 2594 | anylist 2599 | 2607 | q 2612 | 2620 | , 2625 | 2633 | 3 2638 | 2646 | x 2651 | 2659 | a1 2664 | 2672 | uop 2677 | 2685 | creg 2690 | 2698 | a2 2703 | 2711 | ) 2716 | 2724 | mixedlist 2729 | 2737 | gatedecl 2742 | 2750 | gate 2755 | 2763 | ; 2768 | 2776 | statement 2781 | 2789 | 2 2794 | 2802 | ] 2807 | 2815 | ] 2820 | 2828 | a2 2833 | 2841 | syn 2846 | 2854 | syn 2859 | 2867 | x 2872 | 2880 | ; 2885 | 2893 | ] 2898 | 2906 | 0 2911 | 2919 | qop 2924 | 2932 | ] 2937 | 2945 | [ 2950 | 2958 | uop 2963 | 2971 | -> 2976 | 2984 | q 2989 | 2997 | qreg 3002 | 3010 | ] 3015 | 3023 | cx 3028 | 3036 | uop 3041 | 3049 | uop 3054 | 3062 | qreg 3067 | 3075 | if 3080 | 3088 | syn 3093 | 3101 | ; 3106 | 3114 | a 3119 | 3127 | statement 3132 | 3140 | , 3145 | 3153 | 2 3158 | 3166 | qop 3171 | 3179 | -> 3184 | 3192 | a 3197 | 3205 | 2 3210 | 3218 | decl 3223 | 3231 | qop 3236 | 3244 | mainprog 3249 | 3257 | ; 3262 | 3270 | uop 3275 | 3283 | , 3288 | 3296 | ; 3301 | 3309 | ; 3314 | 3322 | q 3327 | 3335 | syndrome 3340 | 3348 | ; 3353 | 3361 | anylist 3366 | 3374 | uop 3379 | 3387 | cx 3392 | 3400 | [ 3405 | 3413 | ] 3418 | 3426 | argument 3431 | 3439 | creg 3444 | 3452 | d2 3457 | 3465 | q 3470 | 3478 | anylist 3483 | 3491 | ; 3496 | 3504 | statement 3509 | 3517 | 0 3522 | 3530 | anylist 3535 | 3543 | qop 3548 | 3556 | [ 3561 | 3569 | { 3574 | 3582 | OPENQASM 3587 | 3595 | goplist 3600 | 3608 | d3 3613 | 3621 | ] 3626 | 3634 | a 3639 | 3647 | mixedlist 3652 | 3660 | syn 3665 | 3673 | ; 3678 | 3686 | d1 3691 | 3699 | , 3704 | 3712 | statement 3717 | 3725 | ) 3730 | 3738 | ] 3743 | 3751 | ; 3756 | 3764 | uop 3769 | 3777 | argument 3782 | 3790 | mixedlist 3795 | 3803 | , 3808 | 3816 | syn 3821 | 3829 | qop 3834 | 3842 | == 3847 | 3855 | mixedlist 3860 | 3868 | qop 3873 | 3881 | a 3886 | 3894 | ( 3899 | 3907 | == 3912 | 3920 | [ 3925 | 3933 | idlist 3938 | 3946 | ; 3951 | 3959 | 1 3964 | 3972 | d3 3977 | 3985 | barrier 3990 | 3998 | 1 4003 | 4011 | anylist 4016 | 4024 | q 4029 | 4037 | ; 4042 | 4050 | [ 4055 | 4063 | anylist 4068 | 4076 | [ 4081 | 4089 | , 4094 | 4102 | 0 4107 | 4108 | --------------------------------------------------------------------------------