1. 本节主要演示一个简单的模拟bc计算器的程序,主要功能就是解析整型数的四则运算,先给出bison程序:
%{
#include <stdlib.h>
#include <stdio.h>
%}
/* 定义两个记号,D_INT表示整型类型,EOL表示换行(End Of Line) */
%token D_INT
%token EOL
/* 以下4组BNF范式来定义构造语法树的规则 */
/* 每条规则都有一个对应的C语言动作,表示一旦bison使用该规则去构造语法树(的一部分),则执行相应的动作 */
%%
/* 由于这是第一组规则,因此cac将作为语法起始符号,cac:的第一行用空规则表示 */
cac : /* cac -> cac exp EOL */
/* |表示从左边的cac推到到右边的表达式有多种不同的方式,即或的意思 */
/* :可以理解为推导符号-> */
/* :的左边为目标符号,其值用$$表示 */
/* :右边的语法符号的值从左到右依次为$1、$2、$3…… */
| cac exp EOL { printf( "ans = %d\n", $2 ); }
; /* ;表示一组规则的结束,同时也作为行分隔符美观代码 */
exp : fac /* exp -> fac|exp+fac|exp-fac */
/* 虽然exp -> fac的这条规则没有定义动作,但是bison会默认处理成$$ = $1 */
/* 这非常符合常理 */
| exp '+' fac { $$ = $1 + $3; }
| exp '-' fac { $$ = $1 - $3; }
;
fac : trm /* fac -> trm|fac*trm|fac/trm */