better function, with less noisy trees
This commit is contained in:
parent
145a35c008
commit
2a5a085f9d
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,4 @@
|
|||||||
*.png
|
*.png
|
||||||
|
*.dot
|
||||||
|
*.svg
|
||||||
phonetics-feature-tree
|
phonetics-feature-tree
|
||||||
|
@ -1,126 +1,120 @@
|
|||||||
(define (left-child tree)
|
(define test-tree
|
||||||
(cadr tree))
|
'("1"
|
||||||
(define (left-child-name tree)
|
("1-1"
|
||||||
(car (left-child tree)))
|
("1-1-1"
|
||||||
(define (right-child tree)
|
("1-1-1-1")
|
||||||
(caddr tree))
|
("1-1-1-2"))
|
||||||
(define (right-child-name tree)
|
("1-1-2"
|
||||||
(car (right-child tree)))
|
("1-1-2-1"
|
||||||
(define (cur-name tree)
|
("1-1-2-1-1")
|
||||||
(car tree))
|
("1-1-2-1-2")
|
||||||
|
("1-1-2-1-3")
|
||||||
|
("1-1-2-1-4")))
|
||||||
|
("1-1-3"
|
||||||
|
("1-1-3-1"
|
||||||
|
("1-1-3-1-1")
|
||||||
|
("1-1-3-1-2"))))))
|
||||||
|
|
||||||
(define (to-string phon-tree node-nbr child next-nbr)
|
(define (declare-node node-text node-generation)
|
||||||
(let ((this-name (string-append "node"
|
(string-append ;; "node"
|
||||||
(number->string node-nbr)))
|
(number->string node-generation)
|
||||||
(child-name (string-append "node"
|
"[label=\""
|
||||||
(number->string next-nbr))))
|
node-text
|
||||||
(string-append child-name
|
"\"];\n"))
|
||||||
"[label=\""
|
|
||||||
(cur-name child)
|
|
||||||
"\"];"
|
|
||||||
this-name
|
|
||||||
"--"
|
|
||||||
child-name
|
|
||||||
";\n"
|
|
||||||
(to-dot-main child next-nbr))))
|
|
||||||
|
|
||||||
(define (to-dot-main phon-tree node-nbr)
|
(define (make-link previous-node current-node)
|
||||||
(let* ((this-name (string-append (number->string node-nbr)
|
(string-append ;; "node"
|
||||||
"node")))
|
(number->string previous-node)
|
||||||
(if (null? (left-child phon-tree))
|
" -- "
|
||||||
""
|
;; "node"
|
||||||
(let ((x (* 2 (+ 1 node-nbr)))
|
(number->string current-node)
|
||||||
(y (* 2 (+ 2 node-nbr))))
|
";\n"))
|
||||||
(string-append (to-string phon-tree node-nbr
|
|
||||||
(left-child phon-tree)
|
|
||||||
x)
|
|
||||||
(to-string phon-tree node-nbr
|
|
||||||
(right-child phon-tree)
|
|
||||||
y))))))
|
|
||||||
|
|
||||||
(define (to-dot phon-tree)
|
(define (tree-to-dot-helper tree current-generation previous-generation)
|
||||||
(if (null? phon-tree)
|
;; Helper to ~tree-to-dot~ that translates a Scheme tree with any number of
|
||||||
"\n"
|
;; children per node to a corresponding graphviz file that can be executed from
|
||||||
|
;; dot.
|
||||||
|
;; Arguments:
|
||||||
|
;; - tree :: tree to convert
|
||||||
|
;; - current-generation :: Generation number, incremented when changing from a node
|
||||||
|
;; to another node from the same generation, multiplied by 10 when going from
|
||||||
|
;; a node to one of its children.
|
||||||
|
;; - previous-generation :: Generation number from previous named node
|
||||||
|
(cond ((null? tree) "")
|
||||||
|
((atom? (car tree)) ;; '("text" () () ())
|
||||||
|
(string-append (declare-node (car tree) current-generation)
|
||||||
|
(make-link previous-generation current-generation)
|
||||||
|
(tree-to-dot-helper (cdr tree)
|
||||||
|
(+ 1 (* 10 current-generation))
|
||||||
|
current-generation)))
|
||||||
|
((list? (car tree)) ;; '(() () () ())
|
||||||
|
(string-append (tree-to-dot-helper (car tree) ;; child of current node
|
||||||
|
current-generation
|
||||||
|
previous-generation)
|
||||||
|
(tree-to-dot-helper (cdr tree) ;; sibling of current node
|
||||||
|
(+ 1 current-generation)
|
||||||
|
previous-generation)))))
|
||||||
|
|
||||||
|
(define (tree-to-dot tree)
|
||||||
|
;; Returns a graphviz’s dot-compatible string representing a Scheme tree
|
||||||
|
(if (null? tree) ""
|
||||||
(string-append
|
(string-append
|
||||||
"graph{\n"
|
"graph{node[shape=plaintext];graph[bgcolor=\"transparent\"];\n"
|
||||||
"node[shape=plaintext];\n"
|
(declare-node (car tree) 0)
|
||||||
"graph[bgcolor=\"transparent\"];\n"
|
(tree-to-dot-helper (cdr tree) 1 0)
|
||||||
"node1[label=\""
|
|
||||||
(cur-name phon-tree)
|
|
||||||
"\"];\n"
|
|
||||||
|
|
||||||
(to-dot-main phon-tree 1)
|
|
||||||
"}")))
|
"}")))
|
||||||
|
|
||||||
(define vowel-tree
|
(define vowel-tree
|
||||||
'("[vowel]"
|
|
||||||
("[back]"
|
|
||||||
("[tense]" () ())
|
|
||||||
("{tense}" () ()))
|
|
||||||
("{back}"
|
|
||||||
("[rnd]"
|
|
||||||
("[tense]" () ())
|
|
||||||
("{tense}"
|
|
||||||
("[high]" ())
|
|
||||||
("{high}" ())))
|
|
||||||
("{rnd}"
|
|
||||||
("[tense]"
|
|
||||||
("[high]" () ())
|
|
||||||
("{high}" () ()))
|
|
||||||
("{tense}"
|
|
||||||
("[low]" () ())
|
|
||||||
("{low}" () ()))))))
|
|
||||||
(define vowel2-tree
|
|
||||||
'("[vowel]"
|
'("[vowel]"
|
||||||
("[back]"
|
("[back]"
|
||||||
("[tense]"
|
("[tense]"
|
||||||
("[high]" () ())
|
("[high]")
|
||||||
("{high}" () ()))
|
("{high}"))
|
||||||
("{tense}"
|
("{tense}"
|
||||||
("[high]" () ())
|
("[high]")
|
||||||
("{high}" () ())))
|
("{high}")))
|
||||||
("{back}"
|
("{back}"
|
||||||
("[tense]"
|
("[tense]"
|
||||||
("[high]" () ())
|
("[high]")
|
||||||
("{high}" () ()))
|
("{high}"))
|
||||||
("{tense}"
|
("{tense}"
|
||||||
("[high]" () ())
|
("[high]")
|
||||||
("{high}" () ())))))
|
("{high}")))))
|
||||||
|
|
||||||
(define cons-tree
|
(define cons-tree
|
||||||
'("[cons]"
|
'("[cons]"
|
||||||
("[son]"
|
("[son]"
|
||||||
("[dor]"
|
("[dor]"
|
||||||
("[high]" () ())
|
("[high]")
|
||||||
("{high}" () ()))
|
("{high}"))
|
||||||
("{dor}"
|
("{dor}"
|
||||||
("[cor]" () ())
|
("[cor]")
|
||||||
("{cor}" () ())))
|
("{cor}")))
|
||||||
("{son}"
|
("{son}"
|
||||||
("[dor]"
|
("[dor]"
|
||||||
("[voice]"
|
("[voice]"
|
||||||
("[high]" () ())
|
("[high]")
|
||||||
("{high}" () ()))
|
("{high}"))
|
||||||
("{voice}"
|
("{voice}"
|
||||||
("[high]" () ())
|
("[high]")
|
||||||
("{high}" () ())))
|
("{high}")))
|
||||||
("{dor}"
|
("{dor}"
|
||||||
("[voice]"
|
("[voice]"
|
||||||
("[cor]" () ())
|
("[cor]")
|
||||||
("{cor}" () ()))
|
("{cor}"))
|
||||||
("{voice}"
|
("{voice}"
|
||||||
("[cor]" () ())
|
("[cor]")
|
||||||
("{cor}" () ()))))))
|
("{cor}"))))))
|
||||||
|
|
||||||
(define verbs
|
(define verbs
|
||||||
'("[verbs]"
|
'("[verbs]"
|
||||||
("[réel]"
|
("[réel]"
|
||||||
("[passé]" () ())
|
("[passé]")
|
||||||
("{passé}" () ()))
|
("{passé}"))
|
||||||
("{réel}"
|
("{réel}"
|
||||||
("[optatif]" () ())
|
("[optatif]")
|
||||||
("{optatif}"
|
("{optatif}"
|
||||||
("[passé]" () ())
|
("[passé]")
|
||||||
("{passé}" () ())))))
|
("{passé}")))))
|
||||||
|
|
||||||
(display (to-dot verbs)) (newline)
|
(display (tree-to-dot vowel-tree))
|
||||||
|
Reference in New Issue
Block a user