;;; wisent-calc.el --- Infix notation calculator ;; Copyright (C) 2001, 2002, 2003, 2004 David Ponce ;; Author: David Ponce ;; Maintainer: David Ponce ;; Created: 11 Sep 2001 ;; Keywords: syntax ;; X-RCS: $Id: wisent-calc.el,v 1.18 2005/09/30 20:22:55 zappo Exp $ ;; This file is not part of GNU Emacs. ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 2, or (at ;; your option) any later version. ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; ;; This is a port of the Bison 1.28d Infix Calc sample program to the ;; elisp LALR parser Wisent. It illustrates usage of operator ;; precedence and contextual precedence. The grammar is generated ;; from the WY file wisent-calc.wy. ;; ;; To run the calculator use M-x wisent-calc and at "calc:" prompt ;; enter expressions separated by semicolons. Here is a sample run of ;; `wisent-calc': ;; ;; calc: 4 + 4.5 - (34.0/(8*3+-3)); ;; -> 6.880952380952381; ;; calc: -56 + 2; ;; -> -54; ;; calc: 3 ^ 2; ;; -> 9; ;; calc: 2*2*2 = 2^3; ;; -> t; ;; calc: 2*2*2; 2^3; ;; -> 8; 8; ;;; History: ;; ;;; Code: (require 'semantic-wisent) (require 'wisent-calc-wy) (define-lex-simple-regex-analyzer wisent-calc-lex-number "Detect and create number tokens." semantic-lex-number-expression 'NUM) (define-lex-simple-regex-analyzer wisent-calc-lex-punctuation "Detect and create punctuation tokens." "\\(\\s.\\|\\s$\\|\\s'\\)" (char-after)) (define-lex wisent-calc-lexer "Calc lexical analyzer." semantic-lex-ignore-whitespace semantic-lex-ignore-newline wisent-calc-lex-number wisent-calc-lex-punctuation semantic-lex-default-action) (defun wisent-calc (input) "Infix desktop calculator. Parse INPUT string and output the result of computation." (interactive "scalc: ") (or (string-match ";\\s-*$" input) (setq input (concat input ";"))) (with-temp-buffer (wisent-calc-setup-parser) (semantic-lex-init) (insert input) (let ((wisent-lex-istream (semantic-lex-buffer))) (message "%s -> %s" input (wisent-parse semantic--parse-table 'wisent-lex)) ))) (provide 'wisent-calc) ;;; wisent-calc.el ends here