2017-09-10 1 views
0

lex (flex)에서 컨텍스트/모드 또는 "컨텍스트 스택"을 에뮬레이트하는 방법을 알아 내려고하고 있습니다.Lex 모드 또는 컨텍스트 스택을 에뮬레이트하는 방법

특히, 표현식 -y 컨텍스트로 되돌릴 수있는 문자열 리터럴이라는 개념이있는 파서를 작성하고 싶습니다.

구문 '...'을 사용하여 원시 문자열 리터럴을 지원하는 간단한 문법이 있으며 문자열을 발견하면 문자열을 인쇄합니다.

그러나 문자열 토큰은 잠재적으로 길이가 제한이 없습니다 (생성 된 C 소스의 일부 매크로에서 정의 된 lex의 최대 버퍼 크기까지).

begin_string 토큰 'end_string 토큰 '을 정의하고 문자열 내부에서 문자를 읽기위한 토큰을 정의하려고합니다.

"지금 나는 문자열에 있습니다"라는 문맥의 개념을 갖고 어떤 토큰 화 규칙이 "활성"인지에 영향을주고 싶습니다.

다음은 문맥에 대한 순진 문법입니다.

%{ 

#include <stdio.h> 

%} 

%option noyywrap 

%% 

'[^']*' { printf("found string literal ((%s))\n", yytext); } 

\n { /* do nothing */ } 
. { /* do nothing */ } 

%% 

int main() 
{ 
    yylex(); 
    return 0; 
} 
+1

[시작 조건] (http://westes.github.io/flex/manual/Start-Conditions.html)을 보았습니까? 내가 귀하의 질문을 이해한다면, 그것이 당신이 찾고있는 것입니다 (귀하의 필요를 완전히 이해하지 못했을 수도 있음). flex를 사용하는 경우에는 토큰에 임의의 제한이 없습니다. malloc이 더 많은 공간을 제공하기를 거부 할 때까지 버퍼가 확장됩니다. – rici

답변

1

귀하의 요구 사항을 올바르게 이해하면 해당 기능은 start conditions과 함께 제공됩니다. 설명서에서 설명하는 것처럼 시작 조건은 일종의 상태이며 프로덕션 집합을 사용하거나 사용하지 않도록 설정할 수 있습니다.

%option nodefault 
%x IN_STRING 

%% 
/* Other patterns for regular tokens */ 
"'"    { BEGIN(IN_STRING); return BEGIN_STRING; } 
<IN_STRING>"'" { BEGIN(INITIAL); return END_STRING; } 
<IN_STRING>.|\n {     return STRING_CHAR; } 

플렉스는 선택적으로 당신이 밀어 스택에 현재 시작 상태를 팝업 할 수있는 기능을 사용하지만, 필요하지 않습니다이 간단한 경우 :

예를 들어, 당신은 할 수 있습니다. 이를 수행해야 할 경우, 프롤로그에 %option stack을 추가하고 위에 링크 된 시작 조건 장의 끝에있는 API의 설명을 읽으십시오.

관련 문제