summaryrefslogtreecommitdiff
path: root/grammar.lisp
diff options
context:
space:
mode:
authoraleksei <aleksei@aj.org>2024-04-12 13:53:21 +1000
committeraleksei <aleksei@aj.org>2024-04-12 13:53:21 +1000
commit84ad1b97a5095cf6010593ec96e7d43d77fc0fa5 (patch)
tree36a00eb699bb0ce7cd7d18dc1bf608d9714538c0 /grammar.lisp
parent82632e220e3a0c2f72c463f8c07b9678d7399972 (diff)
Added syntax evaluation for asm lines
Diffstat (limited to 'grammar.lisp')
-rw-r--r--grammar.lisp54
1 files changed, 54 insertions, 0 deletions
diff --git a/grammar.lisp b/grammar.lisp
new file mode 100644
index 0000000..2a3cb03
--- /dev/null
+++ b/grammar.lisp
@@ -0,0 +1,54 @@
+;; -*- mode: common-lisp -*-
+#|
+clasm-6502: An assembler for the 6502 written in Common Lisp.
+Copyright (C) 2024 Aleksei Eaves
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+|#
+
+(defun last-char (s)
+ (char s (- (length s) 1)))
+
+(setf
+ *grammar*
+ '((label
+ (lambda (l)
+ (eq (last-char (first l)) #\:)))
+ (macro
+ (lambda (l)
+ (eq (second l) "=")))
+ (attribute
+ (lambda (l)
+ (eq (char (first l) 0) #\.)))
+ (instruction
+ (lambda (l)
+ (if (or (member (read-from-string (first l)) *opcodes*)
+ (member (read-from-string (second l)) *opcodes*))
+ t nil)))))
+
+
+(defun syntax-rule (item list)
+ "Test a line against a list of syntax rules."
+ (dolist (i (extract-keys list))
+ (let ((z (funcall
+ (eval (cadr (assoc i list)))
+ item)))
+ (cond ((not (equal
+ z nil))
+ (return i))
+ (t nil)))))
+
+(syntax-rule '("LDA:" "$05") *grammar*)
+