제목이 불명확하면 미안하고 렉싱 및 구문 분석을 처음 사용합니다.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';
}
이 트릭 렉서 따라서 적절한 dedents에 추가 할 수 있도록, 우리는 스택에있는 각 DEDENT
에 대한 정확한 동일한 입력을 사용하여 다른 작업을 수행하기에 ... 작동하는 것 같다거야. 그러나, 그것은 심한 느낌과 예기치 않은 문제가있을 수 있습니다 걱정입니다.
누구든지 더 좋은 방법으로이 작업을 수행 할 수 있다면 나는 그것을 좋아할 것입니다.