Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions homework/0MI0800028/commonlisp2html/commonlisp2html.l
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
%{

%}

DIGIT [0-9]
BRACKET \(|\)

STR \"([^\"]|\\\")*([^\\]|\\\\)\"
NUMBERS [^A-z](\+|-)?{DIGIT}+(\.{DIGIT}+(e{DIGIT}+|d{DIGIT}+|e-{DIGIT}+)?|\/{DIGIT}+)?

COMMENT ;.*$
PARAMETER_TYPE &[0-9A-z]+
KEYWORD :[0-9A-z]+
CONSTANTS T|NIL|pi|t

SPECIAL_FORM block|function|if|let|quote|return-from|defun|demacro

/* Functions */
F_ARITHMETIC "+ "|"- "|"* "|\/|1\+|1-|conjugate|gcd|lcm
F_NUM_COMPARISON =|\/=|<|>|<=|>=|max|min
F_TRIGONOMETRIC sin|cos|tan|cis|asin|acos|atan|sinh|cosh|tanh|asinh|acosh|atanh
F_OTHER_MATH abs|sqrt|phase|signum
F_LOGICAL not
F_LISTS list
F_OTHER format

/* Macros */
M_ARITHMETIC incf|decf
M_LOGICAL and|or
M_CONDITIONAL when|unless|cond|case|typecase
M_DECLARE defvar|defparameter|defconstant|defun

/* Not in spec, but commonly followed */
GLOBAL_VAR \*([0-9A-z.?-_])+\*
CONST_VAR \+([0-9A-z.?-_])+\+

%%

{BRACKET} { printf("<span class=\"bracket\">%s</span>", yytext); }
{STR} { printf("<span class=\"string\">%s</span>", yytext); }
{NUMBERS} { printf("<span class=\"number\">%s</span>", yytext); }
{COMMENT} { printf("<span class=\"comment\">%s</span>", yytext); }
{PARAMETER_TYPE} { printf("<span class=\"parameter-type\">%s</span>", yytext); }
{KEYWORD} { printf("<span class=\"keyword\">%s</span>", yytext); }
{CONSTANTS} { printf("<span class=\"constant\">%s</span>", yytext); }

{SPECIAL_FORM} { printf("<span class=\"special-operator\">%s</span>", yytext); }
{F_ARITHMETIC}|{F_NUM_COMPARISON}|{F_TRIGONOMETRIC}|{F_TRIGONOMETRIC}|{F_OTHER_MATH}|{F_LOGICAL}|{F_LISTS}|{F_OTHER} { printf("<span class=\"function\">%s</span>", yytext); }
{M_ARITHMETIC}|{M_LOGICAL}|{M_CONDITIONAL}|{M_DECLARE} { printf("<span class=\"macro\">%s</span>", yytext); }

{GLOBAL_VAR}|{CONST_VAR} { printf("<span class=\"variable\">%s</span>", yytext); }

/* flex catches the longest possibility, so if some variable name contains a known word (function, macro, etc.), this will prevent it from highlighting */
[A-z]+ { printf("%s", yytext); }

%%
21 changes: 21 additions & 0 deletions homework/0MI0800028/commonlisp2html/example.lisp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
(defvar *NAME* "John")
(defvar *AGE* 23)
(defvar *ABOUT* " T NIL cond decf block")

;;; This is a stupid funciton
(defun adult? ()
(>= *AGE* 18))

(defun will-I-graduate? ()
NIL)

(defun distance (p1 p2)
(sqrt (* p1 p1) (* p2 p2)))

(defun bar (a b)
(if (and (> b a) (<= 10 b))
(format t "Valid")
(format t "Invalid")))

(defun foo (&key ((:apple a)) ((:box b) 0) ((:charlie c) 0 c-supplied-p))
(list a b c c-supplied-p))
20 changes: 20 additions & 0 deletions homework/0MI0800028/commonlisp2html/lexer.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#! /bin/bash

if [ "$1" = "-b" ]; then
shift
flex $@
gcc lex.yy.c -lfl
fi

if [ "$1" = "-r" ]; then
shift
./a.out < $@
fi

if [ "$1" = "-p" ]; then
filename="highlighted.html"
cat ./page_top.html > $filename
shift
./a.out < $@ >> $filename
cat ./page_bottom.html >> $filename
fi
3 changes: 3 additions & 0 deletions homework/0MI0800028/commonlisp2html/page_bottom.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
</pre></code>
</body>
</html>
49 changes: 49 additions & 0 deletions homework/0MI0800028/commonlisp2html/page_top.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html>
<head>
<title>Highlighted code</title>
<style>
body {
font-size: 20px;
}
pre, code {
color: #ffd7af;
background-color: #1c1c1c;
}
.bracket {
color: #d47408;
}
.string {
color: #afaf00;
}
.number {
color: #d787af;
}
.comment {
color: #8a8a8a;
}
.parameter-type {
color: #87afaf;
}
.keyword {
color: #87af87;
}
.constant {
color: #9045ff;
}
.special-operator {
color: #5f8fd7;
}
.function {
color: #d75f5f;
}
.macro {
color: #73d75f;
}
.variable {
color: #ffaf00;
}
</style>
</head>
<body>
<pre><code>