⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssa

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻
字号:
.SHAppendix A:  A Simple Example.PPThis example gives the complete Yacc specification for a small desk calculator;the desk calculator has 26 registers, labeled ``a'' through ``z'', and acceptsarithmetic expressions made up of the operators +, \-, *, /,% (mod operator), & (bitwise and), | (bitwise or), and assignment.If an expression at the top level is an assignment, the value is notprinted; otherwise it is.As in C, an integer that begins with 0 (zero) is assumed to be octal;otherwise, it is assumed to be decimal..PPAs an example of a Yacc specification, the desk calculatordoes a reasonable job of showing how precedences and ambiguitiesare used, and demonstrating simple error recovery.The major oversimplifications are that thelexical analysis phase is much simpler than for most applications, and theoutput is produced immediately, line by line.Note the way that decimal and octal integers are read in by the grammar rules;This job is probably better done by the lexical analyzer..sp.nf.ta .5i 1i 1.5i 2i 2.5i%{#  include  <stdio.h>#  include  <ctype.h>int  regs[26];int  base;%}%start  list%token  DIGIT  LETTER%left  \'|\'%left  \'&\'%left  \'+\'  \'\-\'%left  \'*\'  \'/\'  \'%\'%left  UMINUS      /*  supplies  precedence  for  unary  minus  */%%      /*  beginning  of  rules  section  */list	:	/*  empty  */	|	list  stat  \'\en\'	|	list  error  \'\en\'			{	yyerrok;  }	;stat	:	expr			{	printf( "%d\en", $1 );  }	|	LETTER  \'=\'  expr			{	regs[$1]  =  $3;  }	;expr	:	\'(\'  expr  \')\'			{	$$  =  $2;  }	|	expr  \'+\'  expr			{	$$  =  $1  +  $3;  }	|	expr  \'\-\'  expr			{	$$  =  $1  \-  $3;  }	|	expr  \'*\'  expr			{	$$  =  $1  *  $3;  }	|	expr  \'/\'  expr			{	$$  =  $1  /  $3;  }	|	expr  \'%\'  expr			{	$$  =  $1  %  $3;  }	|	expr  \'&\'  expr			{	$$  =  $1  &  $3;  }	|	expr  \'|\'  expr			{	$$  =  $1  |  $3;  }	|	\'\-\'  expr        %prec  UMINUS			{	$$  =  \-  $2;  }	|	LETTER			{	$$  =  regs[$1];  }	|	number          	;number	:	DIGIT			{	$$ = $1;    base  =  ($1==0)  ?  8  :  10;  }	|	number  DIGIT			{	$$  =  base * $1  +  $2;  }	;%%      /*  start  of  programs  */yylex() {		/*  lexical  analysis  routine  */              /*  returns  LETTER  for  a  lower  case  letter,  yylval = 0  through  25  */              /*  return  DIGIT  for  a  digit,  yylval = 0  through  9  */              /*  all  other  characters  are  returned  immediately  */	int  c;	while(  (c=getchar())  ==  \' \'  )  {	/*  skip  blanks  */  }	/*  c  is  now  nonblank  */	if(  islower(  c  )  )  {			yylval  =  c  \-  \'a\';		return  (  LETTER  );		}	if(  isdigit(  c  )  )  {			yylval  =  c  \-  \'0\';		return(  DIGIT  );		}	return(  c  );	}.fi.bp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -