summaryrefslogtreecommitdiff
path: root/syntax-highlight
diff options
context:
space:
mode:
Diffstat (limited to 'syntax-highlight')
-rw-r--r--syntax-highlight/wat.scm60
1 files changed, 60 insertions, 0 deletions
diff --git a/syntax-highlight/wat.scm b/syntax-highlight/wat.scm
new file mode 100644
index 0000000..4966d05
--- /dev/null
+++ b/syntax-highlight/wat.scm
@@ -0,0 +1,60 @@
+;;; guile-syntax-highlight --- General-purpose syntax highlighter
+;;; Copyright © 2023 David Thompson <davet@gnu.org>
+;;;
+;;; Guile-syntax-highlight 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 3 of the License, or (at your option) any later version.
+;;;
+;;; Guile-syntax-highlight 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 guile-syntax-highlight. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Syntax highlighting for WebAssembly text format.
+;;
+;;; Code:
+
+(define-module (syntax-highlight wat)
+ #:use-module (ice-9 match)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-11)
+ #:use-module (srfi srfi-26)
+ #:use-module (syntax-highlight lexers)
+ #:export (%default-special-symbols
+ %default-special-prefixes
+ make-wat-lexer
+ lex-wat))
+
+(define char-set:wat-delimiters
+ (char-set-union char-set:whitespace
+ (char-set #\( #\))))
+
+(define char-set:wat-symbol
+ (char-set-complement char-set:wat-delimiters))
+
+(define %keywords
+ '("i31" "i32" "i64" "f32" "f64" "eq" "string" "module" "type" "func"
+ "array" "struct" "mut" "ref" "extern" "null" "field" "sub" "import"
+ "export" "param" "result" "block" "loop" "local" "rec"))
+
+;; TODO: WAT has some weird commenting syntax that this doesn't
+;; support, among probably other missing things.
+(define lex-wat
+ (lex-consume
+ (lex-any (lex-char-set char-set:whitespace)
+ (lex-tag 'open (lex-string "("))
+ (lex-tag 'close (lex-string ")"))
+ (lex-tag 'comment (lex-delimited ";" #:until "\n"))
+ (lex-tag 'special
+ (lex-filter (lambda (str)
+ (any (cut string=? <> str) %keywords))
+ (lex-char-set char-set:wat-symbol)))
+ (lex-tag 'string (lex-delimited "\""))
+ (lex-tag 'symbol (lex-char-set char-set:wat-symbol)))))