aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc/parser.clj
diff options
context:
space:
mode:
authorShagun Agrawal <agrawalshagun07@gmail.com>2024-08-11 00:22:05 +0530
committerShagun Agrawal <agrawalshagun07@gmail.com>2024-08-11 00:22:05 +0530
commit0f4b96b2b02822abf6f84903366709b1336905a2 (patch)
treeae43a57952f8dd3a3fd063aaf130db38dfe5a692 /src/cljcc/parser.clj
parent399bb5ab8bce44f5aeb43909dd10ad4ef5c93de1 (diff)
Add bitwise operators
Diffstat (limited to 'src/cljcc/parser.clj')
-rw-r--r--src/cljcc/parser.clj31
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