Jison을 사용하는 블록에 대해 파이썬과 같은 들여 쓰기를 구문 분석하는 문법을 정의하는 방법에 대한 간단한 예제가 있습니까?블록 구조에 들여 쓰기를 사용하는 Jison 문법의 예를 찾으십시오.
답변
나는 python-style indentation을 사용하는 Jison을 사용하여 언어를 만들었습니다. Bianca이라는 자동화 된 화이트 박스 알고리즘 테스트 언어입니다.
비앙카에는 2 개의 종속성 만 있습니다. 하나는 Jison이고 다른 하나는 Lexer입니다. Jison은 custom scanners을 지원하고 Lexer는 그러한 스캐너 중 하나입니다.
C 스타일 프로그래밍 언어에서 코드 블록은 중괄호로 구분됩니다. 그러나 파이썬 스타일 들여 쓰기에서는 INDENT
과 DEDENT
토큰이 있습니다.
Lexer에서 INDENT
및 DEDENT
토큰을 생성하는 규칙을 작성하는 것이 뇌사로 간단합니다. 실제로 Lexer 설명서에는 정확하게 수행하는 방법이 나와 있습니다.
이 코드 조각은 비앙카의 소스 코드 (lexer.js)에서 직접 가져온 것입니다
var indent = [0];
lexer.addRule(/^ */gm, function (lexeme) {
var indentation = lexeme.length;
col += indentation;
if (indentation > indent[0]) {
indent.unshift(indentation);
return "INDENT";
}
var tokens = [];
while (indentation < indent[0]) {
tokens.push("DEDENT");
indent.shift();
}
if (tokens.length) return tokens;
});
이 코드는 파이썬 문서에서 찾을 수 있습니다 작동하는 방법에 대한 간략한 설명 :
파일의 첫 번째 행을 읽기 전에 스택에 단일 0을 푸시합니다. 이것은 결코 다시는 나타나지 않을 것입니다. 스택에 푸시 된 숫자는 항상 맨 아래에서 맨 위로 엄격하게 증가합니다. 각 논리적 라인의 시작 부분에서 라인의 들여 쓰기 레벨이 스택 맨과 비교됩니다. 동일하면 아무 일도 일어나지 않습니다. 크기가 클 경우 스택에 푸시되고
INDENT
토큰이 생성됩니다. 크기가 더 작은 경우 은 스택에서 발생하는 숫자 중 하나가되어야이되어야합니다. 더 큰 스택의 모든 숫자가 튀어 나오고 튀어 나온 각 숫자에 대해DEDENT
토큰이 생성됩니다. 파일의 끝에서 0보다 큰 스택에 남아있는 각 숫자에 대해DEDENT
토큰이 생성됩니다.
나는 Jison이 시작을 위해 ^를 사용할 수 없다고 생각했다. jisonfile에 규칙을 추가하고이를 어휘 관련 항목을 얻는 데 사용할 수있는 것 같습니다. –
표준 lex 파일로 어떻게 이것을합니까? col이란 무엇입니까? 나는 (이) 규칙에 로그하고 모든 가치가 나온 것을 알아 내려고 노력하고있다. –
이 값들은 모두 [lexer.js] (https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js)에 정의되어 있습니다. –
안녕하세요! [이 질문 및 답변] (http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing) 많은 도움이됩니다. 나는 생각한다. –
감사합니다 ... – interstar
실제로 흥미 롭지 만 실제로 jison이 pyparsing과 동일한 기능을 가지고 있지는 않습니다. 아마도 실제로 질문에 대답하지 않습니다. – interstar