C++ 코드를 잘 생성해주는 lex & yacc은 무엇일까요?

이경한의 이미지

SQL 파서를 개발할 일이 생겼습니다.
하고 싶지 않은 프로젝트였는데.. 어쨌든 개발 환경은 *nix고요..
문제는 어떤 툴을 사용하는냐 인데.. 대략 아래 3가지 정도 골라봤습니다.

1. flex & bison
2. MKS Lex & Yacc
3. Visual parse++

문제는 1번을 선택하고 싶지만 flex가 C++지원을 못한다고 해서 망설여집니다.
고객이 C++로 작성할 것을 원해서요..
flex에서 C++을 사용하려면 꽁수를 쓰면 되지만 나중에 고객에게 소스코드를 넘겨주면 골치 아플 것 같아서 2나 3번을 선택하려고 합니다.
어차피 제돈 나가는게 아니니까요..
2, 3 밴더들이 C++ 풀 지원한다고 하는데 어찌 믿을 수 있을지..
혹시 C++ 코드를 생성하기에 적합한 툴을 알고 계신 분이나 SQL 파서를 개발해보신 분들의 고견 부탁드립니다.

lacovnk의 이미지

flex에서 c++은 명시적으로 지원하는 것 아닌가요?;

렉서를 클래스로 얻어올 수 있고, 그 안에 당연히 c++ 코드가 들어갈 수 있으니.. 이정도면 c++ 지원이 아닌가 싶은데..

....이번 학기 과제로 SQL 파서 짜야 합니다 흑 ㅠㅠ

prolinko의 이미지

ANTLR을 써보는 것은 어떨지?

자바, C++, C#, python 등의 목적코드를 지원합니다.

ANTLR툴을 gcj로 컴파일하고 C++ 런타임 라이브러리를 빌드해 놓으면 자바로 만들어진 프로그램이라는 것을 의식하지 못하고 사용할 수 있습니다.

SQL 파서가 특별한 최적화를 요하는 일이 아니면, boost.spirit을 쓰는 것도 괜찮다고 생각합니다. C++ 자체의 문법을 이용하므로 실제 파서코드가 C++코드안에 seamless하게 들어가게 됩니다.

ssggkim의 이미지

prolinko wrote:

SQL 파서가 특별한 최적화를 요하는 일이 아니면, boost.spirit을 쓰는 것도 괜찮다고 생각합니다. C++ 자체의 문법을 이용하므로 실제 파서코드가 C++코드안에 seamless하게 들어가게 됩니다.

spirit에 한표 더 합니다. :)

voider의 이미지

split 은 조금 난감한 감이 있습니다.
사용해본게 오래되어서 지금은 어떨지 모르겠지만 온리 템플릿으로 구현되어서 한계가 느껴집니다.(제가 부족해서 그럴수도 있지만)
또한 컴파일 시간의 압박은...
flex/bison에서 c++은 사용할수 있습니다.
하지만 타입을 기본적으로 포인터 타입을 사용하기 때문에 STL류와 같은 녀석을 사용하기에 애매한점이 있씁니다.

-- 아쉬운 하루 되세요 --

이경한의 이미지

많은 조언에 감사합니다.
결론은 flex와 bison을 사용하기로 했습니다.
오늘 겨우 설득해냈고요..
역시 아직 flex와 bison을 이용해서 C++ 코드를 생성하는 것은 쫌 골치 아픈게 있어서..
boost.split라는 것이 있다는 것도 첨 알았군요..
메타프로그래밍이라.. 신기하네요

prolinko의 이미지

voider wrote:
split 은 조금 난감한 감이 있습니다.

"split"이라니 뭘 쪼개실려고... :)

$ whatis split
split                (1)  - split a file into pieces
split                (n)  - Split a string into a proper Tcl list

쓸데없는 딴지 걸어서 죄송....

신승한의 이미지

prolinko wrote:
ANTLR을 써보는 것은 어떨지?

자바, C++, C#, python 등의 목적코드를 지원합니다.

ANTLR툴을 gcj로 컴파일하고 C++ 런타임 라이브러리를 빌드해 놓으면 자바로 만들어진 프로그램이라는 것을 의식하지 못하고 사용할 수 있습니다.

SQL 파서가 특별한 최적화를 요하는 일이 아니면, boost.spirit을 쓰는 것도 괜찮다고 생각합니다. C++ 자체의 문법을 이용하므로 실제 파서코드가 C++코드안에 seamless하게 들어가게 됩니다.

ANTLR?

웬지 얘는 LR만 전문으로 하는애 마냥 이름을 지었네요.

tomyun의 이미지

신승한 wrote:
ANTLR?

웬지 얘는 LR만 전문으로 하는애 마냥 이름을 지었네요.

그런데 이름과 다르게 LL이네요 :)

lifthrasiir의 이미지

prolinko wrote:
SQL 파서가 특별한 최적화를 요하는 일이 아니면, boost.spirit을 쓰는 것도 괜찮다고 생각합니다. C++ 자체의 문법을 이용하므로 실제 파서코드가 C++코드안에 seamless하게 들어가게 됩니다.

boost에는 정말로 신기한 것들이 많군요. 기껏해야 boost.any 정도 밖에 모르는데 저거 매뉴얼 보고 "아니 어떤 ㅂㅌ가 C++ 라이브러리를 저 따위로 만들었냐"라고 외쳤습니다. C++는... 참 오묘하군요. (먼산)

- 토끼군

이경한의 이미지

