python 파서인 Reparse 문제입니다.

ozon1000의 이미지

파이썬 파서를 하나 제작하려고 공부하고 있습니다.
문제는 제가 파서의 근처에 근처도 못가본 것이 큰 문제입니다.

타겟이 python3라 Reparse라는 프로그램을 목표로 공부하려고 하는데,
도대체 예제를 봐도 어떻게 사용할 수 있는지 이것으로 무엇을 제작할 수 있는지 그림이 그려지지 않아 매우 당황스럽습니다.

혹시 python parser를 개발해 보신 적 있으신 선생님이 계시면
그나마 조금 편하게 공부할 수 있게 지식을 조금만 나누어 주셨으면 좋겠습니다.
읽어주셔서 감사합니다.

관련 url도 댓글로 달아주시면 정말정말 감사하겠습니다.
예제 위주로 따라 해보려고 했는데도,, 도대체 무슨말인지 이해하기 어려웠습니다.
감사합니다.

...!의 이미지

ozon1000님께서 이전에 하셨던 질문에 비추어 보면 아마도 파이썬을 파싱하기를 원하시는 것 같습니다. 그런데 선택하신 Reparse 라는 도구를 잠시 살펴봤는데 별로 적합하지 않은 도구인 것 같습니다. 파이썬이나 다른 대부분의 프로그래밍 언어는 context-free grammar를 사용합니다. 하지만 제가 살펴본 바로는 Reparse는 regular expression에 기반한 말하자면 매우 제한적인 파서입니다. context-free grammar가 무엇인지 어째서 regular expression 에 기반한 파서는 context-free grammar를 파싱할 수 없는 지 등등은 알면 좋지만 몰라도 일단 원하시는 바를 (파이썬 파싱) 달성하는 데에는 문제가 없습니다. 하지만 도구는 바꿔야할 것 같습니다.

프로그래밍 언어의 문법을 기술하기 위해 널리 쓰이는 방법으로 BNF 또는 EBNF라는 것이 있습니다. 문법을 기술하기 위한 일종의 언어이지요. 웹에서 자료를 많이 찾으실 수 있을 겁니다. 찬찬히 살펴보시면 어렵지 않습니다. 그리고 파이썬 문법의 (E)BNF 표현은 당연히도 이미 있습니다. 파이썬이 처음 만들어지던 그 순간부터 있었을 겁니다 (아마도). 검색해보니 바로 나오네요 (https://docs.python.org/3/reference/grammar.html).

그러면 이제 이 문법 명세를 사용해서 "파이썬으로 작성된 파이썬 파서"를 만들어주는 parser generator를 하나 구해서 사용하시면 됩니다. 매우 다양한 parser generator가 있습니다. BNF나 EBNF를 그대로 사용할 수 있는 것들도 있고 약간씩 바꿔줘야하는 것들도 있습니다. 저도 파이썬으로 파싱 작업을 해본 적은 없어서 이미 알고 있는 도구는 없습니다만 잠깐 검색해본 결과 저라면 일단 pyparsing (http://pyparsing.wikispaces.com/)을 사용해보겠습니다. ANTLR 같은 것이 최근에 많이 쓰이는 도구이지만 오로지 파이썬에만 기반한 도구를 사용하는 것이 ozon1000님께서 더 편하지 않을까 하는 생각이 들어서 골라봤습니다. 이 도구에 대한 책도 있네요. 그리고 파이썬2를 파싱하는 예제도 포함하고 있군요.(http://pyparsing.wikispaces.com/Examples). 파이썬3 예제는 없는 것 같습니다. 우선은 예제들 중 간단한 계산기 같은 것을 보고 익히시는 것이 좋을 것 같습니다. 원칙적으로 계산기나 파이썬이나 다를 것 없습니다. 약간 더 복잡해질 뿐이지 근본적으로 다른 것은 없습니다.

일단 무엇을 가지고 시작하면 좋을 지 추천을 드렸습니다. 파싱은 이미 잘 만들어진 (수학적인) 이론이 있고 좋은 도구도 많은 분야입니다. 기초부터 하나 하나 탄탄하게 공부를 하시고 싶으시면 자료는 많습니다. 책도 많고 웹에도 자료가 많습니다. 불행히도 우리 말로 된 자료가 충분한 지는 잘 모르겠습니다만... 여하튼 그렇게 공부를 하셔도 좋고 아니면 원하시는 바를 달성하기 위해서는 그냥 도구들을 잘 사용할 수 있는 정도만 공부하셔도 충분합니다. 일단 pyparsing 책에서부터 시작하셔도 좋을 것 같습니다. 짧은 책인 것 같습니다.

ozon1000의 이미지

이렇게 감동적인(?) 답글은 처음본것 같습니다.
한글자 한글자 꼼꼼하게 읽어보게 되는 답글이었습니다.
감사드립니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.