xref: /freebsd-src/contrib/byacc/test/err_syntax27.y (revision 6cec9cad762b6476313fb1f8e931a1647822db6b)
1*0c8de5b0SBaptiste Daroussin %pure-parser
2*0c8de5b0SBaptiste Daroussin 
3*0c8de5b0SBaptiste Daroussin %parse-param { int regs[26]
4*0c8de5b0SBaptiste Daroussin %parse-param { int *base
5*0c8de5b0SBaptiste Daroussin 
6*0c8de5b0SBaptiste Daroussin %lex-param { int *base
7*0c8de5b0SBaptiste Daroussin 
8*0c8de5b0SBaptiste Daroussin %{
9*0c8de5b0SBaptiste Daroussin # include <stdio.h>
10*0c8de5b0SBaptiste Daroussin # include <ctype.h>
11*0c8de5b0SBaptiste Daroussin 
12*0c8de5b0SBaptiste Daroussin #ifdef YYBISON
13*0c8de5b0SBaptiste Daroussin #define YYSTYPE int
14*0c8de5b0SBaptiste Daroussin #define YYLEX_PARAM base
15*0c8de5b0SBaptiste Daroussin #define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM)
16*0c8de5b0SBaptiste Daroussin #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
17*0c8de5b0SBaptiste Daroussin int YYLEX_DECL();
18*0c8de5b0SBaptiste Daroussin static void YYERROR_DECL();
19*0c8de5b0SBaptiste Daroussin #endif
20*0c8de5b0SBaptiste Daroussin 
21*0c8de5b0SBaptiste Daroussin %}
22*0c8de5b0SBaptiste Daroussin 
23*0c8de5b0SBaptiste Daroussin %start list
24*0c8de5b0SBaptiste Daroussin 
25*0c8de5b0SBaptiste Daroussin %token DIGIT LETTER
26*0c8de5b0SBaptiste Daroussin 
27*0c8de5b0SBaptiste Daroussin %left '|'
28*0c8de5b0SBaptiste Daroussin %left '&'
29*0c8de5b0SBaptiste Daroussin %left '+' '-'
30*0c8de5b0SBaptiste Daroussin %left '*' '/' '%'
31*0c8de5b0SBaptiste Daroussin %left UMINUS   /* supplies precedence for unary minus */
32*0c8de5b0SBaptiste Daroussin 
33*0c8de5b0SBaptiste Daroussin %% /* beginning of rules section */
34*0c8de5b0SBaptiste Daroussin 
35*0c8de5b0SBaptiste Daroussin list  :  /* empty */
36*0c8de5b0SBaptiste Daroussin       |  list stat '\n'
37*0c8de5b0SBaptiste Daroussin       |  list error '\n'
38*0c8de5b0SBaptiste Daroussin             {  yyerrok ; }
39*0c8de5b0SBaptiste Daroussin       ;
40*0c8de5b0SBaptiste Daroussin 
41*0c8de5b0SBaptiste Daroussin stat  :  expr
42*0c8de5b0SBaptiste Daroussin             {  printf("%d\n",$1);}
43*0c8de5b0SBaptiste Daroussin       |  LETTER '=' expr
44*0c8de5b0SBaptiste Daroussin             {  regs[$1] = $3; }
45*0c8de5b0SBaptiste Daroussin       ;
46*0c8de5b0SBaptiste Daroussin 
47*0c8de5b0SBaptiste Daroussin expr  :  '(' expr ')'
48*0c8de5b0SBaptiste Daroussin             {  $$ = $2; }
49*0c8de5b0SBaptiste Daroussin       |  expr '+' expr
50*0c8de5b0SBaptiste Daroussin             {  $$ = $1 + $3; }
51*0c8de5b0SBaptiste Daroussin       |  expr '-' expr
52*0c8de5b0SBaptiste Daroussin             {  $$ = $1 - $3; }
53*0c8de5b0SBaptiste Daroussin       |  expr '*' expr
54*0c8de5b0SBaptiste Daroussin             {  $$ = $1 * $3; }
55*0c8de5b0SBaptiste Daroussin       |  expr '/' expr
56*0c8de5b0SBaptiste Daroussin             {  $$ = $1 / $3; }
57*0c8de5b0SBaptiste Daroussin       |  expr '%' expr
58*0c8de5b0SBaptiste Daroussin             {  $$ = $1 % $3; }
59*0c8de5b0SBaptiste Daroussin       |  expr '&' expr
60*0c8de5b0SBaptiste Daroussin             {  $$ = $1 & $3; }
61*0c8de5b0SBaptiste Daroussin       |  expr '|' expr
62*0c8de5b0SBaptiste Daroussin             {  $$ = $1 | $3; }
63*0c8de5b0SBaptiste Daroussin       |  '-' expr %prec UMINUS
64*0c8de5b0SBaptiste Daroussin             {  $$ = - $2; }
65*0c8de5b0SBaptiste Daroussin       |  LETTER
66*0c8de5b0SBaptiste Daroussin             {  $$ = regs[$1]; }
67*0c8de5b0SBaptiste Daroussin       |  number
68*0c8de5b0SBaptiste Daroussin       ;
69*0c8de5b0SBaptiste Daroussin 
70*0c8de5b0SBaptiste Daroussin number:  DIGIT
71*0c8de5b0SBaptiste Daroussin          {  $$ = $1; (*base) = ($1==0) ? 8 : 10; }
72*0c8de5b0SBaptiste Daroussin       |  number DIGIT
73*0c8de5b0SBaptiste Daroussin          {  $$ = (*base) * $1 + $2; }
74*0c8de5b0SBaptiste Daroussin       ;
75*0c8de5b0SBaptiste Daroussin 
76*0c8de5b0SBaptiste Daroussin %% /* start of programs */
77*0c8de5b0SBaptiste Daroussin 
78*0c8de5b0SBaptiste Daroussin #ifdef YYBYACC
79*0c8de5b0SBaptiste Daroussin extern int YYLEX_DECL();
80*0c8de5b0SBaptiste Daroussin #endif
81*0c8de5b0SBaptiste Daroussin 
82*0c8de5b0SBaptiste Daroussin int
main(void)83*0c8de5b0SBaptiste Daroussin main (void)
84*0c8de5b0SBaptiste Daroussin {
85*0c8de5b0SBaptiste Daroussin     int regs[26];
86*0c8de5b0SBaptiste Daroussin     int base = 10;
87*0c8de5b0SBaptiste Daroussin 
88*0c8de5b0SBaptiste Daroussin     while(!feof(stdin)) {
89*0c8de5b0SBaptiste Daroussin 	yyparse(regs, &base);
90*0c8de5b0SBaptiste Daroussin     }
91*0c8de5b0SBaptiste Daroussin     return 0;
92*0c8de5b0SBaptiste Daroussin }
93*0c8de5b0SBaptiste Daroussin 
94*0c8de5b0SBaptiste Daroussin #define UNUSED(x) ((void)(x))
95*0c8de5b0SBaptiste Daroussin 
96*0c8de5b0SBaptiste Daroussin static void
YYERROR_DECL()97*0c8de5b0SBaptiste Daroussin YYERROR_DECL()
98*0c8de5b0SBaptiste Daroussin {
99*0c8de5b0SBaptiste Daroussin     UNUSED(regs); /* %parse-param regs is not actually used here */
100*0c8de5b0SBaptiste Daroussin     UNUSED(base); /* %parse-param base is not actually used here */
101*0c8de5b0SBaptiste Daroussin     fprintf(stderr, "%s\n", s);
102*0c8de5b0SBaptiste Daroussin }
103*0c8de5b0SBaptiste Daroussin 
104*0c8de5b0SBaptiste Daroussin int
YYLEX_DECL()105*0c8de5b0SBaptiste Daroussin YYLEX_DECL()
106*0c8de5b0SBaptiste Daroussin {
107*0c8de5b0SBaptiste Daroussin 	/* lexical analysis routine */
108*0c8de5b0SBaptiste Daroussin 	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
109*0c8de5b0SBaptiste Daroussin 	/* return DIGIT for a digit, yylval = 0 through 9 */
110*0c8de5b0SBaptiste Daroussin 	/* all other characters are returned immediately */
111*0c8de5b0SBaptiste Daroussin 
112*0c8de5b0SBaptiste Daroussin     int c;
113*0c8de5b0SBaptiste Daroussin 
114*0c8de5b0SBaptiste Daroussin     while( (c=getchar()) == ' ' )   { /* skip blanks */ }
115*0c8de5b0SBaptiste Daroussin 
116*0c8de5b0SBaptiste Daroussin     /* c is now nonblank */
117*0c8de5b0SBaptiste Daroussin 
118*0c8de5b0SBaptiste Daroussin     if( islower( c )) {
119*0c8de5b0SBaptiste Daroussin 	*yylval = (c - 'a');
120*0c8de5b0SBaptiste Daroussin 	return ( LETTER );
121*0c8de5b0SBaptiste Daroussin     }
122*0c8de5b0SBaptiste Daroussin     if( isdigit( c )) {
123*0c8de5b0SBaptiste Daroussin 	*yylval = (c - '0') % (*base);
124*0c8de5b0SBaptiste Daroussin 	return ( DIGIT );
125*0c8de5b0SBaptiste Daroussin     }
126*0c8de5b0SBaptiste Daroussin     return( c );
127*0c8de5b0SBaptiste Daroussin }
128