From afd48a0fb4e8252f4e8c74c8442dd2a08d2787ca Mon Sep 17 00:00:00 2001 From: Syndamia Date: Tue, 25 Oct 2022 21:31:01 +0300 Subject: [PATCH] Created a commonlisp to html lexer, with an example file and usage script --- .../commonlisp2html/commonlisp2html.l | 56 +++++++++++++++++++ .../0MI0800028/commonlisp2html/example.lisp | 21 +++++++ homework/0MI0800028/commonlisp2html/lexer.sh | 20 +++++++ .../commonlisp2html/page_bottom.html | 3 + .../0MI0800028/commonlisp2html/page_top.html | 49 ++++++++++++++++ 5 files changed, 149 insertions(+) create mode 100644 homework/0MI0800028/commonlisp2html/commonlisp2html.l create mode 100644 homework/0MI0800028/commonlisp2html/example.lisp create mode 100755 homework/0MI0800028/commonlisp2html/lexer.sh create mode 100644 homework/0MI0800028/commonlisp2html/page_bottom.html create mode 100644 homework/0MI0800028/commonlisp2html/page_top.html diff --git a/homework/0MI0800028/commonlisp2html/commonlisp2html.l b/homework/0MI0800028/commonlisp2html/commonlisp2html.l new file mode 100644 index 00000000..46447b1d --- /dev/null +++ b/homework/0MI0800028/commonlisp2html/commonlisp2html.l @@ -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("%s", yytext); } +{STR} { printf("%s", yytext); } +{NUMBERS} { printf("%s", yytext); } +{COMMENT} { printf("%s", yytext); } +{PARAMETER_TYPE} { printf("%s", yytext); } +{KEYWORD} { printf("%s", yytext); } +{CONSTANTS} { printf("%s", yytext); } + +{SPECIAL_FORM} { printf("%s", yytext); } +{F_ARITHMETIC}|{F_NUM_COMPARISON}|{F_TRIGONOMETRIC}|{F_TRIGONOMETRIC}|{F_OTHER_MATH}|{F_LOGICAL}|{F_LISTS}|{F_OTHER} { printf("%s", yytext); } +{M_ARITHMETIC}|{M_LOGICAL}|{M_CONDITIONAL}|{M_DECLARE} { printf("%s", yytext); } + +{GLOBAL_VAR}|{CONST_VAR} { printf("%s", 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); } + +%% diff --git a/homework/0MI0800028/commonlisp2html/example.lisp b/homework/0MI0800028/commonlisp2html/example.lisp new file mode 100644 index 00000000..cd7a5773 --- /dev/null +++ b/homework/0MI0800028/commonlisp2html/example.lisp @@ -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)) diff --git a/homework/0MI0800028/commonlisp2html/lexer.sh b/homework/0MI0800028/commonlisp2html/lexer.sh new file mode 100755 index 00000000..39bc21d7 --- /dev/null +++ b/homework/0MI0800028/commonlisp2html/lexer.sh @@ -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 diff --git a/homework/0MI0800028/commonlisp2html/page_bottom.html b/homework/0MI0800028/commonlisp2html/page_bottom.html new file mode 100644 index 00000000..073ae297 --- /dev/null +++ b/homework/0MI0800028/commonlisp2html/page_bottom.html @@ -0,0 +1,3 @@ + + + diff --git a/homework/0MI0800028/commonlisp2html/page_top.html b/homework/0MI0800028/commonlisp2html/page_top.html new file mode 100644 index 00000000..e0b7a200 --- /dev/null +++ b/homework/0MI0800028/commonlisp2html/page_top.html @@ -0,0 +1,49 @@ + + + + Highlighted code + + + +