(define (makefile-fontifier string) (with-input-from-string string (lambda () (read/rp (regular-grammar () ((: #\# (+ all)) ;; makefile comment (let ((cmt (the-string))) (cons (it cmt) (ignore)))) ((bol (: (+ (out " \t\n:")) #\:)) ;; target (let ((prompt (the-string))) (cons (bold prompt) (ignore)))) ((bol (: (+ alpha) #\=)) ;; variable definitions (let* ((len (- (the-length) 1)) (var (the-substring 0 len))) (cons (list (color :fg "#bb0000" (bold var)) "=") (ignore)))) ((+ (out " \t\n:=$")) ;; plain strings (let ((str (the-string))) (cons str (ignore)))) ((: #\$ #\( (+ (out " )\n")) #\)) ;; variable references (let ((str (the-string)) (var (the-substring 2 (- (the-length) 1)))) (cons (underline str) (ignore)))) ((+ (in " \t\n:")) ;; separators (let ((nl (the-string))) (cons nl (ignore)))) (else ;; default (let ((c (the-failure))) (if (eof-object? c) '() (skribe-error 'makefile "Unexpected char" c))))) (current-input-port))))) (define makefile (language :name "Makefile" :fontifier makefile-fontifier)) (frame :width 100. (prog (source :language makefile [ SKRIBE=skribe all: demo.html demo.man demo.html: demo.skb $(SKRIBE) demo.skb -o demo.html demo.man: demo.skb $(SKRIBE) demo.skb -o demo.man ])))