lex 시작 조건

lex 시작 조건

나는 다음과 같은 명령문이 포함된 40년 된 lex 프로그램을 사용하고 있습니다.

  BEGIN PROGRAM + 1;

내가 무엇을 이해합니까?

BEGIN PROGRAM

그건 사실인데, 이것의 목적은 무엇입니까 + 1? 컨텍스트의 첫 번째 규칙을 건너뛸까요 <PROGRAM>? 생성된 코드에서는 그렇지 않은 것으로 제안하지만 아직 조사해 보지 않았습니다. context 뒤에 나열된 컨텍스트를 선택합니까 <PROGRAM>? 이것이 더 합리적으로 보이지만 테스트 lex 프로그램은 이러한 의도를 지원하지 않습니다(아마도 테스트 프로그램이 잘못 작성되었을 수 있습니다). 저는 40년 된 lex 버전이 아닌 flex를 사용하고 있습니다.

완전성을 위해 테스트 프로그램은 다음과 같습니다.

$ cat t.lex 
%s A B C

%%
                BEGIN A;

<A>[BC]         if (yytext[0] == 'B') BEGIN B + 1; else BEGIN C;
<A>.            printf("A: '%c'\n", yytext[0]);

<B>[AC]         if (yytext[0] == 'A') BEGIN A; else BEGIN C;
<B>.            printf("B: '%c'\n", yytext[0]);

<C>[AB]         if (yytext[0] == 'A') BEGIN A; else BEGIN B;
<C>.            printf("C: '%c'\n", yytext[0]);

%%

main() { yylex(); }

$ echo abcBabc | ./a.out 
A: 'a'
A: 'b'
A: 'c'
B: 'a'
B: 'b'
B: 'c'

$

답변1

lex 프로그램에서 다음을 가질 수 있습니다.시작 조건, 그들은 다음과 같이 정의됩니다.%s다음과 같은 지시어:

%s PROGRAM COMMENT WHATEVER

그런 다음 사용BEGIN매크로. 빠른 확인을 위해 flex에는 1부터 시작하는 연속된 숫자가 있습니다.INITIAL상태는0).

lex.yy.cflex를 실행하면 다음과 같은 줄이 표시됩니다 .

#define INITIAL 0
#define PROGRAM 1
#define COMMENT 2
#define WHATEVER 3

예를 들어, 표면적인 프로그래머는 하드코딩하기로 결정했습니다.1기호를 사용하는 대신.

관련 정보