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