2014-05-13 2 views
4

아래의 코드 스 니펫은 http://zaach.github.io/jison/demos/calc/ 및 jison 문서 페이지에서 찾을 수 있습니다. jison, lex 및 flex 설명서를 읽은 후에도 % lex 및/lex 구문을 완전히 이해하지 못했습니다. Jison 스캐너 생성기에만 해당되는가요? 의미는 나중에 설명서에 표시된 json 출력을 제공하는 유일한 기능입니까? 나는 jison 문서가 명시 적으로 그 목적을 설명하지 않고 flex/lex 규칙이 그런 구문을 허용하지 않는 것 때문에 만 묻습니다.jison의 % lex 및/lex 행은 무엇입니까?

/* description: Parses end executes mathematical expressions. */ 

/* lexical grammar */ 
%lex 

%% 
\s+     /* skip whitespace */ 
[0-9]+("."[0-9]+)?\b return 'NUMBER'; 
"*"     return '*'; 
"/"     return '/'; 
"-"     return '-'; 
"+"     return '+'; 
"^"     return '^'; 
"("     return '('; 
")"     return ')'; 
"PI"     return 'PI'; 
"E"     return 'E'; 
<<EOF>>    return 'EOF'; 

/lex 

답변

4

%lex/lex 마커 만 스캐너 발생기 관련된 문법 섹션을 구분. %lex 마커는 시작을 표시하고 /lex 마침을 표시합니다.

bison 등을 사용하여 flex 당신이 .y 파일에 .l 파일과 문법에 렉서의 정의 (Jison 말투에서 "스캐너 발생")를 넣어 것입니다. 나는 bisonflex (또는 yacc/lex)을 사용하여 두 파일을 결합하는 방법이 존재하지 않는다고 생각합니다. (나는 bison 사용했습니다 및 flex 그래서 내가 모르는 뭔가가 있다는 불가능하지 않기 때문에 동안 그것은 매우 긴했다.)

사실은 Jison가 bisonflex에서 영감을 소요하지만, 그것이이다 정말 독립적 인 도구. 따라서 bison 또는 flex에는 해당 기능이없는 기능이 포함됩니다.