2014-11-15 36 views
0

我有一個YACC程序來計算兩個數字的加法,減法等。YACC解析操作0

%{ 
#include<stdio.h> 
#include<stdlib.h> 
%} 
%token DIGIT 
%% 
L:A {printf("%d\n",$1); exit(0);} 
; 
A:A'+'B {$$=$1+$3;} 
|B {$$=$1;} 
; 
B:B'-'C {$$=$1-$3;} 
|C {$$=$1;} 
; 
C:C'*'D {$$=$1*$3;} 
|D {$$=$1;} 
; 
D:D'/'E {$$=$1/$3;} 
|E {$$=$1;} 
; 
E:'('A')' {$$=$2;} 
|DIGIT 
; 
%% 
yylex() 
{ 
    int c; 
    c=getchar(); 
    if(isdigit(c)) 
    { 
    yylval=c-'0'; 
    return DIGIT; 
    } 
    return c; 
} 
yyerror(char *s) 
{ 
printf("\nError:%s\n",s); 
} 

int main() 
{ 
printf("Enter expression:"); 
yyparse(); 

} 

但我無法理解這部分。

c=getchar(); 
    if(isdigit(c)) 
    { 
    yylval=c-'0'; 
    return DIGIT; 
    } 
    return c; 

爲什麼我減去0? YACC究竟如何解析我的程序,我無法理解3 + 5是如何用這個邏輯解析並打印出來的。我知道它匹配A'+'B,最後他們添加它。但即時通訊仍然困惑我爲什麼我減去並返回DIGIT減去後,否則返回C.

+0

評論:用你的語法,減法的優先級高於加法,所以1 + 2-3被解析爲1+(2-3)。通常,加法和減法具有相同的優先級,所以1 + 2-3應該被解析爲(1 + 2)-3,它們都是左關聯的。分割和乘法也是一樣。 –

回答

0

在ASCII字符集(和EBCDIC字符集,就此而言)中,字符09是連續的並按升序排列。這意味着例如04恰恰相距四個位置。所以如果c是一個已知爲數字的字符,那麼c-'0'將是該數字的整數值。

+0

將c-'0'的值傳遞給yylval。這是否隱式地傳遞給DIGIT,因爲DIGIT被聲明爲令牌? –

+0

@PrasanthLouis不知道你在那裏問什麼。 – Sneftel

+0

對不起,我的意思是,我的整數值如何進入DIGIT? 或基本上DIGIT中是什麼? –