특정 소스코드파일에서 사용자 함수를 분류해서 출력 하려고 합니다. 도움 부탁드립니다.

lhs8421478의 이미지

안녕하세요 C언어를 공부중인 청년입니다.

특정 소스코드 파일을 읽어 들여서

그 파일내에 있는 사용자 함수를 구분하여 출력하려고 합니다.

자료형 함수명 (파라미터)

위와 같은 형태로 구분하여 출력 하려고 하는데 어떤식으로 하면 좋을지 부탁 드립니다.

lhs8421478의 이미지

특정 파일을 읽어들이고 그 파일 내에 있는 단어를 찾아서 카운트하고 출력하는

프로그래밍은 해봤는데 위와 같은 프로그래밍은 어떻게 하는지 도무지 감이 안잡히네요...

jeemin1의 이미지

코드 분석 자체에 목적이 있으신거면...

구글링 해보시면 '컴파일러 만들기' 쪽으로 검색해보시면 좋습니다.

물론 진짜 컴파일러를 만드는게 아니라,

괄호블럭 처리를 위한 스택 구조같은 알고리즘 공부용 자료들이 있습니다.

아니면 결과물 자체에 목적이 있으신거면

VS같은 IDE툴에서 열어서, Outline을 보시면 되겠네요.

lhs8421478의 이미지

도움 감사합니다. 검색해서 공부 해야겠네요 ^^

감사합니다

qiiiiiiiip의 이미지

파싱을 공부하는 것이 목적이 아니라,결과물 자체가 목적이라면

ctags를 사용하는것도 간단한 방법입니다.
cmd line에서 처리 가능하고, 결과 해석이 간편하죠..

ctags -f tags sorcefile.c

를 수행하신 이후에 tags 파일을 텍스트 에디터로 열어보세요.
여러 라인에 걸친 argument list는 별도 처리를 해야하지만,
일단 필요한 정보는 대부분 있습니다.

lhs8421478의 이미지

파일내에서

void 나 int , char 의 자료형만 찾아서

void main(int argc, char **argv)

이런걸 고대로 출력해주려는데... 도무지 감이 안잡히네요....

머리가 굳어버린거 같아요 ㅠㅠ

qiiiiiiiip의 이미지

일단 이정도에서 출발하시면 될듯..

$ grep "^\s*\(void\|int\|char\)\s*\S\+\s*([^)]*)" cfile.c

c프로그래밍을 "공부"하기에는 별로 좋은 타겟이 아니긴 합니다만,
어떻게 구현할 지는 직접 생각해보세요~

ymir의 이미지

bnf lexical analysis 로 검색해 보세요.
regex c function prototype 으로도 참고가 될 수 있겠네요.

prototype 추출이 목적이면, bnf 도 간단히 정의할 수 있으니..
직접 token 하나씩 읽어서 적당히 파싱해도 되겠네요.
lex & yacc 은 컴파일러 과정에서 배우게 될 건데, 미리 이걸 써 보는 것도 좋죠.

소스를 indent 로 먼저 정렬해 버리면, 정형화된 패턴이 나올테니...
regex 로도 원하는 목적을 이룰 수 있을 것 같기는 한데..
lexical analysis 는 꽤 난이도가 있을 겁니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

lhs8421478의 이미지

점점 산으로 가고 있는거 같네요 ㅠㅠ

깊게 들어갈수록 더욱 복잡해지네요 ㅠㅠ

ymir의 이미지

lexical analysis 는 PL, 컴파일러에서 나오는 거라, 아직 안 배웠다면 조금 막막하실겁니다.

http://www.lysator.liu.se/c/ANSI-C-grammar-y.html

이런 걸 참조해서 parser 를 만드는게 빠르겠지만..
굳이 lex & yacc 안 쓰더라도 시도해 볼 수는 있죠.

C 소스 자체는 많이 복잡하니까.. 그냥 문법을 간단히 정의하고, 그것에 맞는 입력 파일을 작성한 후에..
그걸 직접 토큰을 잘라서 파싱하는 코드를 만들어 보는게 조금 도움이 될겁니다.
(문법에는 함수 선언과 구현 부분만 있다고 가정해보는 식으로..)

만약 단순히 string parsing 해서 다루는 연습을 하려는 거라면..
csv 를 parsing 해서 xml 로 변환한다거나.. 하는 게 좀 더 나을것 같네요.
libxml 같은거는 여러모로 쓸데가 많으니, 그런 라이브러리들 미리 써보는 것도 괜찮죠.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지


C companion 이라는게 있읍니다.

이 책을 한번 보시죠..

댓글 달기

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