Flex Bison 을 사용한 Parser 정규표현식을 사용하여 토큰을 잘라내는 부분에서 질문드립니다.
글쓴이: dionysos / 작성시간: 수, 2008/11/19 - 9:02오전
Flex와 Bison을 사용하여 Parser를 만들고 있습니다.
데이터가
BEGIN TEST: FAIL in PORT.CPP @ line 57: CreateFile FormatMessage error: 317 ShellProc(SPM_END_TEST, ...) called INFO: This is the write-boundaries-read-everything cache test. ERROR: Please see the documentation for more information. END TEST:
이렇게 구성이 되어 있습니다.
BEGIN TEST: ....
END TEST: ...
위와 같이 시작과 끝의 요소는 확정적이지만 그 중간에 들어가는 내용인
FormatMessage error: 317 ShellProc(SPM_END_TEST, ...) called @ , ' "Data set" invalid INFO: This is the write-boundaries-read-everything cache test. ERROR: Please see the documentation for more information.
는 확정적이지 않습니다. 이 부분으로 정규표현식으로 data를 가져와야 하는데 정규표현식을 어떻게 사용해야 될까요.
시작테그는
[ ]*BEGIN[ ]TEST:(.)*
끝 테그는
[ ]*END[ ]TEST:(.)*
하면 되는데 중간에 들어가는 부분이 형식이 일정하지 않아서 어떻게 정규 표현식을 만들어 token를 가져와야 할지 모르겠네요.
그래서 저 나름 생각한 방법이
1.END TEST:라는 문자열이 나오지 않으면 그 토큰은 중간에 들어가는 token으로 간주하고 ([ ])*([^E][^N][^D])(.)*
이렇게 만들었는데 이렇게 만드니 중간의 Data중에 E / N / D 로 시작하는 데이터들은 가져올수가 없습니다.
--> 이 데이터 제외됨. ERROR: Please see the documentation for more information.
이 문제를 어떻게 해결할 수 있을까요 아무리 생각해도 답이 안나오네요
Forums:
좋아보이는 문법은 아니네요.
이거면 문제가 있어보이는데요? flex라면 LALR(1)이던가요...뭐 여튼 최대한 매칭 되는것까지 봅니다. 근데 저런 문법이라면 당최 끝이 어딘지 모르는거죠 -_-;;
"END" 이런 키워드로 끝내는 방식의 문법으로 바꾸시는게 좋을 듯 합니다.
------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/
------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/
제가 문법을 바꿀수 있는게 아니라서요.
답변 감사드립니다.
문법이 제가 정하는것도 아니고 바꿀수 있는 상황도 아니라 다른 방법을 찾아봐야겠네요.
노력은 배반하지 않는다.
발견했습니다.
정규 표현식으로는 해결이 안될것 같아 다른 방식으로 해결햇습니다.
기존에는 token를
3개로 나누었는데 이걸 하나로 합치면서
하나로 만들어 명확한 시작 테그 BEGIN TEST: 의 핸들러에서
char c = input();
를 사용하여 토큰을 Line단위로 얻어온후 그 데이터에서 "END TEST:" 라는 값이 안에 존재하는지 검사를 하면 되는군요.
관심 가져주신분들 감사합니다.
노력은 배반하지 않는다.
댓글 달기