diff options
| author | Shagun Agrawal <agrawalshagun07@gmail.com> | 2024-08-11 00:22:05 +0530 |
|---|---|---|
| committer | Shagun Agrawal <agrawalshagun07@gmail.com> | 2024-08-11 00:22:05 +0530 |
| commit | 0f4b96b2b02822abf6f84903366709b1336905a2 (patch) | |
| tree | ae43a57952f8dd3a3fd063aaf130db38dfe5a692 /src/cljcc/parser.clj | |
| parent | 399bb5ab8bce44f5aeb43909dd10ad4ef5c93de1 (diff) | |
Add bitwise operators
Diffstat (limited to 'src/cljcc/parser.clj')
| -rw-r--r-- | src/cljcc/parser.clj | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/cljcc/parser.clj b/src/cljcc/parser.clj index bee6d32..0d95ac8 100644 --- a/src/cljcc/parser.clj +++ b/src/cljcc/parser.clj @@ -44,11 +44,38 @@ keyword = #'int\\b' | #'return\\b' | #'void\\b'" :auto-whitespace whitespace)) +(def bitwise-parser + (insta/parser + "<program> = function+ + function = #'int\\b' identifier <'('> #'void\\b' <')'> <'{'> statement <'}'> + statement = #'return\\b' exp <';'> + exp = exp-prime + <exp-prime> = mul-div-mod | add-exp | sub-exp + add-exp = exp-prime <'+'> mul-div-mod + sub-exp = exp-prime <'-'> mul-div-mod + <mul-div-mod> = bitwise-exp-prime | mul-exp | div-exp | mod-exp + mul-exp = mul-div-mod <'*'> bitwise-exp-prime + div-exp = mul-div-mod <'/'> bitwise-exp-prime + mod-exp = mul-div-mod <'%'> bitwise-exp-prime + <bitwise-exp-prime> = bit-and-exp | bit-or-exp | bit-xor-exp | bit-left-shift-exp | bit-right-shift-exp | term + bit-and-exp = bitwise-exp-prime <'&'> term + bit-or-exp = bitwise-exp-prime <'|'> term + bit-xor-exp = bitwise-exp-prime <'^'> term + bit-left-shift-exp = bitwise-exp-prime <'<<'> term + bit-right-shift-exp = bitwise-exp-prime <'>>'> term + <term> = constant-exp | unary-exp | <'('> exp-prime <')'> + unary-exp = unary-operator term + unary-operator = #'-' | #'~' + identifier = #'[a-zA-Z_]\\w*\\b' + constant-exp = #'[0-9]+\\b' + keyword = #'int\\b' | #'return\\b' | #'void\\b'" + :auto-whitespace whitespace)) + (defn parseable? [result] (not (insta/failure? result))) (defn parse [source] - (binop-parser source)) + (bitwise-parser source)) (comment @@ -64,7 +91,7 @@ }") (pp/pprint (parse "int main(void) { - return -(((((10))))); + return 1 & 2 + 6 & 6; }")) (pp/pprint |
