- 论坛徽章:
- 5
|
本帖最后由 starwing83 于 2010-02-10 18:51 编辑
恩……没办法啊,现在就是带着镣铐在跳舞,心里想着这个用python写好简单,可是就是没办法……对了你会那些脚本语言?有个问题看看你用别的脚本语言怎么写~~~问题是这样的,给出一个字符串,要parse它。用C当然就是栈和getchar的事儿,但是如果你在脚本语言这么做,就会效率极其低下,目前用得是一个特别复杂的正则表达式加上split搞定的,不知道你有没有什么好办法……
语法是这样的:
template = meta*
meta = (/${(w+)?[?~]?\d+[:.*]}/ | /$\d+/ | /./ | /`.*`)
其中${}的表示形式要求支持递归,可以用反斜线来转义$和}。生成一颗tag树就可以了。并给出$\d+所在的位置和数字值。$\d+形式是一个placeholder,意思是它和对应的tag的文本要一样,`.*`是即时执行的代码,要包含在树里面
比如下面的template:
for (${1:i} = ${2:0}; ${31 <= ${4:len}}; ${5:++}$1)${?6:{${7:/* coding... */}\}}
要得到下面的结果:
[tag0 'for (', [tag1 'i'], ' = ', [tag2 '0], '; ', [tag3 [placeholder 1], ' <= ', [tag4 'len'], '; ', [tag5 '++'], [placeholder 1], ')', [hidetag6 '{', [tag 7 '/* coding,,,*/'], '}']]
上面的表示形式,内部怎么表示无所谓,只要能parse出一个程序能识别的结构就可以了。这个结构就是补全时动态操作的基本数据结构(目前用的是一颗多叉树,每个节点一个list保存children的index-node,然后由index保持位置信息,由index指向的entity保存id的顺序,文本,插入位置和内部包含的和需要维护的所有数据的index信息)。 |
|