如果标题不够清晰,我很乐意进行分析和解析。如何用Jison词法分析器返回多个标记
基本上,我使用Jison来解析一些文本,我试图让词法分析器理解缩进。这里是有问题的位:
(\r\n|\r|\n)+\s* %{
parser.indentCount = parser.indentCount || [0];
var indentation = yytext.replace(/^(\r\n|\r|\n)+/, '').length;
if (indentation > parser.indentCount[0]) {
parser.indentCount.unshift(indentation);
return 'INDENT';
}
var tokens = [];
while (indentation < parser.indentCount[0]) {
tokens.push('DEDENT');
parser.indentCount.shift();
}
if (tokens.length) {
return tokens;
}
if (!indentation.length) {
return 'NEWLINE';
}
%}
到目前为止,几乎所有这些按预期工作。一个问题是我尝试返回一个DEDENT
标记数组的行。看来,Jison只是将该数组转换为一个字符串,导致我得到一个解析错误,如Expecting ........, got DEDENT,DEDENT
。
我希望我能做些什么来解决这个问题是手动将一些DEDENT
标记推入堆栈。也许有像this.pushToken('DEDENT')
或类似的功能。但是Jison文档不是很好,我可以使用一些帮助。
有什么想法?
编辑:
我似乎已经能够看生成的解析器代码后砍解决此我的路。这里是什么似乎工作...
if (tokens.length) {
var args = arguments;
tokens.slice(1).forEach(function() {
lexer.performAction.apply(this, args);
}.bind(this));
return 'DEDENT';
}
这招数词法到执行使用每个DEDENT
我们在堆栈中的完全相同的输入另一个动作,从而使其能够在适当的dedents添加。然而,感觉很糟糕,我担心可能会有不可预见的问题。
如果有人有更好的方法来做到这一点,我仍然会喜欢它。