[CEDET-devel] Re: Regression Test Generic tag format
Brought to you by:
zappo
From: Klaus B. <kla...@sd...> - 2003-04-14 11:08:17
|
On 14 Apr 2003, Klaus Berndl wrote: > On Sat, 12 Apr 2003, Eric M. Ludlam wrote: > > > I've added two functions to the end of Klaus' new file > > `semantic-regtest.el'. These routines convert a semantic 2.0 tag > > into a "generic format", meaning the tags are good for comparing two > > parser outputs. The new tags format is: > > > > ("name" 'class :sym1 val1 :sym2 val2 ...) > > > > All "properties" are stripped since a grammar may change names of it's > > parser nodes. The overlay is stripped as well. > > > > In addition, the :symN symbols are all sorted in ascending order in > > case the order of those elements change from one parse to the next. > > This will ensure maximum flexibility. > > Thanks a lot, Eric! > > Nevertheless i have some questions: > 1. Does these function also print out the parents of a token, namely if the > token is a type - are the parents contained in the 2.0-attributes? > > 2. Does these functions print out the children of a token? > > I ask because i have made a first version for semantic 1.4: > [...] OK, here is the code for semantic 1.4 which returns a generic-tag-fomat like: (<tag-name> <tag-type> (<tag-parent-names>) (<tag-children-names>) sym1 val1 sym2 val2 ....) Thoughts? (defun semantic-regtest-tag-parent-names (parents) (if parents (let* ((parent (car parents)) (name (cond ((semantic-token-p parent) (semantic-token-name parent)) ((stringp parent) parent)))) (if name (cons name (semantic-regtest-tag-parent-names (cdr parents))) (if (listp parent) (append (semantic-regtest-tag-parent-names parent) (semantic-regtest-tag-parent-names (cdr parents)))))) (list nil))) (defun semantic-regtest-tag-children-names (children) (if (null children) (list nil) (mapcar (function (lambda (child) (semantic-token-name child))) children))) (defun semantic-regtest-convert-tag-table (table) "Convert the tag table TABLE to a generic format." (mapcar #'semantic-regtest-convert-tag table)) (defun semantic-regtest-convert-tag (tag) (let ((name (semantic-token-name tag)) (class (semantic-token-token tag)) (parents (cond ((equal (semantic-token-token tag) 'type) (semantic-regtest-tag-parent-names (semantic-token-type-parent tag))) ((equal (semantic-token-token tag) 'function) (list (semantic-token-function-parent tag))) (t (list nil)))) (children (semantic-regtest-tag-children-names (semantic-nonterminal-children tag))) (attr (semantic-token-extra-specs tag)) (generic nil)) (while attr ;; In semantic 1.4 the extra-specs is a list of cons-cells, where the ;; car is the symbol and the cdr is the value. (let ((sym (car (car attr))) (val (cdr (car attr)))) (cond ((semantic-token-p val) ;; This attribute is a tag (ie, a type perhaps?) (setq val (semantic-regtest-convert-tag val))) ((and (listp val) (semantic-token-p (car val))) ;; List of more tags in this property. Children/members (setq val (semantic-regtest-convert-tag-table val))) (t nil)) (setq generic (cons (list sym val) generic)) (setq attr (cdr attr)))) ;; At this point, generic is an ALIST, not a PROPERTY LIST. ;; We need to sort it so that order changes do not effect the ;; test. (setq generic (sort generic (lambda (a b) (string< (symbol-name (car a)) (symbol-name (car b)))))) (append (list name class parents children) (apply 'append generic)) )) Maybe we should sort the parents and children too?! Eric, if you find this senseful, could you please adjust your convert code for 2.0 so it return the same generic format?! Ciao, Klaus -- Klaus Berndl mailto: kla...@sd... sd&m AG http://www.sdm.de software design & management Thomas-Dehler-Str. 27, 81737 München, Germany Tel +49 89 63812-392, Fax -220 |