2017-12-27 3 views
0
"lexicale.l", line 13: unrecognized rule 
"lexicale.l", line 13: unrecognized rule 

라인 (13)은 다음과 같습니다내가 오류 인식 규칙에 대한 해결책을 찾을 수 없습니다

%{ 
    #include "stdio.h" 
    #include "stdlib.h" 
%} 
int [0-9]+ 
float [0-9]+("."[0-9]+)* 
bool 0 | 1 
idf [A-Z] ([0-9a-zA-Z] (_)? [0-9a-zA-Z]) {0,11} 
%% 
{int} {printf("int\n");} 
{float} {printf("float\n");} 
{bool} {printf("bool\n");} 
{idf} {printf("indetificateur\n");} 
.  {printf("erreur\n");} 

답변

1

(F) 렉스 패턴은 인용 부호로 둘러싸이지 않은 공백 문자를 포함 할 수 없습니다 .

bool 정의와 idf 정의에는 모두 공백이 포함되지 않습니다. 두 정의에서 공백을 제거해야합니다.

flex가 자체 입력 파일을 구문 분석하는 방식이 이상하므로 패턴 정의의 구문 오류에 대해보고 된 줄 번호가 정확하지 않습니다. 특히, 정의가 아닌 정의가 확장 될 때 오류가보고됩니다. 또한이 경우와 같이 오류는 종종 잘못된 정의를 확장 한 후 행에보고됩니다.

전체적으로 개인적으로 정의가 유용하지 않습니다. 대부분의 경우 (이 경우와 같은) 명백한 이점이 없으며 구현의 기이함으로 인해 혼란과 예기치 않은 결과가 발생할 수 있습니다.

당신이 플렉스 사용하고 있고 패턴에 공백을 사용하려는 경우, 당신은 "확장 구문"플래그 설정 (?x:…)와 패턴을 둘러싸고 수 있습니다 : 그런데

idf (?x: [A-Z] ([0-9a-zA-Z] (_)? [0-9a-zA-Z]) {0,11}) 

, 당신의 bool 패턴을 0 | 1 간단히 [01]으로 작성 될 수 있습니다. 그러나 int 규칙은 0 또는 1과 정확하게 일치하며 파일의 앞부분에 나타납니다. 규칙이 int과 일치하는 규칙보다 앞에 있지 않으면 아무 것도 인식하지 못합니다. (정의가 아닌 규칙의 순서입니다. 이는 불필요한 정의의 사용으로 인한 또 다른 혼동입니다.)

관련 문제