Read a token or newline during preprocessing.
(pread-token/newline headerp ppstate)
→
(mv erp nontokens-nonnewlines token/newline?
token/newline-span new-ppstate)
As explained in plexeme-token/newline-p, we also include line comments as newlines.
Function:
(defun pread-token/newline (headerp ppstate) (declare (xargs :stobjs (ppstate))) (declare (xargs :guard (and (booleanp headerp) (ppstatep ppstate)))) (b* (((reterr) nil nil (irr-span) ppstate) ((erp lexeme span ppstate) (plex-lexeme headerp ppstate)) ((when (not lexeme)) (retok nil nil span ppstate)) ((when (plexeme-token/newline-p lexeme)) (retok nil lexeme span ppstate)) ((erp nontokens-nonnewlines token/newline token/newline-span ppstate) (pread-token/newline headerp ppstate))) (retok (cons lexeme nontokens-nonnewlines) token/newline token/newline-span ppstate)))
Theorem:
(defthm plexeme-listp-of-pread-token/newline.nontokens-nonnewlines (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (plexeme-listp nontokens-nonnewlines)) :rule-classes :rewrite)
Theorem:
(defthm plexeme-optionp-of-pread-token/newline.token/newline? (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (plexeme-optionp token/newline?)) :rule-classes :rewrite)
Theorem:
(defthm spanp-of-pread-token/newline.token/newline-span (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (spanp token/newline-span)) :rule-classes :rewrite)
Theorem:
(defthm ppstatep-of-pread-token/newline.new-ppstate (implies (ppstatep ppstate) (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (ppstatep new-ppstate))) :rule-classes :rewrite)
Theorem:
(defthm plexeme-list-not-token/newline-p-of-pread-token/newline (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (plexeme-list-not-token/newline-p nontokens-nonnewlines)))
Theorem:
(defthm plexeme-token/newline-p-of-pread-token/newline (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (implies token? (plexeme-token/newline-p token/newline?))))
Theorem:
(defthm ppstate->size-of-pread-token/newline-uncond (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (<= (ppstate->size new-ppstate) (ppstate->size ppstate))) :rule-classes :linear)
Theorem:
(defthm ppstate->size-of-pread-token/newline-cond (b* (((mv acl2::?erp ?nontokens-nonnewlines ?token/newline? ?token/newline-span ?new-ppstate) (pread-token/newline headerp ppstate))) (implies (and (not erp) token/newline?) (<= (ppstate->size new-ppstate) (1- (ppstate->size ppstate))))) :rule-classes :linear)