Parse list of
(tokens-to-cst rule-name tokens) → tree
Supported grammar rule names are
Given a list of tokens resulting from lexing and tokenizing, this function attempts to parse the tokens into a CST for the the given grammar rule name.
In the case of
If the given rule cannot be parsed or if there are tokens left over, then a reserr is returned.
Function:
(defun tokens-to-cst (rule-name tokens) (declare (xargs :guard (and (stringp rule-name) (abnf::tree-listp tokens)))) (let ((__function__ 'tokens-to-cst)) (declare (ignorable __function__)) (b* (((unless (member-equal rule-name '("file" "statement" "expression" "token"))) (reserrf (cons :not-yet-supported-top-level-rule-name rule-name))) ((when (and (null tokens) (not (equal rule-name "file")))) (reserrf (cons :not-enough-tokens rule-name))) ((mv cst next-token rest-input) (cond ((equal rule-name "file") (parse-file tokens)) ((equal rule-name "statement") (parse-statement (first tokens) (rest tokens))) ((equal rule-name "expression") (parse-expression (first tokens) (rest tokens))) ((equal rule-name "token") (b* (((mv tree? rest-tokens) (parse-token tokens)) ((unless (abnf::treep tree?)) (mv (reserrf (cons :no-more-tokens tokens)) nil nil)) ((when (null rest-tokens)) (mv tree? nil nil))) (mv tree? (car rest-tokens) (cdr rest-tokens)))) (t (mv (reserrf (cons :not-yet-supported-top-level-rule-name rule-name)) nil nil)))) ((when (reserrp cst)) cst) ((when (or next-token rest-input)) (reserrf (list :not-all-tokens-parsed cst next-token rest-input)))) cst)))
Theorem:
(defthm tree-resultp-of-tokens-to-cst (b* ((tree (tokens-to-cst rule-name tokens))) (abnf::tree-resultp tree)) :rule-classes :rewrite)