ANTLR은 LL(k) 파서이고 bison은 LALR(1) 파서입니다.
제가 오래전에 컴파일러를 배워서 두 파서의 특징이 가물가물하군요..
문제는 oracle10g SQL 파서를 구현하려는데 이 놈의 문서가 EBNF라는 겁니다. (프로젝트는 SQL SELECT 문 파서를 모두 구현해야되거든요)
언듯봐도 그것을 그대로 bison으로 바꾸면 conflict 압박 때문에 프로그래밍이 힘들어 질 것 같다는 생각이 듭니다.
혹시 LL(k) 파서인 ANTLR을 이용한다면 이러한 문제점을 줄일 수 있을까요?
제가 곰곰히 살펴봐야 하지만 시간이 촉박해서 먼저 질문 드립니다.
어쩌면 자문자답해야 될지도 모르겠군요..^^;

lifthrasiir의 이미지

이경한 wrote:
ANTLR은 LL(k) 파서이고 bison은 LALR(1) 파서입니다.
제가 오래전에 컴파일러를 배워서 두 파서의 특징이 가물가물하군요..
문제는 oracle10g SQL 파서를 구현하려는데 이 놈의 문서가 EBNF라는 겁니다. (프로젝트는 SQL SELECT 문 파서를 모두 구현해야되거든요)
언듯봐도 그것을 그대로 bison으로 바꾸면 conflict 압박 때문에 프로그래밍이 힘들어 질 것 같다는 생각이 듭니다.
혹시 LL(k) 파서인 ANTLR을 이용한다면 이러한 문제점을 줄일 수 있을까요?
제가 곰곰히 살펴봐야 하지만 시간이 촉박해서 먼저 질문 드립니다.
어쩌면 자문자답해야 될지도 모르겠군요..^^;

일단 SQL 파서라면 LL(k) 파서나 LALR(1) 파서 둘 다 사용은 가능할 것 같고, 말씀하신 것처럼 LALR(1) 파서는 conflict 때문에 주의를 기울이지 않으면 사용하기가... 좀 귀찮죠. ;; ANTLR은 아직 써 본 바가 없기 때문에 어떤 장단점이 있는 지는 잘 모르겠습니다. 만약 두 파서의 특징이 궁금하시면 위키백과를 뒤져 보셔도 되겠습니다.

- 토끼군

vacancy의 이미지

LL(k) 는 left recursive 문법도 안되고 -_-
LALR(1) language가 LL(k) language의 superset 아닌가요 ?
( 이건 컴파일러 공부한지 오래돼서 기억이 ㅠㅠ )
속도도 LALR(1)이 더 빠르고요.

요즘엔 LL(k)가 별 merit이 없는것 같습니다.

익명 사용자의 이미지

Quote:
LALR(1) language가 LL(k) language의 superset 아닌가요 ?

superset은 아니고 교집합 부분이 있습니다.
LL(k)-LALR(1) 집합과 LALR(1)-LL(k) 집합 각각에 해당되는 부분이 어떤 특징을 가지고 있는지 직관적으로 이해하고 싶은데 힘든 작업이군요..
일요인데 컴파일러 책 보게 생겼습니다.. :twisted:
meteors의 이미지

LL(k)나 LALR(1)이나 장단점이 있습니다.
LL(k)가 좀 더 직관적인데 변형을 많이 해야 하고..
(regular expression을 쓰는 느낌이죠. left recursion이 1단계라면 좋은데 몇단계 밑에 나타나면 그걸 없애려면 머리가 빙빙 돌죠.)
LALR(1)은 편할 때가 많은데 한계가 있는 경우가 있지요.

뭘 해도 힘든 것은 마찬가지에요. :lol: 언어들이 제멋대로의 확장을 해서 LL(k)나 LALR(1)에 깔끔하게 들어가지 않거든요.

Oracle SQL이라면 문서화되지 않는 경우(주석.. 과거로부터의 호환)가 있어서 다양한 예(물론 실행이 제대로 된 SQL 문장)를 테스트 해야 합니다.
테스트하고 고치고 하면 몇달 걸려요. 8)

meteors의 이미지

그리고 bison/flex 대신에 bison++/flex++를 써 보세요. 변수들을 클래스 안에 다 집어넣을 수 있도록 기능이 있기 때문에 충돌이 날 경우가 적어요.

lacovnk의 이미지

documentation이 (영어지만! orz) yacc나 flex 등등보다 훨씬 더 잘되어있어서, 처음인데 더 쉬운 것 같습니다.

컴파일러 수업 들으면 위의 많은 답글들을 이해할 수 있겠지요? -_-

이미 yacc에서 spirit로 넘어가면서 문법 압박이 심하긴 합니다 ㅎㅎ 다행히 simple sql이라..

이경한의 이미지

Quote:
documentation이 (영어지만! orz) yacc나 flex 등등보다 훨씬 더 잘되어있어서, 처음인데 더 쉬운 것 같습니다.

컴파일러 수업 들으면 위의 많은 답글들을 이해할 수 있겠지요? -_-

이미 yacc에서 spirit로 넘어가면서 문법 압박이 심하긴 합니다 ㅎㅎ 다행히 simple sql이라..


simple sql이라면 bison이던 spirit던 어렵지 않을 겁니다.
그러나 oracle이나 sysbase의 모든 스펙을 지원하려다 보니 어려운 점이 많군요..
진짜 좌절입니다.. 아 위에 손님으로 남긴 글은 제가 쓴 것입니다.
semmal의 이미지

Quote:

LALR(1) language가 LL(k) language의 superset 아닌가요 ?

각 파서의 표현 범위는 아래와 같습니다.
위키피디아에 보면 그림에는 나오지 않았지만 Canonical LR parser가 LALR보다는 약간 더 넓은 범위라 합니다.

------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

댓글 달기

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