yacc 와 lex 질문 드립니다.

bkc625의 이미지

안녕하세요

이번에 pcap 소스 분석 때문에 yacc 와 lex 를 좀 보고 있는데 이해하기가 참 난해 하네요 ㅠ

인터넷에 돌아다니는 계산기 소스를 가지고 와서 vi 붙여 넣고 번호를 붙여 놨습니다.

가져온 사이트는 http://wiki.kldp.org/wiki.php/LinuxdocSgml/Lex_Yacc-KLDP 입니다.

제가 라인 별로 해석을 해볼테니 틀렸으면 수정 부탁드리고 해설 부탁 드립니다.

간단하지만 다른분들에게도 도움이 되길 바랍니다. ㅠㅠ

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[ post ] % cat variable.y
1 %{
2 double vbltable[26]; /* double형의 기억장소 배열 */
3 %}
4 %union {
5 double dval;
6 int vblno;
7 }
8 %token NAME
9 %token NUMBER
10 %left '-' '+'
11 %left '*' '/'
12 %nonassoc UMINUS
13 %type expression
14 %%
15 statement_list: statement '\n'
16 | statement_list statement '\n'
17 ;
18 statement: NAME '=' expression { vbltable[$1] = $3; }
19 | expression { printf("= %g\n",$1); }
20 ;
21 expression: expression '+' expression { $$ = $1 + $3; }
22 | expression '-' expression { $$ = $1 - $3; }
23 | expression '*' expression { $$ = $1 * $3; }
24 | expression '/' expression
25 { if($3 == 0.0)
26 yyerror("divide by zero");
27 else $$ = $1 /$3;
28 }
29 | '-'expression %prec UMINUS { $$ = -$2; }
30 | '('expression')' { $$ = $2; }
31 | NUMBER
32 | NAME { $$ = vbltable[$1]; }
33 ;
34 %%
35 main()
36 {
37 yyparse();
38 }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[ post ] % cat variable.l
1 %{
2 #include "y.tab.h"
3 #include
4
5 extern double vbltable[26];
6 %}
7 %%
8 ([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) {
9 yylval.dval = atof(yytext); return NUMBER;
10 }
11 [\t] ; /* ignore white space */
12 [a-z] { yylval.vblno = yytext[0] - 'a'; return NAME; }
13 "$" { return 0; } /* end of input */
14 \n |
15 . return yytext[0];
16 %%

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

해설은 [라인수 : 해설] 형식으로 하겠습니다.

++ variable.y 파일
1~3 : vbltable 이름의 배열 선언
4~7 : 형이 double, int 형태를 가질 수 있다.
8~9 : vblno 형의 NAME 토큰과, dval 형의 NUMBER 토큰 선언. (yacc 와 lex 간 알아 먹을 수 있게 선언?)
10~11 : -,+,*,/ 기호는 왼쪽 결합을 먼저 한다, *,/ 가 -,+ 보다 우선순위가 높다.
12 : nonassoc UMINUS 이 라인이 무슨 말인가요?
13 : %type expression 이 말은 expression 이라는게 함수?토큰? 인가요? 또, 리턴 형이 dval 이란 말인가요? 아니면 expression 자체가 dval 형이란 말인가요?

15~33 라인까지 해석을 한번 부탁 드립니다. (이 부분이 힘드네요..ㅜ)
* statement_list, statement 라는 키워드는 무엇이고 어디서 가져오는건가요? 선언한 부분도 없는데 어떻게 알 수 있나요? (expression은 선언을 했으니 알겠는데..)
* statement '\n' 또는 statement_list statement '\n' 이라는게 둘중에 하나의 형태를 갖추면 되는건가요? 이 라인이 무슨 말인지 모르겠습니다;;
* statement: NAME '=' expression { vbltable[$1] = $3; } 이부분도 모르겠습니다 ㅠㅠ
* expression: expression '+' expression { $$ = $1 + $3; } 이 라인 같은 경우 위에서 %type expression 이라고 선언을 했습니다.
* 즉 double 형태의 값이 (double)A + (double)B 형태가 맞다면 이라는 조건인가요?
* {} 안에서의 $$ 라는건 this 같은 개념이라고 알고 있습니다. 만약 입력이 3 + 4 라고 하면 $1==3, $2==+, $3==4 일텐데 $$ 는 뭐라고 보면 되나요?

++ variable.l 파일
12 : 왜 yytext[0] 에서 'a'를 빼나요? yytext 가 배열인가요?
13 : "$" 이게 무엇인가요?

yacc 와 lex 를 이번에 처음 접해서 모르는게 많네요 ㅠ 물어볼곳도 없고 ㅠ 도와 주세요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

댓글 달기

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