Flex Bison 을 사용한 Parser 정규표현식을 사용하여 토큰을 잘라내는 부분에서 질문드립니다.

dionysos의 이미지

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.

이 문제를 어떻게 해결할 수 있을까요 아무리 생각해도 답이 안나오네요

kalstein의 이미지

[ ]*END[ ]TEST:(.)*

이거면 문제가 있어보이는데요? flex라면 LALR(1)이던가요...뭐 여튼 최대한 매칭 되는것까지 봅니다. 근데 저런 문법이라면 당최 끝이 어딘지 모르는거죠 -_-;;

"END" 이런 키워드로 끝내는 방식의 문법으로 바꾸시는게 좋을 듯 합니다.

------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

dionysos의 이미지


답변 감사드립니다.

문법이 제가 정하는것도 아니고 바꿀수 있는 상황도 아니라 다른 방법을 찾아봐야겠네요.

노력은 배반하지 않는다.

dionysos의 이미지

정규 표현식으로는 해결이 안될것 같아 다른 방식으로 해결햇습니다.

기존에는 token를

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: 

3개로 나누었는데 이걸 하나로 합치면서

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: 의 핸들러에서
char c = input();
를 사용하여 토큰을 Line단위로 얻어온후 그 데이터에서 "END TEST:" 라는 값이 안에 존재하는지 검사를 하면 되는군요.

관심 가져주신분들 감사합니다.


노력은 배반하지 않는다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.