105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Named references test.                           -*- Autotest -*-
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Copyright (C) 2009-2012 Free Software Foundation, Inc.
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is free software: you can redistribute it and/or modify
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it under the terms of the GNU General Public License as published by
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the Free Software Foundation, either version 3 of the License, or
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (at your option) any later version.
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is distributed in the hope that it will be useful,
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# but WITHOUT ANY WARRANTY; without even the implied warranty of
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# GNU General Public License for more details.
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# You should have received a copy of the GNU General Public License
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# along with this program.  If not, see <http://www.gnu.org/licenses/>.
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# FIXME: Duplication with calc.at.
1905436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BANNER([[Named references tests.]])
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Tutorial calculator])
2205436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_OPTION_PUSHDEFS
2305436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%{
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <assert.h>
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stdio.h>
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stdlib.h>
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <string.h>
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <ctype.h>
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef int semantic_value;
3205436638acc7c010349a69c3395f1a57c642dc62Ying WangFILE *input;
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic semantic_value global_result = 0;
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int global_count = 0;
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int power (int base, int exponent);
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]AT_YYERROR_DECLARE[
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang]AT_YYLEX_DECLARE[
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang%}
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%union
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  semantic_value ival;
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token CALC_EOF 0 "end of input"
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token <ival> NUM "number"
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang%type  <ival> exp
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang%nonassoc '='   /* comparison	       */
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%left '-' '+'
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang%left '*' '/'
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%left NEG       /* negation--unary minus */
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang%right '^'      /* exponentiation        */
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wanginput:
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  line
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| input line         {}
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wangline:
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  '\n'
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp '\n'           {}
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wangexp:
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  NUM                { $$ = $NUM; }
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '=' exp[r]
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  {
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if ($l != $r)
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fprintf (stderr, "calc: error: %d != %d\n", $l, $r);
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    $$ = $l;
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[x] '+' { $<ival>$ = $x; } [l] exp[r]  { $$ = $<ival>l + $r;    }
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '-' exp[r]  { $$ = $l - $r;        }
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '*' exp[r]  { $$ = $l * $r;        }
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '/' exp[r]  { $$ = $l / $r;        }
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '-' exp  %prec NEG { $$ = -$2;            }
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '^' exp[r]  { $$ = power ($l, $r); }
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '(' exp[e] ')'     { $$ = $e;           }
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '(' error ')'      { $$ = 1111; yyerrok;  }
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '!'                { $$ = 0; YYERROR;     }
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '-' error          { $$ = 0; YYERROR;     }
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]AT_YYERROR_DEFINE[
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int get_char (void)
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int res = getc (input);
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return res;
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void unget_char (int c)
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ungetc (c, input);
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int read_signed_integer (void)
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int c = get_char ();
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int sign = 1;
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int n = 0;
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (c == '-')
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      c = get_char ();
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      sign = -1;
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  while (isdigit (c))
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      n = 10 * n + (c - '0');
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      c = get_char ();
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  unget_char ( c);
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return sign * n;
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wangyylex (void)
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int c;
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Skip white space.  */
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  while ((c = get_char ()) == ' ' || c == '\t') {}
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* process numbers   */
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (c == '.' || isdigit (c))
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      unget_char ( c);
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      (yylval).ival = read_signed_integer ();
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      return NUM;
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Return end-of-file.  */
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (c == EOF)
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return CALC_EOF;
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Return single chars. */
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return c;
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int power (int base, int exponent)
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int res = 1;
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  assert (0 <= exponent);
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (/* Niente */; exponent; --exponent)
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    res *= base;
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return res;
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wangint main (int argc, const char **argv)
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  semantic_value result = 0;
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int count = 0;
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int status;
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (argc == 2)
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    input = fopen (argv[1], "r");
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    input = stdin;
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (!input)
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      perror (argv[1]);
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      return 3;
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  status = yyparse ();
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fclose (input);
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  assert (global_result == result);
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  assert (global_count == count);
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return status;
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA([input.txt],
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang1 + 2 * 3 = 7
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang1 + 2 * -3 = -5
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang-1^2 = -1
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang(-1)^2 = 1
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang---1 = -1
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang1 - 2 - 3 = -4
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang1 - (2 - 3) = 2
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang2^2^3 = 256
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang(2^2)^3 = 64
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18405436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y])
18505436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_COMPILE([[test]])
18605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_PARSER_CHECK([./test input.txt], 0, [], [stderr])
18705436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_OPTION_POPDEFS
18805436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19505436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Undefined and ambiguous references])
19605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_OPTION_PUSHDEFS
19705436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang%{
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int power (int base, int exponent);
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang]AT_YYERROR_DECLARE[
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang]AT_YYLEX_DECLARE[
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang%}
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%union
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int ival;
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token CALC_EOF 0 "end of input"
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token <ival> NUM "number"
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%type  <ival> exp
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang%nonassoc '='   /* comparison	       */
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%left '-' '+'
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang%left '*' '/'
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang%left NEG       /* negation--unary minus */
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang%right '^'      /* exponentiation        */
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wanginput:
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  line
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| input line         {}
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wangline:
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  '\n'
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp '\n'           {}
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wangexp:
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  NUM { $$ = $NUM; }
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '=' exp[r]
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  {
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if ($l != $r)
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fprintf (stderr, "calc: error: %d != %d\n", $l, $r);
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    $$ = $l;
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[x] '*' { $<ival>$ = $x; } [l] exp[r] { $$ = $l * $r; }
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '/' exp[r]  { $$ = $l / $r;        }
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '-' exp  %prec NEG { $$ = -$2;            }
24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang| exp[l] '^' exp[r]  { $$ = power ($l, $r12); }
24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '(' exp ')'        { $$ = $expo;           }
24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '(' error ')'      { $$ = 1111; yyerrok;  }
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '!'                { $$ = 0; YYERROR;     }
24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang| '-' error          { $$ = 0; YYERROR;     }
24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
25305436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:50.51-60: error: invalid reference: '$<ival>lo9'
25505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:50.3-68:      symbol not found in production: lo9
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:51.51-60: warning: misleading reference: '$<ival>exp'
25705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:42.1-3:       refers to: $exp at $$
25805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:51.7:         possibly meant: $x, hiding $exp at $1
25905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:51.41:        possibly meant: $r, hiding $exp at $4
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:52.51-52: error: $l of 'exp' has no declared type
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:55.40-43: error: invalid reference: '$r12'
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:55.3-47:      symbol not found in production: r12
26305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:56.29-33: error: invalid reference: '$expo'
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:56.3-46:      symbol not found in production: expo
26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
26605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_OPTION_POPDEFS
26705436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
27105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Misleading references])
27205436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart: foo foo.bar { $foo.bar; }
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wangfoo: '1'
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wangfoo.bar: '2'
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
27905436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 0, [],
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:11.22-29: warning: misleading reference: '$foo.bar'
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:11.8-10:      refers to: $foo at $1
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:11.12-18:     possibly meant: $[foo.bar] at $2
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
28405436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
28805436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Many kinds of errors])
28905436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token IDENT
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token NUMBER
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token ASSIGNOP
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token IF
29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token IF1
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token THEN
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token ELSE
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token FI
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token WHILE
30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token DO
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang%token OD
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%start program
30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
30405436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt1: IF expr[cond] THEN stmt[then] ELSE stmt.list[else] FI
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt1 = new IfStmt($cond1, $then.f1, $else); };
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt2: IF expr[cond] THEN stmt[then] FI
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt2 = new IfStmt($cond, $stmt.field, 0); };
30805436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt3: IF expr[cond] THEN stmt.list FI
30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt3 = new IfStmt($cond, $stmt.list, 0); };
31005436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt4: IF expr[cond] THEN stmt[xyz] ELSE stmt[xyz] FI
31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt4 = new IfStmt($cond, $xyz, $cond); };
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt5 = new IfStmt($cond, $stmt.list, $else); };
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt6 = new IfStmt($cond, $stmt.list.field, $else); };
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt7 = new IfStmt($cond, $[stmt.list].field, $else); };
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt8: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt8 = new IfStmt($cond, $then.1, $else); };
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt9: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt9 = new IfStmt($cond, $then.1.field, $else); };
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if_stmt10 = new IfStmt($cond, $stmt.x, 0); };
32405436638acc7c010349a69c3395f1a57c642dc62Ying Wangif-stmt-a: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $if-stmt-a = new IfStmt($cond, $then, $else); };
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wangif-stmt-b: IF expr[cond] THEN if-stmt-a[then-a] ELSE stmt.list[else] FI
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          { $[if-stmt-b] = new IfStmt($cond, $then-a.f, $else); };
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wangprogram: stmt.list;
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstmt.list:  stmt ';' stmt.list { $3->insert($stmt); $$ = $3; }
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        |   stmt ';' { SL = new StmtList();  SL->insert($1); $$ = SL; }
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        ;
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstmt:  assign_stmt { $$ = $1; }
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    |  if_stmt { $$ = $1; }
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    |  if_stmt1 { $$ = $1; }
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    |  while_stmt { $$ = $1; }
33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    ;
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wangassign_stmt: IDENT ASSIGNOP expr
33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       { $$ = new AssignStmt(string($1),$3); };
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wangif_stmt: IF expr[cond] THEN stmt.list FI
34005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       { $if_stmt = new IfStmt($cond, $[stmt.list], 0); };
34105436638acc7c010349a69c3395f1a57c642dc62Ying Wangwhile_stmt[res]: WHILE expr DO stmt.list OD
34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       { $res = new WhileStmt($[expr], $[stmt.list]); };
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wangexpr: expr '+' term   { $$ = new Plus($1,$3); }
34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    | expr '-' term   { $$ = new Minus($1,$3); }
34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    | term            { $$ = $1; }
34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    ;
34705436638acc7c010349a69c3395f1a57c642dc62Ying Wangterm: term '*' factor   { $$ = new Times($1,$3); }
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    | factor            { $$ = $1; }
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    ;
35005436638acc7c010349a69c3395f1a57c642dc62Ying Wangfactor:     '(' expr ')'  { $$ = $2; }
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    |       NUMBER { $$ = new Number($1); }
35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    |       IDENT { $$ = new Ident(string($1)); }
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    ;
35405436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
35505436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:24.36-41: error: invalid reference: '$cond1'
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:23.11-24.62:  symbol not found in production: cond1
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:26.43-53: error: invalid reference: '$stmt.field'
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:25.11-26.60:  symbol not found in production: stmt
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:25.35-38:     possibly meant: $then.field, hiding $stmt.field at $4
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:28.43-52: error: invalid reference: '$stmt.list'
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:27.11-28.59:  symbol not found in production: stmt
36305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:27.30-38:     possibly meant: $[stmt.list] at $4
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:30.43-46: error: ambiguous reference: '$xyz'
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:29.35-37:     refers to: $xyz at $4
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:29.50-52:     refers to: $xyz at $6
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:32.43-52: error: invalid reference: '$stmt.list'
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:31.11-32.63:  symbol not found in production: stmt
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:31.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
37005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:31.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:34.43-58: error: invalid reference: '$stmt.list.field'
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:33.11-34.69:  symbol not found in production: stmt
37305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:33.40-43:     possibly meant: $then.field, hiding $[stmt.list].field at $4
37405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:33.61-64:     possibly meant: $else.field, hiding $[stmt.list].field at $6
37505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:36.43-54: error: invalid reference: '$[stmt.list]'
37605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:35.11-36.71:  symbol not found in production: stmt.list
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:35.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
37805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:35.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
37905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:38.43-49: error: invalid reference: '$then.1'
38005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:37.11-38.60:  symbol not found in production: then
38105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:37.40-45:     possibly meant: $[then.1] at $4
38205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:40.43-55: error: invalid reference: '$then.1.field'
38305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:39.11-40.66:  symbol not found in production: then
38405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:39.40-45:     possibly meant: $[then.1].field at $4
38505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:42.44-50: error: invalid reference: '$stmt.x'
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:41.12-42.57:  symbol not found in production: stmt
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:41.36-41:     possibly meant: $[stmt.x].x, hiding $stmt.x at $4
38805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:41.36-41:     possibly meant: $[stmt.x] at $4
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:44.13-22: error: invalid reference: '$if-stmt-a'
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:43.12-44.59:  symbol not found in production: if
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:43.1-9:       possibly meant: $[if-stmt-a] at $$
39205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:46.46-54: error: invalid reference: '$then-a.f'
39305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:45.12-46.65:  symbol not found in production: then
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:45.41-46:     possibly meant: $[then-a].f at $4
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
39705436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-fcaret -o test.c test.y], 1, [],
39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:24.36-41: error: invalid reference: '$cond1'
39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt1 = new IfStmt($cond1, $then.f1, $else); };
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    ^^^^^^
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:23.11-24.62:  symbol not found in production: cond1
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt1: IF expr[cond] THEN stmt[then] ELSE stmt.list[else] FI
40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
40405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:26.43-53: error: invalid reference: '$stmt.field'
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt2 = new IfStmt($cond, $stmt.field, 0); };
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^^^^^^^^
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:25.11-26.60:  symbol not found in production: stmt
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt2: IF expr[cond] THEN stmt[then] FI
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:25.35-38:     possibly meant: $then.field, hiding $stmt.field at $4
41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt2: IF expr[cond] THEN stmt[then] FI
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   ^^^^
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:28.43-52: error: invalid reference: '$stmt.list'
41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt3 = new IfStmt($cond, $stmt.list, 0); };
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^^^^^^^
41605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:27.11-28.59:  symbol not found in production: stmt
41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt3: IF expr[cond] THEN stmt.list FI
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:27.30-38:     possibly meant: $[stmt.list] at $4
42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt3: IF expr[cond] THEN stmt.list FI
42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              ^^^^^^^^^
42205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:30.43-46: error: ambiguous reference: '$xyz'
42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt4 = new IfStmt($cond, $xyz, $cond); };
42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:29.35-37:     refers to: $xyz at $4
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt4: IF expr[cond] THEN stmt[xyz] ELSE stmt[xyz] FI
42705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   ^^^
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:29.50-52:     refers to: $xyz at $6
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt4: IF expr[cond] THEN stmt[xyz] ELSE stmt[xyz] FI
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                                  ^^^
43105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:32.43-52: error: invalid reference: '$stmt.list'
43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt5 = new IfStmt($cond, $stmt.list, $else); };
43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^^^^^^^
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:31.11-32.63:  symbol not found in production: stmt
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:31.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        ^^^^
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:31.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                                             ^^^^
44305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:34.43-58: error: invalid reference: '$stmt.list.field'
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt6 = new IfStmt($cond, $stmt.list.field, $else); };
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^^^^^^^^^^^^^
44605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:33.11-34.69:  symbol not found in production: stmt
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:33.40-43:     possibly meant: $then.field, hiding $[stmt.list].field at $4
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        ^^^^
45205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:33.61-64:     possibly meant: $else.field, hiding $[stmt.list].field at $6
45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                                             ^^^^
45505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:36.43-54: error: invalid reference: '$[stmt.list]'
45605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt7 = new IfStmt($cond, $[stmt.list].field, $else); };
45705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^^^^^^^^^
45805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:35.11-36.71:  symbol not found in production: stmt.list
45905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
46105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:35.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
46205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        ^^^^
46405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:35.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
46505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                                             ^^^^
46705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:38.43-49: error: invalid reference: '$then.1'
46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt8 = new IfStmt($cond, $then.1, $else); };
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^^^^
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:37.11-38.60:  symbol not found in production: then
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt8: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
47305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:37.40-45:     possibly meant: $[then.1] at $4
47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt8: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        ^^^^^^
47605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:40.43-55: error: invalid reference: '$then.1.field'
47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt9 = new IfStmt($cond, $then.1.field, $else); };
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                           ^^^^^^^^^^^^^
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:39.11-40.66:  symbol not found in production: then
48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt9: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:39.40-45:     possibly meant: $[then.1].field at $4
48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt9: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        ^^^^^^
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:42.44-50: error: invalid reference: '$stmt.x'
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if_stmt10 = new IfStmt($cond, $stmt.x, 0); };
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                            ^^^^^^^
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:41.12-42.57:  symbol not found in production: stmt
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:41.36-41:     possibly meant: $[stmt.x].x, hiding $stmt.x at $4
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    ^^^^^^
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:41.36-41:     possibly meant: $[stmt.x] at $4
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    ^^^^^^
49705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:44.13-22: error: invalid reference: '$if-stmt-a'
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $if-stmt-a = new IfStmt($cond, $then, $else); };
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang             ^^^^^^^^^^
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:43.12-44.59:  symbol not found in production: if
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if-stmt-a: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:43.1-9:       possibly meant: $[if-stmt-a] at $$
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if-stmt-a: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ^^^^^^^^^
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:46.46-54: error: invalid reference: '$then-a.f'
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang           { $[if-stmt-b] = new IfStmt($cond, $then-a.f, $else); };
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                              ^^^^^^^^^
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:45.12-46.65:  symbol not found in production: then
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if-stmt-b: IF expr[cond] THEN if-stmt-a[then-a] ELSE stmt.list[else] FI
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:45.41-46:     possibly meant: $[then-a].f at $4
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if-stmt-b: IF expr[cond] THEN if-stmt-a[then-a] ELSE stmt.list[else] FI
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                         ^^^^^^
51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51705436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
51805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
52005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
52105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Missing identifiers in brackets])
52205436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
52305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
52505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart: foo[] bar
52605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { s = $foo; }
52705436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
52805436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
52905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:11.12: error: an identifier expected
53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
53105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53505436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Redundant words in brackets])
53605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
53905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart: foo[ a d ] bar
54005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { s = $foo; }
54105436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
54205436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
54305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:11.15: error: unexpected identifier in bracketed name: 'd'
54405436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
54505436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
54605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
54705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
54805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
54905436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Comments in brackets])
55005436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
55105436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
55205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
55305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart: foo[/* comment */] bar
55405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { s = $foo; }
55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
55605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
55705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:11.25: error: an identifier expected
55805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
55905436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
56205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56305436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Stray symbols in brackets])
56405436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
56505436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
56605436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
56705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart: foo[ % /* aaa */ *&-.+\000\001\002\377 ] bar
56805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { s = $foo; }
56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
57005436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CHECK([[$PERL -pi -e 's/\\(\d{3})/chr(oct($1))/ge' test.y || exit 77]])
57105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:11.13: error: invalid character in bracketed name: '%'
57305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:11.25-27: error: invalid characters in bracketed name: '*&-'
57405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:11.29-30: error: invalid characters in bracketed name: '+\0\001\002\377'
57505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
57605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
57705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
57805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
57905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
58005436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Redundant words in LHS brackets])
58105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
58205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
58405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart[a s]: foo;
58505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
58605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
58705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:11.9: error: unexpected identifier in bracketed name: 's'
58805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
58905436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
59005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Bison used to free twice the named ref for "a", since a single copy
59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# was used in two rules.
59505436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Factored LHS])
59605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
59705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
59805436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
59905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart[a]: "foo" | "bar";
60005436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
60105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y])
60205436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
60305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
60505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([Unresolved references])
60705436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA_GRAMMAR([test.y],
60805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
60905436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
61005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstat:
61105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  sym_a sym_b { func($sym.field); }
61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($<aa>sym.field); }
61305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($[sym.field]); }
61405436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($<aa>[sym.field]); }
61505436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($sym); }
61605436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($<aa>sym); }
61705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($[sym]); } sym_a sym_b { func($<aa>[sym]); }
61805436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
61905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
62005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstat1:
62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  sym_a sym_b { func($sym-field); }
62205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($<aa>sym-field); }
62305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($[sym-field]); }
62405436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($<aa>[sym-field]); }
62505436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($sym); }
62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($<aa>sym); }
62705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| sym_a sym_b { func($[sym]); } sym_a sym_b { func($<aa>[sym]); }
62805436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
62905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
63005436638acc7c010349a69c3395f1a57c642dc62Ying Wangsym_a: 'a';
63105436638acc7c010349a69c3395f1a57c642dc62Ying Wangsym_b: 'b';
63205436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
63305436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([-o test.c test.y], 1, [],
63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:12.22-31: error: invalid reference: '$sym.field'
63505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:12.3-35:      symbol not found in production: sym
63605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:13.22-35: error: invalid reference: '$<aa>sym.field'
63705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:13.3-39:      symbol not found in production: sym
63805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:14.22-33: error: invalid reference: '$[sym.field]'
63905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:14.3-37:      symbol not found in production: sym.field
64005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:15.22-37: error: invalid reference: '$<aa>[sym.field]'
64105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:15.3-41:      symbol not found in production: sym.field
64205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:16.22-25: error: invalid reference: '$sym'
64305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:16.3-29:      symbol not found in production: sym
64405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:17.22-29: error: invalid reference: '$<aa>sym'
64505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:17.3-33:      symbol not found in production: sym
64605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:18.22-27: error: invalid reference: '$[sym]'
64705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:18.3-65:      symbol not found in production before $3: sym
64805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:18.52-61: error: invalid reference: '$<aa>[sym]'
64905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:18.3-65:      symbol not found in production: sym
65005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:22.22-31: error: invalid reference: '$sym-field'
65105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:22.3-35:      symbol not found in production: sym
65205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:23.22-35: error: invalid reference: '$<aa>sym-field'
65305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:23.3-39:      symbol not found in production: sym
65405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:24.22-33: error: invalid reference: '$[sym-field]'
65505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:24.3-37:      symbol not found in production: sym-field
65605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:25.22-37: error: invalid reference: '$<aa>[sym-field]'
65705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:25.3-41:      symbol not found in production: sym-field
65805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:26.22-25: error: invalid reference: '$sym'
65905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:26.3-29:      symbol not found in production: sym
66005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:27.22-29: error: invalid reference: '$<aa>sym'
66105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:27.3-33:      symbol not found in production: sym
66205436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:28.22-27: error: invalid reference: '$[sym]'
66305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:28.3-65:      symbol not found in production before $3: sym
66405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:28.52-61: error: invalid reference: '$<aa>[sym]'
66505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:28.3-65:      symbol not found in production: sym
66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
66705436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
66805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
66905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#######################################################################
67005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
67105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_SETUP([[$ or @ followed by . or -]])
67205436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA([[test.y]],
67305436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
67405436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
67505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart:
67605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  .field { $.field; }
67705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| 'a'    { @.field; }
67805436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
67905436638acc7c010349a69c3395f1a57c642dc62Ying Wang.field: ;
68005436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
68105436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([[test.y]], [[1]], [],
68205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:4.12-18: error: invalid reference: '$.field'
68305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:4.13:        syntax error after '$', expecting integer, letter, '_', '@<:@', or '$'
68405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:4.3-8:       possibly meant: $[.field] at $1
68505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:5.12-18: error: invalid reference: '@.field'
68605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:5.13:        syntax error after '@', expecting integer, letter, '_', '@<:@', or '$'
68705436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
68805436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_DATA([[test.y]],
68905436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[
69005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%%
69105436638acc7c010349a69c3395f1a57c642dc62Ying Wangstart:
69205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  'a' { $-field; }
69305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| 'b' { @-field; }
69405436638acc7c010349a69c3395f1a57c642dc62Ying Wang;
69505436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
69605436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_BISON_CHECK([[test.y]], [[0]], [],
69705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[[test.y:4.9: warning: stray '$'
69805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest.y:5.9: warning: stray '@'
69905436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])
70005436638acc7c010349a69c3395f1a57c642dc62Ying WangAT_CLEANUP
701