2009-03-24 2 views
0

내 프로그램에서 lex를 사용하고 있는데 도움이 필요한 문제가 발생했습니다.명령어가 lex에서 넘어지다

내 프로그램의 형태로 입력 [뭔가 받아 "뭔가를].이 제대로 작동됩니다.

을하지만, 나는 또한 양식 [뭔가에 동의해야"뭔가를].

모든 입력이 전처리와 같이 실행되는 lex에 일종의 정렬을 할 수있는 방법이 있습니까? 그런 다음 동일한 수정 된 입력을 나머지 프로그램에서 계속 수행 할 수 있습니까?

%% 
.* { 
    do preprocessing 
    } 

something{ 
    return SOMETHING; 
    } 

\" { 
    return QUOTE; 
    } 
%% 

답변

1

글쎄, 당신은 실제로 렉스의 전처리를 작성하고 빌드 시스템에 넣어 수 있지만 그게 전부 아마 과잉 : 여기

내가 무슨 말을하는지의 종류입니다!

시작 조건을 사용하여 BEGIN으로 전환하고 입력을 먼저 구문 분석 한 다음 unput을 사용하여 문자를 스트림으로 푸시 한 다음 다른 시작 조건을 사용하여 결과를 구문 분석 할 수 있습니다 (the Flex manual 참조).

저는 최근에 파이썬과 비슷한 구성 언어 용 파서를 작성했습니다. 파서는 두 가지 모드 (시작 조건)를 가지며, 하나는 범위를 결정하기 위해 라인의 시작에서 탭을 계산하고, 다른 하나는 실제 파싱을 수행합니다.

이러한 방법은 정상이지만 일반적으로 입력 방법이 상당히 복잡하지 않은 경우에는 더 좋은 방법이 있습니다.

귀하의 프로그램에 대해 [무언가]와 [무언가 [무언가]] 간에는 문법적인 차이가 있습니까? 공백을 먹는 규칙이 그 트릭을 수행할까요?

언어와 문법을 좀 더 자세히 설명해 주실 수 있습니까? ....? 설명 후

:

좋아, 그래서 기본적으로 두 개의 토큰을, 뭔가 및 견적있다. 토큰은 공백으로 구분하는 경우는 다음을 수행 할 수 있습니다 : 당신의 뭔가를

%% 
\"  { 
     //this will match a single quote 
     return QUOTE; 
     } 

[^" \t\n\r]+ { 
       //this will match a run of anything thats not a quote, space, tab or line ending 
       return SOMETHING; 
       } 

[ \t\n\r]  { 
       //do nothing: i.e. ignore whitespace 
       } 

%% 

당신은 또한 문자 나 0 개 이상의 문자 다음에 밑줄을 일치합니다 [A-Za-z_][A-Za-z0-9_]* 같은 일치 수있는 토큰, 밑줄 및 숫자 .

도움이 되었습니까?

+0

기본적으로 단어와 따옴표가 하나의 거대한 토큰이 아닌 별도의 토큰으로 인식되도록 공백을 추가해야합니다. – samoz

관련 문제