2012-01-22 2 views
3

을 토큰으로 연산자를 인식 나는 토큰 +, <는 =렉스 - 나는 렉스와 거북이의 언어를 배우고 일하고

내가 그들을 파일 에 저장 한 내가 가지고 렉스는 연산자를 인식 얻는 데 문제가 이런 식

\+ or "+" or '+' or [+] 

나는 작은 따옴표를 사용하여 오류를 얻을하지 않습니다하지만이 중 하나를 일치 나던 또는 내가 파일에 그렇게해야 일을하려고?

여기 내 파일

fd 3x00 
bk 
setc 100 
int xy3 fd 10 rt 90 
rt 
lt 
setxy 
setx 
sety 
home 
seth 
pd 
pu 
ht 
st 
color 
xcor 
ycor 
heading 
random 
:= 
+ 
< 

이며, 여기

%{ 

#include <stdio.h> 
#include <stdlib.h> 
int number; 

%} 
%% 

fd     {printf("Keyword %s\n", yytext);} 
[^\t\n\r]    {} 
[0-9]+[a-z]+[0-9]+ {printf("Illegal: 3x00\n");} 
[\r\t\n]+    {} 
bk     {printf("Keyword: %s\n", yytext);} 
setc     {printf("Keyword: %s\n", yytext);} 
[0-9]+    {printf("Number: %s\n", yytext);} 

int     {printf(" Keyword: %s\n", yytext);} 
xy3     {printf("ID: %s\n", yytext);} 
fd[0-9]+    {printf("Keyword: %s\n", yytext); 
        printf("Number %s\n", yytext);} 
rt     {printf("Keyword: %s\n", yytext);} 
lt     {printf("Keyword: %s\n",yytext);} 
setxy     {printf("Keyword: %s\n", yytext);} 
setx     {printf("Keyword: %s\n", yytext);} 
sety     {printf("Keyword: %s\n", yytext);} 
home     {printf("Keyword: %s\n", yytext);} 
seth     {printf("Keyword: %s\n", yytext);} 
pd     {printf("Keyword: %s\n", yytext);} 
pu     {printf("Keyword: %s\n", yytext);} 
ht     {printf("Keyword: %s\n", yytext);} 
st     {printf("Keyword: %s\n", yytext);} 
color     {printf("Keyword: %s\n", yytext);} 
xcor     {printf("Keyword: %s\n", yytext);} 
ycor     {printf("Keyword: %s\n", yytext);} 
heading    {printf("Keyword: %s\n", yytext);} 
random    {printf("Keyword: %s\n", yytext);} 
:=     {printf("Keyword: =\n" );} 
\+     {printf("Keyword: + \n");} 
\<      {printf("Keyword: < \n");} 
%% 

main(int argc,char** argv) 

{ 
    if(argc > 1) 
    { 

     FILE *file; 
     file = fopen(argv[1], "r"); 
     if(!file) 
     { 
      fprintf(stderr, "Could not open %s \n", argv[1]); 
      exit(1); 
      } 

      yyin = file; 

      } 

      yylex(); 

} 

은 내가 경고한다 얻을 오류가 규칙을 일치시킬 수없는 프로그램을이다.

내가 뭘 잘못하고 있니?

당신에게

+0

무슨 규칙이 일치 할 수 없습니까? – Kevin

+0

내가 사용하고있는 라인은 \ + 또한 DOT를 사용하여 다른 모든 것을 찾았고 같은 오류가 발생했습니다 –

답변

1

감사 나는

[^\t\n\r]    {} 
... 
[\r\t\n]+    {} 
... 
\+     {printf("Keyword: + \n");} 
\<      {printf("Keyword: < \n");} 

+< 문자가 상위 규칙 ([^\t\n\r])과 \+/\< 규칙을 모두 일치 문제를 볼 생각합니다. 길이가 같기 때문에 렉서는 첫 번째 일치 인 [^\t\n\r]을 가져 오므로 아무 것도 수행하지 않고 ({}) \+/\< 규칙과 일치 할 수 없습니다. [^\t\n\r] 규칙을 제거하고 토큰 목록의 맨 끝에있는 . {}으로 바꿉니다.

+1

고맙습니다 !!!!!!! 이제 작동합니다. 그. 그 밖의 모든 것들을 포착하고 추가 연산자가 awesome kevin과 일치합니다. 다시 고마워. 너 엉덩이 걷어차. =). –

관련 문제