工作原理
.y文件结构
YYSTYPE 语义值类型
%token NUM 定义终结符NUM
yyerror 必须用户自己提供
int yylex() 这个例子中使用自己编写的yylex,实际会使用flex编译的文件所提供的yylex
产生式右边为空表示 ϵ \epsilon ϵ
产生式后面的c语言代码称为语义动作
$$ 表示产生式左部的语义值
$1,$2,…分别表示右边第一,第二个符号的语义值
yylval 是全局变量,表示当前所识别的词形的语义值。
% {
c 语言说明部分,定义语义动作中需要的全局变量,语义值类型,以及头文件等
#define YYSTYPE int
#include <ctype.h>
#include <stdio.h>
void yyerror ( char * ) ;
int yylex ( ) ;
% }
声明部分
定义终结符, 规定非终结符语义值类型,规定运算优先级,规定文法形态等
% token NUM
% %
语法规则部分,定义产生式和语义动作
input:
| input line
;
line: '\n'
| exp '\n' {
printf ( "\%.d\n" , $1 ) ; }
;
exp: NUM {
$$ = $1 ; }
| exp exp '+' {
$$ = $1 + $2 ; }
| exp exp '-' {
$$ = $1 - $2 ; }
| exp exp '*' {
$$ = $1 * $2 ; }
| exp exp '/' {
$$ = $1 / $2 ; }
| exp 'n' {
$$ = - $1 ; }
;
% %
bison直接拷贝到. tab. c文件的尾部,用户再次可定义接口函数,也可由其它文件提供再链接。
int yylex ( ) {
int c;
while ( ( c= getchar ( ) ) == ' ' || c== '\t' )
;
if ( isdigit ( c) ) {
ungetc ( c, stdin ) ;
scanf ( "%d" , & yylval) ;
return NUM;
}
if ( c== EOF )
return 0 ;
return c;
}
int main ( void ) {
return