2014-12-18 2 views
1

을 사용하여 입력 파일을 토큰 화하여 결국 Bison을 사용하여 간단한 C 컴파일러를 만들 수 있습니다.C 식별자의 정규 표현식

그래서 나는 아직도 Flex와 장난 그리고 난 번호를 추출하고 식별자를 무시하기 위해 노력하고있어 및 공백

%{ 

#include "stdio.h" 

%} 

dgt [0-9] 
letter [A-Za-z] 
white [ \r\t]+ 
id {letter}({letter}|{dgt})* 
number {dgt}+ 

%% 
{number} return atoi(yytext); 
{id} { } 
{white} { } 

%% 

void main(){ 
    int val=0; 
    while((val=yylex())>0) 
    printf("You Entered %d\n",val); 
} 

여기서 문제는 이와 같은 입력 파일과 :

hello 123 test assadf507ascv 123asd 0 
내가 recog 할 필요

You Entered 123 
You Entered 123 

:

나는이 출력을 얻을 두 번째 출력은 유효하지 않은 식별자 인 123asd에서 나온 것입니다.

어디서 잘못 됐습니까? !! 사례를 명시 적으로 탐지하는 규칙을 만들어야합니까?

답변

3

전화 번호 정의는 단지 그들이 숫자가 아닌 문자로 연결된 경우에도 어디서든 자리 그룹과 일치하는 것 1 개 이상의 숫자를 찾고 있습니다. 의 정규식 상당이다

number {dgt}+ 

: 당신은 즉시 유효 숫자를 추출하는 숫자 문자 다음 원하지 않는 문자가 없는지 테스트 할 필요가 같은

[0-9]+ 

소리가 난다. 나쁜 조건을 명시 적으로 일치시키는 다른 규칙을 만들어서이 작업을 수행 했으므로 결과가 "숫자"로 무시됩니다.

예 : test.flex는 :

%{ 

#include "stdio.h" 

%} 

letter [A-Za-z] 
white [ \r\t]+ 
id {letter}({letter}|{dgt})* 
dgt [0-9] 
number {dgt}+ 
invalid [0-9]+[a-zA-Z_]+ 

%% 

{id} { } 
{white} { } 
{invalid} { } 
{number} return atoi(yytext); 

%% 

void main(){ 
    int val=0; 
    while((val=yylex())>0) 
    printf("You Entered %d\n",val); 
} 

당신은 당신이 숫자를 따라 원하지 않는 문자에 따라 invalid 정의의 두 번째 절반을 변경할 수 있습니다. 또한 invalid 규칙은 number 규칙 앞에 와야하므로 먼저 일치해야하며 잘못된 용어는 무시됩니다.

hello 123 test assadf507ascv 234asdf 456 0 
You Entered 123 
You Entered 456 

내가 그것을 얻을 Flex manual chapter on Patterns

+0

볼 수 있지만, 사용하는 이유는 후행? 그냥 연결하지 않는 이유는 무엇입니까? – Maverick

+0

아, 그래. 죄송합니다. 다른 규칙을 사용하지 않고 숫자 만 일치시키는 단일 규칙을 얻으려고 할 때 후행 맥락에서 놀고있었습니다. [0-9] +/[^ a-zA-Z_]와 같은 것입니다. 하지만 그 방법은 효과가 없었고 최종 솔루션을 위해 후행 할 필요가 없다는 사실을 잊어 버렸습니다. 답변이 업데이트되었습니다. –

+0

위대한, 나를 위해 일해도 고마워. – Maverick

0

나는 플렉스을 잘 모르겠지만, 아마도 당신이 시도 할 수 있습니다 :

dgt [0-9] 
letter [A-Za-z] 
white [ \r\t]+ 
id {letter}({letter}|{dgt})* 
number \b{dgt}+\b 

\b가 지원되는지 모르겠어요하지만 정규식은 "단어 경계"를 의미한다. 지원되지 않는 경우 다음을 시도해 볼 수도 있습니다.

number {white}{dgt}+{white} 

그러나이 방법은 줄의 시작 또는 끝에 나타나는 숫자를 캡처하지 않습니다. 아마도

number (^|{white}){dgt}+($|{white})