2013-02-10 5 views
6

Jison을 사용하는 블록에 대해 파이썬과 같은 들여 쓰기를 구문 분석하는 문법을 정의하는 방법에 대한 간단한 예제가 있습니까?블록 구조에 들여 쓰기를 사용하는 Jison 문법의 예를 찾으십시오.

+1

안녕하세요! [이 질문 및 답변] (http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing) 많은 도움이됩니다. 나는 생각한다. –

+1

감사합니다 ... – interstar

+0

실제로 흥미 롭지 만 실제로 jison이 pyparsing과 동일한 기능을 가지고 있지는 않습니다. 아마도 실제로 질문에 대답하지 않습니다. – interstar

답변

7

나는 python-style indentation을 사용하는 Jison을 사용하여 언어를 만들었습니다. Bianca이라는 자동화 된 화이트 박스 알고리즘 테스트 언어입니다.

비앙카에는 2 개의 종속성 만 있습니다. 하나는 Jison이고 다른 하나는 Lexer입니다. Jison은 custom scanners을 지원하고 Lexer는 그러한 스캐너 중 하나입니다.

C 스타일 프로그래밍 언어에서 코드 블록은 중괄호로 구분됩니다. 그러나 파이썬 스타일 들여 쓰기에서는 INDENTDEDENT 토큰이 있습니다.

Lexer에서 INDENTDEDENT 토큰을 생성하는 규칙을 작성하는 것이 뇌사로 간단합니다. 실제로 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 토큰이 생성됩니다.

+0

나는 Jison이 시작을 위해 ^를 사용할 수 없다고 생각했다. jisonfile에 규칙을 추가하고이를 어휘 관련 항목을 얻는 데 사용할 수있는 것 같습니다. –

+0

표준 lex 파일로 어떻게 이것을합니까? col이란 무엇입니까? 나는 (이) 규칙에 로그하고 모든 가치가 나온 것을 알아 내려고 노력하고있다. –

+0

이 값들은 모두 [lexer.js] (https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js)에 정의되어 있습니다. –