我目前正在编写拼音解析器。为了避免误解:我的意思是一个能够识别有效拼音音节的解析器。
我有一个解析整个拼音标记的工作解决方案。但是我想扩展它以在键入时产生自动完成,特别是在更正时,这种方法并不能证明是正确的设计。
因此,我生成了一个带有所有有效序列的 json 对象形式的 Parsetree:
{ 'm':{'i':{'o'{'n',...}, 'u':{},...}, 'a': {...}, ...
'p':{'i':{'u'},....
通过这个查找单个字符可以进行。例如来自输入字段的 ON_KEY_DOWN 事件。
var LocalTree = GlobalParseTree;
function parse(inputChar){
var NewLocalTree = LocalTree[inputChar];
if (NewLocalTree === undefined){
return -1; // invalid input
}
if (NewLocalTree === {}){
return 0; // we have reached the end of the branch, parsing complete.
}
LocalTree = NewLocalTree;
return 1; // a successfull parsing step has been made
}
在退格输入后,我现在可以取较短的值并从 GlobalParseTree 开始再次重新解析它,或者我可以将 LocalTrees 存储在一个数组中并 .pop() 以恢复解析器的上下文。两者都会起作用。
但是,我想递归地执行它并利用每个递归的调用范围作为解析器的上下文堆栈,这样当进行更正时,只需要返回最后一个递归,而 parseTree 的其余部分不需要重建.
但是我不知道如何使递归与正在进行的输入一起工作,因为在上面的代码中,使用输入调用函数会触发下一次递归(目前还没有)。
感谢您的回答。即使说,输入触发的递归也是不可能的。