yacc 와 lex 질문 드립니다.
안녕하세요
이번에 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 를 이번에 처음 접해서 모르는게 많네요 ㅠ 물어볼곳도 없고 ㅠ 도와 주세요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
댓글 달기