2016-03-23 63 views
0

我是Lex新手& Yacc編程,剛開始學習語法。我在網上瀏覽了這個程序,並試圖理解它。以下是Lex和Yacc代碼片段一個簡單的計算器:用Lex和Yacc解析(簡單計算器)

萊克斯規則

%% 
[a-z]  { 
       yylval = *yytext - 'a'; 
       return VARIABLE; 
      } 
[0-9]+  { 
       yylval = atoi(yytext); 
       return INTEGER; 
      } 
[-+()=/*\n] { return *yytext; } 

[ \t]  ; 
.    yyerror("invalid character"); 
%% 

YACC語法

%% 
program: 
     program statement '\n' 
     | 
     ; 

statement: 
     expr      { printf("%d\n", $1); } 
     | VARIABLE '=' expr  { sym[$1] = $3; } 
     ; 

expr: 
     INTEGER 
     | VARIABLE    { $$ = sym[$1]; } 
     | expr '+' expr   { $$ = $1 + $3; } 
     | expr '-' expr   { $$ = $1 - $3; } 
     | expr '*' expr   { $$ = $1 * $3; } 
     | expr '/' expr   { $$ = $1/$3; } 
     | '(' expr ')'   { $$ = $2; } 
     ; 
%% 

誰能請幫助我理解一步步驟如何處理/分析輸入表達式x = 3 + 4

按我的理解,在處理輸入,「x」將返回354會由Lex INTEGER返回。然而,在Yacc中,按照語法,由於VARIABLE可以推導爲expr,因此表達式將變爲:expr = expr '+' expr

那麼如何減少這個值得到VARIABLE '=' expr { sym[$1] = $3; }

任何幫助表示讚賞。

謝謝

+0

啓用[野牛的跟蹤工具](https://www.gnu.org/software/bison/manual/bison.html#Tracing),您可以一步一步觀察所有情況。 – rici

回答

2

x轉移; =被移位; 3,+,4被移位;那麼3+4與增加產量相匹配,減少到expr,從而允許減少分配生產。您需要記住,yacc是一個自下而上的解析器。

+0

'expr:INTEGER'規則也有兩個縮減(在移動'3'和'4'後立即執行),它們只是數值的簡單拷貝。 –

+0

好了... ...還有一個問題 - yylval和yytext有什麼區別? –

+0

@EJP:還有這個Production:expr = VARIALBLE。所以在解析時,表達式x = 3 + 4是不是expr = expr + expr?如果是,那麼它將如何匹配Production VARIABLE = expr?因爲VARIABLE已經減少到expr了? –