2014-03-27 7 views
0

정수 유형과 일치해야하지만 정수로만 분리해야합니다. 예 :한 문자열에서 일치하는 정수 Lex

INTEGER (-?[0-9]+) 
NOTENDLINE [^$] 
%% 
{INTEGER}/{NOTENDLINE}  {} 
%% 

"23test"와 같은 문자열을 입력하는 경우 잘못되었거나 정수가 일치하지 않아야합니다. 하지만 내 솔루션은 필요에 따라 작동하지 않습니다. 나도 몰라, 내가 필요로하는 것은 NOTENDLINE.

+0

부정 마진 문자 클래스 구문 ([^])을 사용하여 줄 끝 표시 ($)를 부정 할 수 없습니다. "정수로만 분리해야합니다."라고 쓰지만 규칙을 이해하지 못합니다. 정수 문자열을 따라갈 수있는 문자와 그렇지 못할 수있는 문자는 무엇입니까? –

+0

문자열은 "test 123test"와 같을 수 있습니다. 많은 토큰이 있지만 별도의 정수를 파싱해야합니다. "테스트 123"결과 정수 123, 예를 들어 정수가없는 경우. 문자열은 모든 문자로 구성되지만 받아들이 기 위해서는 integer가 적어도 공백이나 끝 문자로 구분되어야합니다. – freakz

답변

0

당신이이 공백 다음 경우에만, 그래서 직접 할 수 있지만 정수를 일치 시키려면 :

-?[[:digit:]]+/[[:space:]] 

il 정수가 개행 문자가없는 파일의 맨 끝에있는 경우 텍스트 파일은 개행 문자 이외의 문자로 끝나지 않습니다. 그러나 다음을 수행 할 수 있습니다.

-?[[:digit:]]+/[[:space:]] { /* Handle an integer */ } 
-?[[:digit:]]+/.    { /* Handle the error */ } 
-?[[:digit:]]+    { /* Handle an integer; this one must be at EOF */ } 
1

이 기능을 사용할 수 있습니까? 그것은 렉서가 가장 길게 매치 된 규칙을 찾을 것이라는 사실에 의존하지만, 두 개가 같은 경우 첫 번째 규칙이 사용됩니다.

%option noyywrap 
DIGIT [0-9] 
OTHER [a-z0-9]* 
%% 
{DIGIT}+  printf("Integer: %s (%d)\n", yytext, atoi(yytext)); 
{OTHER}   printf("Other: %s\n", yytext); 
[ \t\n]+  /* eat up whitespace */ 
%% 
int main(int argc, char **argv) 
{ 
     ++argv, --argc; /* skip over program name */ 
     if (argc > 0) 
       yyin = fopen(argv[0], "r"); 
     else 
       yyin = stdin; 
     yylex(); 
} 

샘플 입력 (파일) :

test 
test123 
123 
123test 

샘플 출력 상 :

Other: test 
Other: test123 
Integer: 123 (123) 
Other: 123test 
관련 문제