Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tidy vs graphviz #2

Open
zxch3n opened this issue Jun 17, 2022 · 5 comments
Open

tidy vs graphviz #2

zxch3n opened this issue Jun 17, 2022 · 5 comments

Comments

@zxch3n
Copy link
Owner

zxch3n commented Jun 17, 2022

No description provided.

@krishna116
Copy link

zxch3n,你好,最近我需要构造一些语法树,我希望可以找到一个好用的可视化工具,图形化输出语法树以便观察,然后我通过搜索定位到了这里。
大约在一年前,我设计了一个能以图形化输出二叉树的小工具(https://github.com/krishna116/bitreeviz),并能保存为pdf文件,里面内嵌了一个微型的类似graphviz的描述语法,这使它能够输出不同样式的二叉树。之所以设计这么一个工具是发现graphviz描述二叉树比较麻烦(官方给出的画二叉树的方法是引入一些虚结点),而且有时候画出的二叉树不够美观。我设计的这个工具只是一次尝试,仍然还有很多不足例如:软件架构不够满意,代码不够整洁简练,接受输入的字符集范围太小,只能接受限定的语法(希望可以接受一定的json和xml以方便与其它工具对接),只能画二叉树(希望能画多叉树),样式还不够丰富等等。
我本来有一个想法重新设计第二版的工具,以便补充那些不足之处,但发现你实现的多叉树已经做的很好了,但我不会你的语言栈,不知道未来会不会提供一些方便的用户接口?
谢谢。

@zxch3n
Copy link
Owner Author

zxch3n commented Jun 17, 2022

@krishna116 Hi, 这个库之后会被发布到 Crates.io,但我发现你的项目是 C++ 的,我对 C++ 调用 Rust 的操作没有什么经验,不清楚在 lib 这里需要什么处理才会比较方便被集成。如果我提供一个 CLI 能满足你的需求吗?

@krishna116
Copy link

krishna116 commented Jun 18, 2022

图形化的工具,互相合作不一定需要懂双方的语言,通过中立的图形格式类似于Graph Modeling Language (GML)又或者GraphML(http://graphml.graphdrawing.org/)交换信息即可。只是我研究和尝试了一下GML和GraphML,它们适合描述graph,但不适合描述tree,特别不适合描述syntax/grammar tree,因为它们不能描述兄弟结点之间的偏序关系,这导致例如两个兄弟结点a和b,如果不明确分配坐标,则有时候a在b的左边,有时候a在b的右边。

关于tree的描述方法,我设想了两种方案。
第一种方案是自定义语法,平坦化的表达,比较简洁。但需要手动解析。

root = (a, b, c)
a = (1,2)
b = (3,4,5)
c = (6)

第二种方案是利用现成的json格式,嵌套表达,不必手动解析,因为存在很多json library可以调用。

{
    "root":
    [
        "a":["1", "2"],
        "b":["3", "4", "5"],
        "c":["6"]
    ]
}

如果能提供一个CLI是可以的,例如用户也不需要懂C++也能使用我的bitreeviz,因为我也提供了可执行的cli,你可以下载尝试(我有提供编译成品)。如果你设计CLI,不知道你会设定什么样的功能,会不会负责渲染,但希望至少可以导出每个结点的坐标,假如我给出上面任选一种方案的描述,你可以输出结点坐标,举例:

root[50.00, 0.00]
a[20.00,0.00]
b[20.00,50.00]
c[20.00,100.00]
1[40.00,0.00]
2[40.00,20.00]
3[40.00,40.00]
4[40.00,60.00]
5[40.00,80.00]
6[40.00,100.00]

谢谢。

@krishna116
Copy link

又或者CLI如果能够输出这种GML(Graph Modeling Language)格式的文本文件:

graph
[
	directed	1
	node
	[
		id	            0
		label	        "root"
		graphics        [ x    65.0    y	15.0    w	30.0    h	30.0 ]
		LabelGraphics   [ text	"root" ]
	]
	node
	[
		id	            1
		label	        "b"
		graphics        [ x	    65.0    y	86.0    w	30.0    h	30.0 ]
        LabelGraphics   [ text	"b" ]
	]
	node
	[
		id	            2
		label	        "c"
		graphics        [ x	    115.0   y	86.0    w	30.0    h	30.0 ]
		LabelGraphics   [ text	"c" ]
	]
	node
	[
        id	            3
		label	        "a"
		graphics        [ x	    15.0    y	86.0    w	30.0    h	30.0 ]
		LabelGraphics   [ text	"a" ]
	]
	edge [ source	0   target	1 ]
	edge [ source	0   target	2 ]
	edge [ source	0   target	3 ]
]

则可以直接被yEd这种支持GML的工具渲染:
image
谢谢。

@zxch3n
Copy link
Owner Author

zxch3n commented Jun 18, 2022

了解了。感谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants