2014-03-24 1 views
1

토큰을 "새 줄 시작을 제외한 모든 문자"와 같이 설정해야합니다. 나는 시험해 본다한 문자열에서만 시작 조건을 인식하십시오 lex

[^^] 

그러나 이것은 효과가 없다. 첫째, 나는 몇 가지 패턴 라인 감지해야합니다

%s arithm secOper 
NUMBER [0-9]+ 
INTEGER (-?[0-9]+) 
ASSIGN [=] 
VARY [A-Za-z][?-i:a-z0-9]{0,15} 
ARITHMSIGNS (\+[ ]*|\-[ ]*|\*[ ]*|\/[ ]*) 
SPACE [ ]+ 
SPACES [ ]* 
ANY [^^] 

%% 

^{NUMBER}{SPACES}{VARY}{SPACES}{ASSIGN}{SPACES}({VARY}|{INTEGER}) {BEGIN(arithm);} 
<arithm>{ANY}{SPACES}{ARITHMSIGNS}/({VARY}|{INTEGER}) {BEGIN(secOper);} 
<secOper>{VARY}|{INTEGER}$ {BEGIN(INITIAL);} 

%% 

그래서 문자열

54 firstVar = 43 * newVar 

같은 것은 정말 사실이지만, 입력 인 경우에

54 firstVar = 43 
* newVar 

(2 문자열 C와 같은 \ n 스트림)은 오류가 아니지만 패턴이 인식해야합니다. 하나의 입력 행에서 모든 시작 조건을 인식해야합니다. 내가 어떻게 할 수 있니?

답변

1

잘못된 방식입니다. 이는 어휘 문제가 아닌 문법 문제입니다. 당신의 언어에서 개행 문자가 중요하다면 문법에 명시 적으로 나타나야하고 렉서가 토큰으로 반환해야합니다.

+0

이 작업은 언어가 아닌 작업이며, 나는 들소없이해야합니다. 따라서 토큰 개행을 만들고 사용하면 상황이 바뀌지 않습니다. – freakz

관련 문제