我有一个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。
答案 0 :(得分:0)
在ASCII字符集(以及EBCDIC字符集)中,字符0
到9
是连续的并且按升序排列。这意味着0
和4
恰好相隔四个位置。因此,如果c
是一个已知为数字的字符,那么c-'0'
将是该数字的整数值。