Alan W Blackfirst commite7e48689 years agoHistory
214 lines · 8.6 KB · Scheme
RawDownload
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                                                                     ;;;;;;                  Language Technologies Institute                    ;;;;;;                     Carnegie Mellon University                      ;;;;;;                         Copyright (c) 2000                          ;;;;;;                        All Rights Reserved.                         ;;;;;;                                                                     ;;;;;; Permission is hereby granted, free of charge, to use and distribute ;;;;;; this software and its documentation without restriction, including  ;;;;;; without limitation the rights to use, copy, modify, merge, publish, ;;;;;; distribute, sublicense, and/or sell copies of this work, and to     ;;;;;; permit persons to whom this work is furnished to do so, subject to  ;;;;;; the following conditions:                                           ;;;;;;  1. The code must retain the above copyright notice, this list of   ;;;;;;     conditions and the following disclaimer.                        ;;;;;;  2. Any modifications must be clearly marked as such.               ;;;;;;  3. Original authors' names are not deleted.                        ;;;;;;  4. The authors' names are not used to endorse or promote products  ;;;;;;     derived from this software without specific prior written       ;;;;;;     permission.                                                     ;;;;;;                                                                     ;;;;;; CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK        ;;;;;; DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING     ;;;;;; ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT  ;;;;;; SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE     ;;;;;; FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   ;;;;;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN  ;;;;;; AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,         ;;;;;; ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF      ;;;;;; THIS SOFTWARE.                                                      ;;;;;;                                                                     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;             Author: Alan W Black (awb@cs.cmu.edu)                   ;;;;;;               Date: January 2000                                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                                                                     ;;;;;; Generate C compilable CART trees.                                   ;;;;;;                                                                     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar val_table_length 0) (define (carttoC name tree odir)  "(carttoC NAME TREE ODIR)Coverts a CART tree to a single C file called ODIR/NAME_cart.c."  (let     ((ofdc (fopen (path-append odir (string-append name "_cart.c")) "w"))     (ofdh(fopen (path-append odir (string-append name "_cart.h")) "w")))    (format ofdc "/*******************************************************/\n")    (format ofdc "/**  Autogenerated cart trees for %s    */\n" name)    (format ofdc "/*******************************************************/\n")    (format ofdc "\n")    (format ofdc "#include \"cst_string.h\"\n")    (format ofdc "#include \"cst_cart.h\"\n")    (format ofdc "#include \"cst_regex.h\"\n")    (format ofdc "#include \"%s_cart.h\"\n" name)     (format ofdh "/*******************************************************/\n")    (format ofdh "/**  Autogenerated cart tree for %s    */\n" name)    (format ofdh "/**  from %s    */\n" odir)    (format ofdh "/*******************************************************/\n")    (format ofdh "\n")     (set! current_node -1)    (set! val_table nil)    (set! feat_nums nil)     (do_carttoC ofdc ofdh name tree)     (fclose ofdc)    (fclose ofdh)    )) (define (do_carttoC ofdc ofdh name tree)  "(do_carttoC ofdc ofdh name tree)Do the tree dump, this section is split off for cases when we want multiple trees in the same file."     (set! cart_name name)    (format ofdc "\n")    (format ofdc "static const cst_cart_node %s_cart_nodes[] = {\n" name)    (carttoC_tree_nodes tree ofdc ofdh)    (format ofdc "{ 255, CST_CART_OP_NONE, 0, 0}};\n\n")     ;; definitions are in the .h file    ;    (mapcar;     (lambda (f);       (format ofdc "%s" (caddr f)));     (reverse val_table))    (format ofdc "\n")     (format ofdc "static const char * const %s_feat_table[] = {\n" name)    (mapcar      (lambda (f)       (if (string-equal "string" (typeof (car f)))	   (format ofdc "%s,\n" (car f))	   (format ofdc "\"%s\",\n" (car f))))     (reverse feat_nums))    (format ofdc "NULL };\n\n")     (format ofdc "const cst_cart %s_cart = {\n" name)    (format ofdc "  %s_cart_nodes,\n" name)    (format ofdc "  %s_feat_table\n" name)    (format ofdc "};\n")     t) (defvar cart_operators  '(("is" "CST_CART_OP_IS")    ("in" "CST_CART_OP_IN")    ("<" "CST_CART_OP_LESS")    (">" "CST_CART_OP_GREATER")    ("matches" "CST_CART_OP_MATCHES")    ("=" "CST_CART_OP_EQUALS"))) (define (carttoC_feat_num f)  (let ((fn (assoc_string f feat_nums)))    (cond     (fn      (cadr fn))     (t      (set! feat_nums 	    (cons (list f (length feat_nums))		  feat_nums))      (carttoC_feat_num f))))) (define (carttoC_val_table ofdh f operator)  (let ((fn (if (number? f)                nil  ;; if its a number don't try to share it                (assoc_string                 (if (string-equal operator "is")                     (format nil "is_%s" f)                     f)                 val_table))))    (if (null val_table)        (begin          (set! val_table_length 0)          (set! val_table (cons (list "_xxx" "_xxx" nil)))))    (cond     (fn;      (format t "awb_debug reused_val %l\n" fn)      (cadr fn))     (t      (let ((nname (format nil "val_%04d" val_table_length)))        (set! val_table_length (+ 1 val_table_length))        (set! val_table_key              (if (string-equal operator "is")                  (format nil "is_%s" f)                  f));	(format ofdh "static const cst_val %s;\n" nname)        (cond         ((string-equal operator "is")          (set! val_table                (cons (list val_table_key nname          (format ofdh "DEF_STATIC_CONST_VAL_STRING(%s,\"%s\");\n"                  nname f))                      val_table)))         ((string-equal "matches" operator)          (set! val_table                (cons (list val_table_key nname          (format ofdh "DEF_STATIC_CONST_VAL_INT(%s,CST_RX_%s_NUM);\n"                  nname f))                      val_table)))         ((number? f)          (format ofdh "DEF_STATIC_CONST_VAL_FLOAT(%s,%f);\n"                  nname f))         ((consp f)          (format stderr "list vals not supported here yet\n")          (error f))         (t          (set! val_table                (cons (list val_table_key nname          (format ofdh "DEF_STATIC_CONST_VAL_STRING(%s,\"%s\");\n"                  nname f))                      val_table))));        (format t "awb_debug new_val %l\n" (car val_table))        nname        ))))) (define (carttoC_tree_nodes tree ofdc ofdh)  "(carttoC_tree_nodes tree ofdc ofdh)Dump the nodes in the tree."  (let ((this_node (set! current_node (+ 1 current_node))))    (cond     ((cdr tree) ;; a question node      (format ofdc "{ %d, %s, %s, (cst_val *)&%s},\n"	      (carttoC_feat_num (caar tree))  ;; the feature	      (cadr (assoc_string             ;; operator		     (cadr (car tree))		     cart_operators))	      (format nil "CTNODE_%s_NO_%04d" cart_name this_node); the no node	      (carttoC_val_table ofdh 				 (nth 2 (car tree)) 				 (cadr (car tree))))      (carttoC_tree_nodes (car (cdr tree)) ofdc ofdh)      (format ofdh "#define CTNODE_%s_NO_%04d %d\n" cart_name	      this_node (+ 1 current_node))      (carttoC_tree_nodes (car (cdr (cdr tree))) ofdc ofdh))     (t  ;; a leaf node      (format ofdc	      "{ 255, CST_CART_OP_NONE, 0, (cst_val *)&%s },\n"	      (carttoC_extract_answer ofdh tree)))))) (define (carttoC_extract_answer ofdh tree)  "(carttoC_extract_answer tree)Get answer from leaf node.  (this can be redefined if you want differentbehaviour)."  (carttoC_val_table ofdh 		     (car (last (car tree)))		     'none))(set! basic_carttoC_extract_answer carttoC_extract_answer) (provide 'make_cart)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t