Match comment characters to create an
(lex-comment sin) → (mv tok sin)
Function:
(defun lex-comment (sin) (declare (xargs :stobjs (sin))) (declare (xargs :guard t)) (let ((__function__ 'lex-comment)) (declare (ignorable __function__)) (b* ((comment-p (sin-matches-p "//" sin)) ((unless comment-p) (mv nil sin)) ((mv match sin) (sin-match-through-lit (newline-string) sin)) ((when match) (mv (make-token :type :comment :text match) sin)) ((mv match sin) (sin-match-everything sin))) (mv (make-token :type :comment :text match) sin))))
Theorem:
(defthm return-type-of-lex-comment.tok (b* (((mv ?tok ?sin) (lex-comment sin))) (equal (token-p tok) (if tok t nil))) :rule-classes :rewrite)
Theorem:
(defthm lex-comment-progress-weak (mv-let (tok new-sin) (lex-comment sin) (declare (ignorable tok new-sin)) (<= (len (strin-left new-sin)) (len (strin-left sin)))) :rule-classes ((:rewrite) (:linear)))
Theorem:
(defthm lex-comment-progress-strong (mv-let (tok new-sin) (lex-comment sin) (declare (ignorable tok new-sin)) (implies tok (< (len (strin-left new-sin)) (len (strin-left sin))))) :rule-classes ((:rewrite) (:linear)))
Theorem:
(defthm lex-comment-reconstruction (b* (((mv tok new-sin) (lex-comment sin))) (implies tok (equal (append (explode (token->text tok)) (strin-left new-sin)) (strin-left sin)))))