xref: /freebsd/contrib/byacc/test/ok_syntax1.y (revision 822ca3276345b4a67ccbc9b54616d8b205fd37f2)
10c8de5b0SBaptiste Daroussin %pure_parser
20c8de5b0SBaptiste Daroussin 
30c8de5b0SBaptiste Daroussin %parse_param { int regs[26] }
40c8de5b0SBaptiste Daroussin %parse_param { int *base }
50c8de5b0SBaptiste Daroussin 
60c8de5b0SBaptiste Daroussin %lex_param { int *base }
70c8de5b0SBaptiste Daroussin 
80c8de5b0SBaptiste Daroussin %{
90c8de5b0SBaptiste Daroussin # include <stdio.h>
100c8de5b0SBaptiste Daroussin # include <ctype.h>
110c8de5b0SBaptiste Daroussin 
120c8de5b0SBaptiste Daroussin #ifdef YYBISON
130c8de5b0SBaptiste Daroussin #define YYSTYPE int
140c8de5b0SBaptiste Daroussin #define YYLEX_PARAM base
150c8de5b0SBaptiste Daroussin #define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM)
160c8de5b0SBaptiste Daroussin #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
170c8de5b0SBaptiste Daroussin int YYLEX_DECL();
180c8de5b0SBaptiste Daroussin static void YYERROR_DECL();
190c8de5b0SBaptiste Daroussin #endif
200c8de5b0SBaptiste Daroussin 
210c8de5b0SBaptiste Daroussin %}
220c8de5b0SBaptiste Daroussin 
230c8de5b0SBaptiste Daroussin %start list
240c8de5b0SBaptiste Daroussin 
250c8de5b0SBaptiste Daroussin %token DIGIT LETTER
260c8de5b0SBaptiste Daroussin 
270c8de5b0SBaptiste Daroussin %token OCT1 '\177'
280c8de5b0SBaptiste Daroussin %token HEX1 '\xff'
290c8de5b0SBaptiste Daroussin %token HEX2 '\xFF'
300c8de5b0SBaptiste Daroussin %token HEX3 '\x7f'
310c8de5b0SBaptiste Daroussin %token STR1 "\x7f\177\\\n"
320c8de5b0SBaptiste Daroussin %token STR2 "\x7f\
330c8de5b0SBaptiste Daroussin \177\\\n"
340c8de5b0SBaptiste Daroussin 
350c8de5b0SBaptiste Daroussin %token BELL '\a'
360c8de5b0SBaptiste Daroussin %token BS   '\b'
370c8de5b0SBaptiste Daroussin %token NL   '\n'
380c8de5b0SBaptiste Daroussin %token LF   '\f'
390c8de5b0SBaptiste Daroussin %token CR   '\r'
400c8de5b0SBaptiste Daroussin %token TAB  '\t'
410c8de5b0SBaptiste Daroussin %token VT   '\v'
420c8de5b0SBaptiste Daroussin 
43*822ca327SBaptiste Daroussin %union CalcData
440c8de5b0SBaptiste Daroussin {
450c8de5b0SBaptiste Daroussin     char *	cval;
460c8de5b0SBaptiste Daroussin     int		ival;
470c8de5b0SBaptiste Daroussin     double	dval;
480c8de5b0SBaptiste Daroussin }
490c8de5b0SBaptiste Daroussin 
500c8de5b0SBaptiste Daroussin %0 '@'
510c8de5b0SBaptiste Daroussin %2 '~'
520c8de5b0SBaptiste Daroussin %> '^'
530c8de5b0SBaptiste Daroussin %< '#'
540c8de5b0SBaptiste Daroussin 
550c8de5b0SBaptiste Daroussin %left '|'
560c8de5b0SBaptiste Daroussin %left '&'
570c8de5b0SBaptiste Daroussin %left '+' '-'
580c8de5b0SBaptiste Daroussin %left '*' '/' '%'
590c8de5b0SBaptiste Daroussin %left UMINUS   /* supplies precedence for unary minus */
600c8de5b0SBaptiste Daroussin 
610c8de5b0SBaptiste Daroussin %% /* beginning of rules section */
620c8de5b0SBaptiste Daroussin 
630c8de5b0SBaptiste Daroussin list  :  /* empty */
640c8de5b0SBaptiste Daroussin       |  list stat '\n'
650c8de5b0SBaptiste Daroussin       |  list error '\n'
660c8de5b0SBaptiste Daroussin             {  yyerrok ; }
670c8de5b0SBaptiste Daroussin       ;
680c8de5b0SBaptiste Daroussin 
690c8de5b0SBaptiste Daroussin stat  :  expr
700c8de5b0SBaptiste Daroussin             {  printf("%d\n",$<ival>1);}
710c8de5b0SBaptiste Daroussin       |  LETTER '=' expr
720c8de5b0SBaptiste Daroussin             {  regs[$<ival>1] = $<ival>3; }
730c8de5b0SBaptiste Daroussin       ;
740c8de5b0SBaptiste Daroussin 
750c8de5b0SBaptiste Daroussin expr  :  '(' expr ')'
760c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>2; }
770c8de5b0SBaptiste Daroussin       |  expr '+' expr
780c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>1 + $<ival>3; }
790c8de5b0SBaptiste Daroussin       |  expr '-' expr
800c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>1 - $<ival>3; }
810c8de5b0SBaptiste Daroussin       |  expr '*' expr
820c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>1 * $<ival>3; }
830c8de5b0SBaptiste Daroussin       |  expr '/' expr
840c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>1 / $<ival>3; }
850c8de5b0SBaptiste Daroussin       |  expr '%' expr
860c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>1 % $<ival>3; }
870c8de5b0SBaptiste Daroussin       |  expr '&' expr
880c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>1 & $<ival>3; }
890c8de5b0SBaptiste Daroussin       |  expr '|' expr
900c8de5b0SBaptiste Daroussin             {  $<ival>$ = $<ival>1 | $<ival>3; }
910c8de5b0SBaptiste Daroussin       |  '-' expr %prec UMINUS
920c8de5b0SBaptiste Daroussin             {  $<ival>$ = - $<ival>2; }
930c8de5b0SBaptiste Daroussin       |  LETTER
940c8de5b0SBaptiste Daroussin             {  $<ival>$ = regs[$<ival>1]; }
950c8de5b0SBaptiste Daroussin       |  number
960c8de5b0SBaptiste Daroussin       ;
970c8de5b0SBaptiste Daroussin 
980c8de5b0SBaptiste Daroussin number:  DIGIT
990c8de5b0SBaptiste Daroussin          {  $<ival>$ = $<ival>1; (*base) = ($<ival>1==0) ? 8 : 10; }
1000c8de5b0SBaptiste Daroussin       |  number DIGIT
1010c8de5b0SBaptiste Daroussin          {  $<ival>$ = (*base) * $<ival>1 + $<ival>2; }
1020c8de5b0SBaptiste Daroussin       ;
1030c8de5b0SBaptiste Daroussin 
1040c8de5b0SBaptiste Daroussin %% /* start of programs */
1050c8de5b0SBaptiste Daroussin 
1060c8de5b0SBaptiste Daroussin #ifdef YYBYACC
1070c8de5b0SBaptiste Daroussin extern int YYLEX_DECL();
1080c8de5b0SBaptiste Daroussin #endif
1090c8de5b0SBaptiste Daroussin 
1100c8de5b0SBaptiste Daroussin int
1110c8de5b0SBaptiste Daroussin main (void)
1120c8de5b0SBaptiste Daroussin {
1130c8de5b0SBaptiste Daroussin     int regs[26];
1140c8de5b0SBaptiste Daroussin     int base = 10;
1150c8de5b0SBaptiste Daroussin 
1160c8de5b0SBaptiste Daroussin     while(!feof(stdin)) {
1170c8de5b0SBaptiste Daroussin 	yyparse(regs, &base);
1180c8de5b0SBaptiste Daroussin     }
1190c8de5b0SBaptiste Daroussin     return 0;
1200c8de5b0SBaptiste Daroussin }
1210c8de5b0SBaptiste Daroussin 
1220c8de5b0SBaptiste Daroussin #define UNUSED(x) ((void)(x))
1230c8de5b0SBaptiste Daroussin 
1240c8de5b0SBaptiste Daroussin static void
1250c8de5b0SBaptiste Daroussin YYERROR_DECL()
1260c8de5b0SBaptiste Daroussin {
1270c8de5b0SBaptiste Daroussin     UNUSED(regs); /* %parse-param regs is not actually used here */
1280c8de5b0SBaptiste Daroussin     UNUSED(base); /* %parse-param base is not actually used here */
1290c8de5b0SBaptiste Daroussin     fprintf(stderr, "%s\n", s);
1300c8de5b0SBaptiste Daroussin }
1310c8de5b0SBaptiste Daroussin 
1320c8de5b0SBaptiste Daroussin int
1330c8de5b0SBaptiste Daroussin YYLEX_DECL()
1340c8de5b0SBaptiste Daroussin {
1350c8de5b0SBaptiste Daroussin 	/* lexical analysis routine */
1360c8de5b0SBaptiste Daroussin 	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
1370c8de5b0SBaptiste Daroussin 	/* return DIGIT for a digit, yylval = 0 through 9 */
1380c8de5b0SBaptiste Daroussin 	/* all other characters are returned immediately */
1390c8de5b0SBaptiste Daroussin 
1400c8de5b0SBaptiste Daroussin     int c;
1410c8de5b0SBaptiste Daroussin 
1420c8de5b0SBaptiste Daroussin     while( (c=getchar()) == ' ' )   { /* skip blanks */ }
1430c8de5b0SBaptiste Daroussin 
1440c8de5b0SBaptiste Daroussin     /* c is now nonblank */
1450c8de5b0SBaptiste Daroussin 
1460c8de5b0SBaptiste Daroussin     if( islower( c )) {
1470c8de5b0SBaptiste Daroussin 	yylval->ival = (c - 'a');
1480c8de5b0SBaptiste Daroussin 	return ( LETTER );
1490c8de5b0SBaptiste Daroussin     }
1500c8de5b0SBaptiste Daroussin     if( isdigit( c )) {
1510c8de5b0SBaptiste Daroussin 	yylval->ival = (c - '0') % (*base);
1520c8de5b0SBaptiste Daroussin 	return ( DIGIT );
1530c8de5b0SBaptiste Daroussin     }
1540c8de5b0SBaptiste Daroussin     return( c );
1550c8de5b0SBaptiste Daroussin }
156