YACC解析操作为0

时间:2014-11-15 13:30:24

标签: yacc

我有一个YACC程序来计算两个数字的加法,减法等。

    %{
#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匹配,最后他们添加它。但我仍然混淆为什么我减去并返回c后减去并返回DIGIT。

1 个答案:

答案 0 :(得分:0)

在ASCII字符集(以及EBCDIC字符集)中,字符09是连续的并且按升序排列。这意味着04恰好相隔四个位置。因此,如果c是一个已知为数字的字符,那么c-'0'将是该数字的整数值。