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