나는 다음과 같은 명령문이 포함된 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.c
flex를 실행하면 다음과 같은 줄이 표시됩니다 .
#define INITIAL 0
#define PROGRAM 1
#define COMMENT 2
#define WHATEVER 3
예를 들어, 표면적인 프로그래머는 하드코딩하기로 결정했습니다.1
기호를 사용하는 대신.