如果標題不夠清晰,我很樂意進行分析和解析。如何用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添加。然而,感覺很糟糕,我擔心可能會有不可預見的問題。
如果有人有更好的方法來做到這一點,我仍然會喜歡它。