2017-12-17 3 views
2

영문자를위한 어휘 분석기를 만들려고합니다. 규칙 중 하나는 식별자가 숫자로 시작할 수 없다는 사실을 말합니다. 다음은 숫자와 식별자를 정의하는 정규 표현식입니다. .lxi 파일에 정의 Flex가 이름 지정 식별자의 오류를 식별하는 데 작동하지 않습니다.

NUMBER [+-]?[0-9]+ 
ID [a-zA-Z][a-zA-Z0-9_]* 

및 규칙 : 입력 파일에 식별자 이름 지정 규칙을 존중하지 않는 토큰이있을 때

%% 
{DELIMITATOR} printf("Delimitator: %s\n",yytext); 
{NUMBER} printf("Number: %s\n",yytext); 
{ID} printf("Identifier: %s\n",yytext); 
. printf("Error: %s\n",yytext); 
%% 

이 문제가 나타납니다.

Number: 1; 
Identifier: abc; 

대신, 오류 메시지를 받고 싶습니다 : 예를 들어,

a := 1abc 

위해 나는 다음과 같은 결과를 얻을. 내가 할 수있는 일이 있습니까? 숫자를 정의 할 때 후행 컨텍스트를 사용하려고했지만 작동하지 않는 것 같습니다.

+0

수 없습니다. Flex는 존재하는 토큰을 정확하게 식별하고 그 토큰을 식별합니다. 불법 토큰에 대한 규칙을 작성할 수 없으며 원하지 않습니다. – EJP

답변

0

걱정하지 마십시오. 질문에 표시된 오류가 구문 수준 (bison, yacc 또는 유사)에서 감지되고 처리 /보고 될 것입니다.

그런데도 1abc과 같은 오류가 자주 발생하는 경우 flex 특정 규칙을 작성하여 신고하십시오. 예 :

[0-9][a-zA-Z_]+ fprintf(stderr, "invalid identifier '%s'\n",yytext); 
[a-zA-Z]{40,}  fprintf(stderr, "identifier to long '%s'\n",yytext); 
관련 문제