(defpackage #:parse-latex (:use :cl :esrap)) (in-package #:parse-latex) (defrule a-z (alpha-char-p character)) (defrule alphabet (+ a-z)) (defrule filename-char a-z) (defrule control-m #\Return) (defrule control-l #\Page) (defrule accent-acute "\\'") (defrule accent-grav "\\`") (defrule accent-umlaut "\\\"" ) (defrule accent-circumflex "\\^") (defrule accent (or accent-circumflex accent-grav accent-acute accent-umlaut)) (defrule letter (or a-z #\- accent)) (defrule digit (digit-char-p character)) (defrule number (+ digit)) (defrule math-number (and (* digit) (? ".") number) (:text t)) (defrule text-number (and number (* (and (? ",") math-number))) (:text t)) (defrule time-number (and (+ digit) (? ":") (+ digit)) (:text t)) (defrule alphabet-string (* letter) (:text t)) (defrule horizontal-space (or #\Space #\Tab)) (defrule newline #\Newline) (defrule whitespace (or newline horizontal-space)) (defrule blank-line (and (* horizontal-space) newline)) (defrule paragraph-separator (and newline (+ blank-line))) (defun punctuationp (character) (find character "-=_^/.,:;!?\"()@\[\]|<>*+'`")) (defrule punctuation (punctuationp character)) (defrule backslash #\\) (defun latex-special-char-p (character) (find character "&%$#_{}~^\\")) (defrule latex-special-char (latex-special-char-p character)) (defun math-op-p (character) (find character "+*/'<>=-")) (defrule math-op (math-op-p character)) (defrule pos-tab-arg (and "[" (+ (or #\h #\b #\t #\p)) "]")) (defrule opt-tab-arg (and "{" (* (or #\l #\r #\c #\|)) "}")) (defrule begin-env-open (and backslash "begin" (* horizontal-space) "{")) (defrule begin-env-close (and "}" (* whitespace))) (defrule begin-display-math "$$") (defrule end-display-math "$$")