]>
git.saurik.com Git - bison.git/blob - src/reader.c
232e0b0cb8b233788aae1caf1d7159bc2f4c90ce
1 /* Input parser for bison
2 Copyright (C) 1984, 86, 89, 92, 98, 2000 Free Software Foundation, Inc.
4 This file is part of Bison, the GNU Compiler Compiler.
6 Bison is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 Bison is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Bison; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 /* Read in the grammar specification and record it in the format
23 described in gram.h. All guards are copied into the fguard file
24 and all actions into faction, in each case forming the body of a C
25 function (yyguard or yyaction) which contains a switch statement to
26 decide which guard or action to execute.
28 The entry point is reader (). */
58 #define YYLTYPE yyltype\n\
62 /* Number of slots allocated (but not necessarily used yet) in `rline' */
63 static int rline_allocated
;
65 extern int definesflag
;
66 extern int nolinesflag
;
67 extern int noparserflag
;
68 extern int rawtoknumflag
;
69 extern bucket
*symval
;
71 extern int expected_conflicts
;
72 extern char *token_buffer
;
75 extern void init_lex
PARAMS((void));
76 extern char *grow_token_buffer
PARAMS((char *));
77 extern void tabinit
PARAMS((void));
78 extern void output_headers
PARAMS((void));
79 extern void output_trailers
PARAMS((void));
80 extern void free_symtab
PARAMS((void));
81 extern void open_extra_files
PARAMS((void));
82 extern char *printable_version
PARAMS((int));
83 extern void unlex
PARAMS((int));
85 extern int skip_white_space
PARAMS((void));
86 extern int parse_percent_token
PARAMS((void));
87 extern int lex
PARAMS((void));
92 struct symbol_list
*next
;
99 extern void reader
PARAMS((void));
100 extern void reader_output_yylsp
PARAMS((FILE *));
102 static void read_declarations
PARAMS((void));
103 static void copy_definition
PARAMS((void));
104 static void parse_token_decl
PARAMS((int, int));
105 static void parse_start_decl
PARAMS((void));
106 static void parse_type_decl
PARAMS((void));
107 static void parse_assoc_decl
PARAMS((int));
108 static void parse_union_decl
PARAMS((void));
109 static void parse_expect_decl
PARAMS((void));
110 static char *get_type_name
PARAMS((int, symbol_list
*));
111 static void copy_guard
PARAMS((symbol_list
*, int));
112 static void parse_thong_decl
PARAMS((void));
113 static void copy_action
PARAMS((symbol_list
*, int));
114 static bucket
*gensym
PARAMS((void));
115 static void readgram
PARAMS((void));
116 static void record_rule_line
PARAMS((void));
117 static void packsymbols
PARAMS((void));
118 static void output_token_defines
PARAMS((FILE *));
119 static void packgram
PARAMS((void));
120 static int read_signed_integer
PARAMS((FILE *));
123 static int get_type
PARAMS((void));
129 static symbol_list
*grammar
;
130 static int start_flag
;
131 static bucket
*startval
;
133 /* Nonzero if components of semantic values are used, implying
134 they must be unions. */
135 static int value_components_used
;
137 static int typed
; /* nonzero if %union has been seen. */
139 static int lastprec
; /* incremented for each %left, %right or %nonassoc seen */
141 static int gensym_count
; /* incremented for each generated symbol */
143 static bucket
*errtoken
;
144 static bucket
*undeftoken
;
146 /* Nonzero if any action or guard uses the @n construct. */
147 static int yylsp_needed
;
151 skip_to_char (int target
)
155 complain (_(" Skipping to next \\n"));
157 complain (_(" Skipping to next %c"), target
);
160 c
= skip_white_space();
161 while (c
!= target
&& c
!= EOF
);
167 /* Dump the string from FIN to FOUT. MATCH is the delimiter of
168 the string (either ' or "). */
171 copy_string (FILE *fin
, FILE *fout
, int match
)
181 fatal (_("unterminated string at end of file"));
184 complain (_("unterminated string"));
186 c
= match
; /* invent terminator */
196 fatal (_("unterminated string at end of file"));
209 /* Dump the comment from IN to OUT1 and OUT2. C is either `*' or `/',
210 depending upon the type of comments used. OUT2 might be NULL. */
213 copy_comment2 (FILE *in
, FILE *out1
, FILE* out2
, int c
)
218 cplus_comment
= (c
== '/');
227 if (!cplus_comment
&& c
== '*')
257 fatal (_("unterminated comment"));
269 /* Dump the comment from FIN to FOUT. C is either `*' or `/',
270 depending upon the type of comments used. */
273 copy_comment (FILE *fin
, FILE *fout
, int c
)
275 copy_comment2 (fin
, fout
, NULL
, c
);
283 startval
= NULL
; /* start symbol not specified yet. */
286 /* initially assume token number translation not needed. */
289 /* Nowadays translations is always set to 1, since we give `error' a
290 user-token-number to satisfy the Posix demand for YYERRCODE==256.
298 rline_allocated
= 10;
299 rline
= NEW2 (rline_allocated
, short);
315 /* Initialize the symbol table. */
317 /* Construct the error token */
318 errtoken
= getsym ("error");
319 errtoken
->class = STOKEN
;
320 errtoken
->user_token_number
= 256; /* Value specified by POSIX. */
321 /* Construct a token that represents all undefined literal tokens.
322 It is always token number 2. */
323 undeftoken
= getsym ("$undefined.");
324 undeftoken
->class = STOKEN
;
325 undeftoken
->user_token_number
= 2;
327 /* Read the declaration section. Copy %{ ... %} groups to FTABLE
328 and FDEFINES file. Also notice any %token, %left, etc. found
332 /* %s, made from %s\n\
333 by GNU bison %s. */\n\
335 noparserflag
? "Bison-generated parse tables" : "A Bison parser",
339 fputs ("#define YYBISON 1 /* Identify Bison output. */\n\n", ftable
);
340 read_declarations ();
341 /* Start writing the guard and action files, if they are needed. */
343 /* Read in the grammar, build grammar in list form. Write out
344 guards and actions. */
346 /* Now we know whether we need the line-number stack. If we do,
347 write its type into the .tab.h file. */
349 reader_output_yylsp (fdefines
);
350 /* Write closing delimiters for actions and guards. */
353 fprintf ("#define YYLSP_NEEDED\n\n", ftable
);
354 /* Assign the symbols their symbol numbers. Write #defines for the
355 token symbols into FDEFINES if requested. */
357 /* Convert the grammar into the format described in gram.h. */
359 /* Free the symbol table data structure since symbols are now all
360 referred to by symbol number. */
365 reader_output_yylsp (FILE *f
)
368 fprintf(f
, LTYPESTR
);
371 /* Read from finput until `%%' is seen. Discard the `%%'. Handle any
372 `%' declarations, and copy the contents of any `%{ ... %}' groups
376 read_declarations (void)
383 c
= skip_white_space();
387 tok
= parse_percent_token();
394 case PERCENT_LEFT_CURLY
:
399 parse_token_decl (STOKEN
, SNTERM
);
403 parse_token_decl (SNTERM
, STOKEN
);
425 parse_assoc_decl(LEFT_ASSOC
);
429 parse_assoc_decl(RIGHT_ASSOC
);
433 parse_assoc_decl(NON_ASSOC
);
436 case SEMANTIC_PARSER
:
437 if (semantic_parser
== 0)
452 complain (_("unrecognized: %s"), token_buffer
);
457 fatal (_("no input grammar"));
460 complain (_("unknown character: %s"), printable_version(c
));
467 /* Copy the contents of a `%{ ... %}' into the definitions file. The
468 `%{' has already been read. Return after reading the `%}'. */
471 copy_definition (void)
474 /* -1 while reading a character if prev char was %. */
475 register int after_percent
;
478 fprintf(fattrs
, "#line %d \"%s\"\n", lineno
, infile
);
499 copy_string (finput
, fattrs
, c
);
505 if (c
!= '*' && c
!= '/')
507 copy_comment (finput
, fattrs
, c
);
512 _("unterminated `%{' definition"));
534 /* parse what comes after %token or %nterm.
535 For %token, what_is is STOKEN and what_is_not is SNTERM.
536 For %nterm, the arguments are reversed. */
539 parse_token_decl (int what_is
, int what_is_not
)
541 register int token
= 0;
542 register char *typename
= 0;
543 register struct bucket
*symbol
= NULL
; /* pts to symbol being defined */
548 int tmp_char
= ungetc (skip_white_space (), finput
);
553 fatal (_("Premature EOF after %s"), token_buffer
);
561 if (token
== TYPENAME
)
563 k
= strlen(token_buffer
);
564 typename
= NEW2(k
+ 1, char);
565 strcpy(typename
, token_buffer
);
566 value_components_used
= 1;
569 else if (token
== IDENTIFIER
&& *symval
->tag
== '\"'
573 symval
->class = STOKEN
;
574 symval
->type_name
= typename
;
575 symval
->user_token_number
= symbol
->user_token_number
;
576 symbol
->user_token_number
= SALIAS
;
578 symval
->alias
= symbol
;
579 symbol
->alias
= symval
;
582 nsyms
--; /* symbol and symval combined are only one symbol */
584 else if (token
== IDENTIFIER
)
586 int oldclass
= symval
->class;
589 if (symbol
->class == what_is_not
)
590 complain (_("symbol %s redefined"), symbol
->tag
);
591 symbol
->class = what_is
;
592 if (what_is
== SNTERM
&& oldclass
!= SNTERM
)
593 symbol
->value
= nvars
++;
597 if (symbol
->type_name
== NULL
)
598 symbol
->type_name
= typename
;
599 else if (strcmp(typename
, symbol
->type_name
) != 0)
600 complain (_("type redeclaration for %s"), symbol
->tag
);
603 else if (symbol
&& token
== NUMBER
)
605 symbol
->user_token_number
= numval
;
610 complain (_("`%s' is invalid in %s"),
612 (what_is
== STOKEN
) ? "%token" : "%nterm");
619 /* parse what comes after %thong
621 %thong <type> token number literal
622 the <type> or number may be omitted. The number specifies the
625 Two symbols are entered in the table, one for the token symbol and
626 one for the literal. Both are given the <type>, if any, from the declaration.
627 The ->user_token_number of the first is SALIAS and the ->user_token_number
628 of the second is set to the number, if any, from the declaration.
629 The two symbols are linked via pointers in their ->alias fields.
631 during output_defines_table, the symbol is reported
632 thereafter, only the literal string is retained
633 it is the literal string that is output to yytname
637 parse_thong_decl (void)
640 register struct bucket
*symbol
;
641 register char *typename
= 0;
645 token
= lex(); /* fetch typename or first token */
646 if (token
== TYPENAME
) {
647 k
= strlen(token_buffer
);
648 typename
= NEW2(k
+ 1, char);
649 strcpy(typename
, token_buffer
);
650 value_components_used
= 1;
651 token
= lex(); /* fetch first token */
654 /* process first token */
656 if (token
!= IDENTIFIER
)
658 complain (_("unrecognized item %s, expected an identifier"),
663 symval
->class = STOKEN
;
664 symval
->type_name
= typename
;
665 symval
->user_token_number
= SALIAS
;
668 token
= lex(); /* get number or literal string */
670 if (token
== NUMBER
) {
672 token
= lex(); /* okay, did number, now get literal */
676 /* process literal string token */
678 if (token
!= IDENTIFIER
|| *symval
->tag
!= '\"')
680 complain (_("expected string constant instead of %s"),
685 symval
->class = STOKEN
;
686 symval
->type_name
= typename
;
687 symval
->user_token_number
= usrtoknum
;
689 symval
->alias
= symbol
;
690 symbol
->alias
= symval
;
692 nsyms
--; /* symbol and symval combined are only one symbol */
696 /* Parse what comes after %start */
699 parse_start_decl (void)
702 complain (_("multiple %s declarations"), "%start");
703 if (lex () != IDENTIFIER
)
704 complain (_("invalid %s declaration"), "%start");
714 /* read in a %type declaration and record its information for get_type_name to access */
717 parse_type_decl (void)
722 if (lex() != TYPENAME
)
724 complain ("%s", _("%type declaration has no <typename>"));
729 k
= strlen(token_buffer
);
730 name
= NEW2(k
+ 1, char);
731 strcpy(name
, token_buffer
);
736 int tmp_char
= ungetc (skip_white_space (), finput
);
741 fatal (_("Premature EOF after %s"), token_buffer
);
753 if (symval
->type_name
== NULL
)
754 symval
->type_name
= name
;
755 else if (strcmp(name
, symval
->type_name
) != 0)
756 complain (_("type redeclaration for %s"), symval
->tag
);
761 complain (_("invalid %%type declaration due to item: %s"),
770 /* read in a %left, %right or %nonassoc declaration and record its information. */
771 /* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC. */
774 parse_assoc_decl (int assoc
)
777 register char *name
= NULL
;
778 register int prev
= 0;
780 lastprec
++; /* Assign a new precedence level, never 0. */
785 int tmp_char
= ungetc (skip_white_space (), finput
);
790 fatal (_("Premature EOF after %s"), token_buffer
);
798 k
= strlen(token_buffer
);
799 name
= NEW2(k
+ 1, char);
800 strcpy(name
, token_buffer
);
807 if (symval
->prec
!= 0)
808 complain (_("redefining precedence of %s"), symval
->tag
);
809 symval
->prec
= lastprec
;
810 symval
->assoc
= assoc
;
811 if (symval
->class == SNTERM
)
812 complain (_("symbol %s redefined"), symval
->tag
);
813 symval
->class = STOKEN
;
815 { /* record the type, if one is specified */
816 if (symval
->type_name
== NULL
)
817 symval
->type_name
= name
;
818 else if (strcmp(name
, symval
->type_name
) != 0)
819 complain (_("type redeclaration for %s"), symval
->tag
);
824 if (prev
== IDENTIFIER
)
826 symval
->user_token_number
= numval
;
831 complain (_("invalid text (%s) - number should be after identifier"),
841 complain (_("unexpected item: %s"), token_buffer
);
852 /* copy the union declaration into fattrs (and fdefines),
853 where it is made into the
854 definition of YYSTYPE, the type of elements of the parser value stack. */
857 parse_union_decl (void)
860 register int count
= 0;
863 complain (_("multiple %s declarations"), "%union");
868 fprintf (fattrs
, "\n#line %d \"%s\"\n", lineno
, infile
);
870 fprintf (fattrs
, "\n");
872 fprintf (fattrs
, "typedef union");
874 fprintf (fdefines
, "typedef union");
892 if (c
!= '*' && c
!= '/')
894 copy_comment2 (finput
, fattrs
, fdefines
, c
);
904 complain (_("unmatched %s"), "`}'");
908 fprintf (fattrs
, " YYSTYPE;\n");
910 fprintf (fdefines
, " YYSTYPE;\n");
911 /* JF don't choke on trailing semi */
912 c
= skip_white_space ();
923 /* parse the declaration %expect N which says to expect N
924 shift-reduce conflicts. */
927 parse_expect_decl (void)
934 while (c
== ' ' || c
== '\t')
938 while (c
>= '0' && c
<= '9')
948 if (count
<= 0 || count
> 10)
949 complain ("%s", _("argument of %expect is not an integer"));
950 expected_conflicts
= atoi (buffer
);
953 /* that's all of parsing the declaration section */
955 /* FIN is pointing to a location (i.e., a `@'). Output to FOUT
956 a reference to this location. STACK_OFFSET is the number of values
957 in the current rule so far, which says where to find `$0' with
958 respect to the top of the stack. */
960 copy_at (FILE *fin
, FILE *fout
, int stack_offset
)
967 fprintf (fout
, "yyloc");
970 else if (isdigit(c
) || c
== '-')
975 n
= read_signed_integer (fin
);
977 fprintf (fout
, "yylsp[%d]", n
- stack_offset
);
981 complain (_("@%s is invalid"), printable_version (c
));
985 /* Get the data type (alternative in the union) of the value for
986 symbol n in rule rule. */
989 get_type_name (int n
, symbol_list
*rule
)
992 register symbol_list
*rp
;
996 complain (_("invalid $ value"));
1006 if (rp
== NULL
|| rp
->sym
== NULL
)
1008 complain (_("invalid $ value"));
1014 return rp
->sym
->type_name
;
1019 /* After `%guard' is seen in the input file, copy the actual guard
1020 into the guards file. If the guard is followed by an action, copy
1021 that into the actions file. STACK_OFFSET is the number of values
1022 in the current rule so far, which says where to find `$0' with
1023 respect to the top of the stack, for the simple parser in which the
1024 stack is not popped until after the guard is run. */
1027 copy_guard (symbol_list
*rule
, int stack_offset
)
1032 register char *type_name
;
1035 /* offset is always 0 if parser has already popped the stack pointer */
1036 if (semantic_parser
) stack_offset
= 0;
1038 fprintf(fguard
, "\ncase %d:\n", nrules
);
1040 fprintf (fguard
, "#line %d \"%s\"\n", lineno
, infile
);
1046 while (brace_flag
? (count
> 0) : (c
!= ';'))
1067 complain (_("unmatched %s"), "`}'");
1068 c
= getc(finput
); /* skip it */
1074 copy_string (finput
, fguard
, c
);
1080 if (c
!= '*' && c
!= '/')
1082 copy_comment (finput
, fguard
, c
);
1091 register char *cp
= token_buffer
;
1093 while ((c
= getc(finput
)) != '>' && c
> 0)
1095 if (cp
== token_buffer
+ maxtoken
)
1096 cp
= grow_token_buffer(cp
);
1101 type_name
= token_buffer
;
1108 fprintf(fguard
, "yyval");
1110 type_name
= rule
->sym
->type_name
;
1112 fprintf(fguard
, ".%s", type_name
);
1113 if(!type_name
&& typed
)
1114 complain (_("$$ of `%s' has no declared type"),
1117 else if (isdigit(c
) || c
== '-')
1120 n
= read_signed_integer (finput
);
1123 if (!type_name
&& n
> 0)
1124 type_name
= get_type_name(n
, rule
);
1126 fprintf(fguard
, "yyvsp[%d]", n
- stack_offset
);
1128 fprintf(fguard
, ".%s", type_name
);
1129 if (!type_name
&& typed
)
1130 complain (_("$%d of `%s' has no declared type"),
1135 complain (_("$%s is invalid"), printable_version (c
));
1139 copy_at (finput
, fguard
, stack_offset
);
1144 _("unterminated %guard clause"));
1150 if (c
!= '}' || count
!= 0)
1154 c
= skip_white_space();
1156 fprintf(fguard
, ";\n break;}");
1158 copy_action (rule
, stack_offset
);
1161 c
= getc(finput
); /* why not skip_white_space -wjh */
1163 copy_action (rule
, stack_offset
);
1171 /* Assuming that a `{' has just been seen, copy everything up to the
1172 matching `}' into the actions file. STACK_OFFSET is the number of
1173 values in the current rule so far, which says where to find `$0'
1174 with respect to the top of the stack. */
1177 copy_action (symbol_list
*rule
, int stack_offset
)
1182 register char *type_name
;
1184 /* offset is always 0 if parser has already popped the stack pointer */
1185 if (semantic_parser
)
1188 fprintf (faction
, "\ncase %d:\n", nrules
);
1190 fprintf (faction
, "#line %d \"%s\"\n", lineno
, infile
);
1191 putc ('{', faction
);
1214 copy_string (finput
, faction
, c
);
1220 if (c
!= '*' && c
!= '/')
1222 copy_comment (finput
, faction
, c
);
1231 register char *cp
= token_buffer
;
1233 while ((c
= getc(finput
)) != '>' && c
> 0)
1235 if (cp
== token_buffer
+ maxtoken
)
1236 cp
= grow_token_buffer(cp
);
1241 type_name
= token_buffer
;
1242 value_components_used
= 1;
1248 fprintf(faction
, "yyval");
1250 type_name
= get_type_name(0, rule
);
1252 fprintf(faction
, ".%s", type_name
);
1253 if(!type_name
&& typed
)
1254 complain (_("$$ of `%s' has no declared type"),
1257 else if (isdigit(c
) || c
== '-')
1260 n
= read_signed_integer(finput
);
1263 if (!type_name
&& n
> 0)
1264 type_name
= get_type_name(n
, rule
);
1266 fprintf(faction
, "yyvsp[%d]", n
- stack_offset
);
1268 fprintf(faction
, ".%s", type_name
);
1269 if(!type_name
&& typed
)
1270 complain (_("$%d of `%s' has no declared type"),
1275 complain (_("$%s is invalid"), printable_version (c
));
1280 copy_at (finput
, faction
, stack_offset
);
1284 fatal (_("unmatched %s"), "`{'");
1293 /* above loop exits when c is '}' */
1302 fprintf(faction
, ";\n break;}");
1307 /* generate a dummy symbol, a nonterminal,
1308 whose name cannot conflict with the user's names. */
1313 register bucket
*sym
;
1315 sprintf (token_buffer
, "@%d", ++gensym_count
);
1316 sym
= getsym(token_buffer
);
1317 sym
->class = SNTERM
;
1318 sym
->value
= nvars
++;
1322 /* Parse the input grammar into a one symbol_list structure.
1323 Each rule is represented by a sequence of symbols: the left hand side
1324 followed by the contents of the right hand side, followed by a null pointer
1325 instead of a symbol to terminate the rule.
1326 The next symbol is the lhs of the following rule.
1328 All guards and actions are copied out to the appropriate files,
1329 labelled by the rule number they apply to. */
1335 register bucket
*lhs
= NULL
;
1336 register symbol_list
*p
;
1337 register symbol_list
*p1
;
1338 register bucket
*bp
;
1340 symbol_list
*crule
; /* points to first symbol_list of current rule. */
1341 /* its symbol is the lhs of the rule. */
1342 symbol_list
*crule1
; /* points to the symbol_list preceding crule. */
1348 while (t
!= TWO_PERCENTS
&& t
!= ENDFILE
)
1350 if (t
== IDENTIFIER
|| t
== BAR
)
1352 register int actionflag
= 0;
1353 int rulelength
= 0; /* number of symbols in rhs of this rule so far */
1354 int xactions
= 0; /* JF for error checking */
1355 bucket
*first_rhs
= 0;
1357 if (t
== IDENTIFIER
)
1370 complain (_("ill-formed rule: initial symbol not followed by colon"));
1375 if (nrules
== 0 && t
== BAR
)
1377 complain (_("grammar starts with vertical bar"));
1378 lhs
= symval
; /* BOGUS: use a random symval */
1380 /* start a new rule and record its lhs. */
1385 record_rule_line ();
1387 p
= NEW(symbol_list
);
1399 /* mark the rule's lhs as a nonterminal if not already so. */
1401 if (lhs
->class == SUNKNOWN
)
1403 lhs
->class = SNTERM
;
1407 else if (lhs
->class == STOKEN
)
1408 complain (_("rule given for %s, which is a token"), lhs
->tag
);
1410 /* read the rhs of the rule. */
1418 crule
->ruleprec
= symval
;
1422 if (! (t
== IDENTIFIER
|| t
== LEFT_CURLY
)) break;
1424 /* If next token is an identifier, see if a colon follows it.
1425 If one does, exit this rule now. */
1426 if (t
== IDENTIFIER
)
1428 register bucket
*ssave
;
1435 if (t1
== COLON
) break;
1437 if(!first_rhs
) /* JF */
1439 /* Not followed by colon =>
1440 process as part of this rule's rhs. */
1443 /* If we just passed an action, that action was in the middle
1444 of a rule, so make a dummy rule to reduce it to a
1448 register bucket
*sdummy
;
1450 /* Since the action was written out with this rule's */
1451 /* number, we must give the new rule this number */
1452 /* by inserting the new rule before it. */
1454 /* Make a dummy nonterminal, a gensym. */
1457 /* Make a new rule, whose body is empty,
1458 before the current one, so that the action
1459 just read can belong to it. */
1462 record_rule_line ();
1463 p
= NEW(symbol_list
);
1468 crule1
= NEW(symbol_list
);
1470 crule1
->next
= crule
;
1472 /* insert the dummy generated by that rule into this rule. */
1474 p
= NEW(symbol_list
);
1482 if (t
== IDENTIFIER
)
1485 p
= NEW(symbol_list
);
1490 else /* handle an action. */
1492 copy_action(crule
, rulelength
);
1494 xactions
++; /* JF */
1497 } /* end of read rhs of rule */
1499 /* Put an empty link in the list to mark the end of this rule */
1500 p
= NEW(symbol_list
);
1506 complain (_("two @prec's in a row"));
1508 crule
->ruleprec
= symval
;
1513 if (! semantic_parser
)
1515 _("%guard present but %semantic_parser not specified"));
1517 copy_guard(crule
, rulelength
);
1520 else if (t
== LEFT_CURLY
)
1522 /* This case never occurs -wjh */
1524 complain (_("two actions at end of one rule"));
1525 copy_action(crule
, rulelength
);
1527 xactions
++; /* -wjh */
1530 /* If $$ is being set in default way, report if any type
1534 && lhs
->type_name
!= first_rhs
->type_name
)
1536 if (lhs
->type_name
== 0
1537 || first_rhs
->type_name
== 0
1538 || strcmp(lhs
->type_name
,first_rhs
->type_name
))
1539 complain (_("type clash (`%s' `%s') on default action"),
1540 lhs
->type_name
? lhs
->type_name
: "",
1541 first_rhs
->type_name
? first_rhs
->type_name
: "");
1543 /* Warn if there is no default for $$ but we need one. */
1544 else if (!xactions
&& !first_rhs
&& lhs
->type_name
!= 0)
1545 complain (_("empty rule for typed nonterminal, and no action"));
1550 /* these things can appear as alternatives to rules. */
1552 a) none of the documentation allows them
1553 b) most of them scan forward until finding a next %
1554 thus they may swallow lots of intervening rules
1556 else if (t
== TOKEN
)
1558 parse_token_decl(STOKEN
, SNTERM
);
1561 else if (t
== NTERM
)
1563 parse_token_decl(SNTERM
, STOKEN
);
1570 else if (t
== UNION
)
1575 else if (t
== EXPECT
)
1577 parse_expect_decl();
1580 else if (t
== START
)
1589 complain (_("invalid input: %s"), token_buffer
);
1594 /* grammar has been read. Do some checking */
1596 if (nsyms
> MAXSHORT
)
1597 fatal (_("too many symbols (tokens plus nonterminals); maximum %d"),
1600 fatal (_("no rules in the input grammar"));
1602 if (typed
== 0 /* JF put out same default YYSTYPE as YACC does */
1603 && !value_components_used
)
1605 /* We used to use `unsigned long' as YYSTYPE on MSDOS,
1606 but it seems better to be consistent.
1607 Most programs should declare their own type anyway. */
1608 fprintf(fattrs
, "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n");
1610 fprintf(fdefines
, "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n");
1613 /* Report any undefined symbols and consider them nonterminals. */
1615 for (bp
= firstsymbol
; bp
; bp
= bp
->next
)
1616 if (bp
->class == SUNKNOWN
)
1618 complain (_("symbol %s is used, but is not defined as a token and has no rules"),
1621 bp
->value
= nvars
++;
1624 ntokens
= nsyms
- nvars
;
1629 record_rule_line (void)
1631 /* Record each rule's source line number in rline table. */
1633 if (nrules
>= rline_allocated
)
1635 rline_allocated
= nrules
* 2;
1636 rline
= (short *) xrealloc ((char *) rline
,
1637 rline_allocated
* sizeof (short));
1639 rline
[nrules
] = lineno
;
1644 /* read in a %type declaration and record its information for get_type_name to access */
1645 /* this is unused. it is only called from the #if 0 part of readgram */
1651 register char *name
;
1657 complain (_("invalid %s declaration"), "%type");
1661 k
= strlen(token_buffer
);
1662 name
= NEW2(k
+ 1, char);
1663 strcpy(name
, token_buffer
);
1678 if (symval
->type_name
== NULL
)
1679 symval
->type_name
= name
;
1680 else if (strcmp(name
, symval
->type_name
) != 0)
1681 complain (_("type redeclaration for %s"), symval
->tag
);
1693 /* Assign symbol numbers, and write definition of token names into
1694 fdefines. Set up vectors tags and sprec of names and precedences
1700 register bucket
*bp
;
1701 register int tokno
= 1;
1703 register int last_user_token_number
;
1704 static char DOLLAR
[] = "$";
1706 /* int lossage = 0; JF set but not used */
1708 tags
= NEW2(nsyms
+ 1, char *);
1710 user_toknums
= NEW2(nsyms
+ 1, int);
1711 user_toknums
[0] = 0;
1713 sprec
= NEW2(nsyms
, short);
1714 sassoc
= NEW2(nsyms
, short);
1716 max_user_token_number
= 256;
1717 last_user_token_number
= 256;
1719 for (bp
= firstsymbol
; bp
; bp
= bp
->next
)
1721 if (bp
->class == SNTERM
)
1723 bp
->value
+= ntokens
;
1727 /* this symbol and its alias are a single token defn.
1728 allocate a tokno, and assign to both check agreement of
1729 ->prec and ->assoc fields and make both the same */
1731 bp
->value
= bp
->alias
->value
= tokno
++;
1733 if (bp
->prec
!= bp
->alias
->prec
)
1735 if (bp
->prec
!= 0 && bp
->alias
->prec
!= 0
1736 && bp
->user_token_number
== SALIAS
)
1737 complain (_("conflicting precedences for %s and %s"),
1738 bp
->tag
, bp
->alias
->tag
);
1740 bp
->alias
->prec
= bp
->prec
;
1742 bp
->prec
= bp
->alias
->prec
;
1745 if (bp
->assoc
!= bp
->alias
->assoc
)
1747 if (bp
->assoc
!= 0 && bp
->alias
->assoc
!= 0
1748 && bp
->user_token_number
== SALIAS
)
1749 complain (_("conflicting assoc values for %s and %s"),
1750 bp
->tag
, bp
->alias
->tag
);
1752 bp
->alias
->assoc
= bp
->assoc
;
1754 bp
->assoc
= bp
->alias
->assoc
;
1757 if (bp
->user_token_number
== SALIAS
)
1758 continue; /* do not do processing below for SALIASs */
1761 else /* bp->class == STOKEN */
1763 bp
->value
= tokno
++;
1766 if (bp
->class == STOKEN
)
1768 if (translations
&& !(bp
->user_token_number
))
1769 bp
->user_token_number
= ++last_user_token_number
;
1770 if (bp
->user_token_number
> max_user_token_number
)
1771 max_user_token_number
= bp
->user_token_number
;
1774 tags
[bp
->value
] = bp
->tag
;
1775 user_toknums
[bp
->value
] = bp
->user_token_number
;
1776 sprec
[bp
->value
] = bp
->prec
;
1777 sassoc
[bp
->value
] = bp
->assoc
;
1785 token_translations
= NEW2(max_user_token_number
+1, short);
1787 /* initialize all entries for literal tokens to 2, the internal
1788 token number for $undefined., which represents all invalid
1790 for (j
= 0; j
<= max_user_token_number
; j
++)
1791 token_translations
[j
] = 2;
1793 for (bp
= firstsymbol
; bp
; bp
= bp
->next
)
1795 if (bp
->value
>= ntokens
)
1796 continue; /* non-terminal */
1797 if (bp
->user_token_number
== SALIAS
)
1799 if (token_translations
[bp
->user_token_number
] != 2)
1800 complain (_("tokens %s and %s both assigned number %d"),
1801 tags
[token_translations
[bp
->user_token_number
]],
1803 bp
->user_token_number
);
1804 token_translations
[bp
->user_token_number
] = bp
->value
;
1808 error_token_number
= errtoken
->value
;
1811 output_token_defines(ftable
);
1813 if (startval
->class == SUNKNOWN
)
1814 fatal (_("the start symbol %s is undefined"), startval
->tag
);
1815 else if (startval
->class == STOKEN
)
1816 fatal (_("the start symbol %s is a token"), startval
->tag
);
1818 start_symbol
= startval
->value
;
1822 output_token_defines(fdefines
);
1826 if (spec_name_prefix
)
1827 fprintf(fdefines
, "\nextern YYSTYPE %slval;\n", spec_name_prefix
);
1829 fprintf(fdefines
, "\nextern YYSTYPE yylval;\n");
1832 if (semantic_parser
)
1833 for (i
= ntokens
; i
< nsyms
; i
++)
1835 /* don't make these for dummy nonterminals made by gensym. */
1836 if (*tags
[i
] != '@')
1837 fprintf(fdefines
, "#define\tNT%s\t%d\n", tags
[i
], i
);
1840 /* `fdefines' is now a temporary file, so we need to copy its
1841 contents in `done', so we can't close it here. */
1848 /* For named tokens, but not literal ones, define the name. The value
1849 is the user token number. */
1852 output_token_defines (FILE *file
)
1855 register char *cp
, *symbol
;
1858 for (bp
= firstsymbol
; bp
; bp
= bp
->next
)
1860 symbol
= bp
->tag
; /* get symbol */
1862 if (bp
->value
>= ntokens
) continue;
1863 if (bp
->user_token_number
== SALIAS
) continue;
1864 if ('\'' == *symbol
) continue; /* skip literal character */
1865 if (bp
== errtoken
) continue; /* skip error token */
1866 if ('\"' == *symbol
)
1868 /* use literal string only if given a symbol with an alias */
1870 symbol
= bp
->alias
->tag
;
1875 /* Don't #define nonliteral tokens whose names contain periods. */
1877 while ((c
= *cp
++) && c
!= '.');
1878 if (c
!= '\0') continue;
1880 fprintf (file
, "#define\t%s\t%d\n", symbol
,
1881 ((translations
&& ! rawtoknumflag
)
1882 ? bp
->user_token_number
1884 if (semantic_parser
)
1885 fprintf (file
, "#define\tT%s\t%d\n", symbol
, bp
->value
);
1893 /* convert the rules into the representation using rrhs, rlhs and ritems. */
1898 register int itemno
;
1899 register int ruleno
;
1900 register symbol_list
*p
;
1901 /* register bucket *bp; JF unused */
1905 ritem
= NEW2(nitems
+ 1, short);
1906 rlhs
= NEW2(nrules
, short) - 1;
1907 rrhs
= NEW2(nrules
, short) - 1;
1908 rprec
= NEW2(nrules
, short) - 1;
1909 rprecsym
= NEW2(nrules
, short) - 1;
1910 rassoc
= NEW2(nrules
, short) - 1;
1918 rlhs
[ruleno
] = p
->sym
->value
;
1919 rrhs
[ruleno
] = itemno
;
1920 ruleprec
= p
->ruleprec
;
1925 ritem
[itemno
++] = p
->sym
->value
;
1926 /* A rule gets by default the precedence and associativity
1927 of the last token in it. */
1928 if (p
->sym
->class == STOKEN
)
1930 rprec
[ruleno
] = p
->sym
->prec
;
1931 rassoc
[ruleno
] = p
->sym
->assoc
;
1936 /* If this rule has a %prec,
1937 the specified symbol's precedence replaces the default. */
1940 rprec
[ruleno
] = ruleprec
->prec
;
1941 rassoc
[ruleno
] = ruleprec
->assoc
;
1942 rprecsym
[ruleno
] = ruleprec
->value
;
1945 ritem
[itemno
++] = -ruleno
;
1954 /* Read a signed integer from STREAM and return its value. */
1957 read_signed_integer (FILE *stream
)
1959 register int c
= getc(stream
);
1960 register int sign
= 1;
1971 n
= 10*n
+ (c
- '0');