Declarative specification of lexing.
(lexp ucodes trees) → yes/no
A sequence of Unicode characters can be lexed to a sequence of lexeme CSTs iff the fringe of the CST sequence is the Unicode sequence, the longest lexeme rule holds, and identifiers are lexed correctly. There should be at most one CST sequence satisfying these requirements, but this remains to be formally proved.
Function:
(defun lexp (ucodes trees) (declare (xargs :guard (and (unicode-listp ucodes) (abnf::tree-listp trees)))) (let ((__function__ 'lexp)) (declare (ignorable __function__)) (and (grammar-lexp ucodes trees) (longest-lexp trees) (identifier-lexp-list trees))))
Theorem:
(defthm booleanp-of-lexp (b* ((yes/no (lexp ucodes trees))) (booleanp yes/no)) :rule-classes :rewrite)
Theorem:
(defthm lexp-of-unicode-list-fix-ucodes (equal (lexp (unicode-list-fix ucodes) trees) (lexp ucodes trees)))
Theorem:
(defthm lexp-unicode-list-equiv-congruence-on-ucodes (implies (unicode-list-equiv ucodes ucodes-equiv) (equal (lexp ucodes trees) (lexp ucodes-equiv trees))) :rule-classes :congruence)
Theorem:
(defthm lexp-of-tree-list-fix-trees (equal (lexp ucodes (abnf::tree-list-fix trees)) (lexp ucodes trees)))
Theorem:
(defthm lexp-tree-list-equiv-congruence-on-trees (implies (abnf::tree-list-equiv trees trees-equiv) (equal (lexp ucodes trees) (lexp ucodes trees-equiv))) :rule-classes :congruence)