Annotation of OpenXM_contrib/pari-2.2/emacs/pari-translator.el, Revision 1.1
1.1 ! noro 1: ;; This file is to be used with pari.el where further explanations
! 2: ;; may be found. See also the file pariemacs.txt.
! 3: ;; Should be accompanied by the file with-syntax.el. This latter
! 4: ;; contains an example as to how to write a "translating" file.
! 5:
! 6: ;; Created November 22 1998 by Olivier Ramare (ramare@gat.univ-lille1.fr)
! 7:
! 8: ;; It contains functions used for writing translating eLisp-modules
! 9: ;; that translate a program given in a langage into something comprehensible
! 10: ;; by the gp calculator.
! 11:
! 12: ;; Add
! 13: ;; /*@ (load-file "Name-of-the-translating-file")
! 14: ;; (setq gp-input-filter-hook (list 'translate)) */
! 15: ;; to the file to translate. 'translate is the translation function.
! 16: ;; The file has to be currently edited for this command to be taken
! 17: ;; into account.
! 18: ;;
! 19: ;; The first command of 'translate is either
! 20: ;; (gp-translate-on-other-file) and the file to be translated
! 21: ;; will not be changed.
! 22: ;; (gp-translate-on-same-file) and the file to be translated
! 23: ;; will be actually changed.
! 24:
! 25: (provide 'pari-translator)
! 26:
! 27: (defun gp-translate-on-other-file nil
! 28: "This function contains the command that should be executed
! 29: to translate a file onto another one. The file to translate is in the
! 30: currently editted (and set) buffer. The translated file is editted in
! 31: another buffer which is the selected one at the end of this command."
! 32:
! 33: (goto-char (point-min))
! 34: (get-buffer-create "*translation*")
! 35: (save-excursion (set-buffer "*translation*") (erase-buffer))
! 36: (copy-to-buffer "*translation*" (point-min) (point-max))
! 37: (set-buffer "*translation*")
! 38: ;; 'gp-temp-file is a variable of pari.el:
! 39: (set-visited-file-name gp-temp-file t)
! 40: ;; The preceding function has changed the buffer-name!
! 41: (rename-buffer "*translation*")
! 42:
! 43: ;; To limit the translation to this file:
! 44: (setq gp-input-filter-hook nil))
! 45:
! 46: (defun gp-translate-on-same-file nil
! 47: "This function contains the command that should be executed
! 48: to translate a file onto another one. The file to translate is in the
! 49: currently editted (and set) buffer."
! 50:
! 51: (goto-char (point-min))
! 52:
! 53: ;; To limit the translation to this file:
! 54: (setq gp-input-filter-hook nil))
! 55:
! 56:
! 57: ;;--------------------
! 58: ;; Expression finders
! 59: ;;--------------------
! 60:
! 61: ;; An inner full expression in gp is one of these two:
! 62: ;; fn-call :: identifier(...matching-)
! 63: ;; identifier
! 64: ;; preceded and followed by any number of comments, spaces, newline
! 65: ;; or tabulation-character.
! 66: ;; Its end delimitation is "," or ";" or "}"
! 67: ;; Thus, we do not detect full expression located at the end of
! 68: ;; a one line function definition, not surrounded by "{}",
! 69: ;; not followed by ";"
! 70:
! 71: ;; pari.el already contains 'gp-find-comment, 'gp-find-global-var
! 72: ;; and 'gp-search-forward-string-delimiter.
! 73:
! 74: (defconst gp-regexp-identifier "[a-zA-Z_][a-zA-Z_0-9]*"
! 75: "Regexp to match identifiers in gp.")
! 76:
! 77: (defconst gp-regexp-comment "\\\\\\\\$\\|/\\*\\([^\\*]\\|\\*[^/]\\)*\\*/"
! 78: "Regexp to match comments in gp")
! 79:
! 80: (defun gp-looking-at-identifierp nil
! 81: "T if point is located at the beginning of a gp-identifier."
! 82: (if (looking-at gp-regexp-identifier)
! 83: (if (bobp)
! 84: t
! 85: (save-excursion
! 86: (forward-char -1)
! 87: (looking-at "[^a-zA-Z_0-9]")))
! 88: nil))
! 89:
! 90: (defun gp-looking-at-identifier nil
! 91: "Return end of identifier if gp-looking-at-identifier is T,
! 92: nil otherwise."
! 93: (if (gp-looking-at-identifierp)
! 94: (save-excursion (skip-chars-forward "a-zA-Z_0-9") (point))
! 95: nil))
! 96:
! 97: (defun gp-looking-at-fn-call nil
! 98: "Return end of fn-call if point is located at the beginning of a
! 99: fn-call, and nil otherwise."
! 100: (if (gp-looking-at-identifierp)
! 101: (save-excursion
! 102: (goto-char (gp-looking-at-identifier))
! 103: (if (not (looking-at "[ \t\n\\\\]*("))
! 104: nil
! 105: (goto-char (- (match-end 0) 1))
! 106: (forward-sexp) ;; Error if expression is unbalanced.
! 107: (point)))
! 108: nil))
! 109:
! 110: (defun gp-skip-comments nil
! 111: (while (looking-at gp-regexp-comment)
! 112: (goto-char (match-end 0))))
! 113:
! 114: (defun gp-looking-at-term nil
! 115: "Return end of term if point is located at the beginning of a
! 116: fn-call, and nil otherwise.
! 117: A `term' is either an identifier, either a fn-call, surrounded by
! 118: any number of parenthesis/space/newline/tab-char/backslash. It may
! 119: also start by a comment."
! 120: (gp-skip-comments)
! 121: (if (looking-at "[ \t\n\\\\]*(")
! 122: (let ((p-end (save-excursion
! 123: (forward-sexp)
! 124: (gp-skip-comments)
! 125: (point))))
! 126: (forward-char 1)
! 127: (if (gp-looking-at-term) p-end nil))
! 128: (let ((p-end (gp-looking-at-fn-call)))
! 129: (if p-end p-end
! 130: (if (gp-looking-at-identifierp)
! 131: (gp-looking-at-identifier)
! 132: nil)))))
! 133:
! 134: (defun gp-looking-at-rat-exp nil
! 135: "Return end of rational expression if point is located at the beginning
! 136: of one, nil otherwise.
! 137: A rational expression for gp is a succession of terms separated by one
! 138: of the operators +-*%/."
! 139: (save-excursion
! 140: (let ((first-term (gp-looking-at-term)))
! 141: (if (not first-term)
! 142: nil
! 143: (goto-char first-term)
! 144: (if (looking-at "[ \t\n\\\\]*[+-*%/]")
! 145: (progn (goto-char (match-end 0))
! 146: (gp-looking-at-rat-exp))
! 147: first-term)))))
! 148:
! 149: ;; pari-translator.el ends here.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>