summaryrefslogtreecommitdiffstats
path: root/usr.bin/yacc/tests/grammar.y
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/yacc/tests/grammar.y')
-rw-r--r--usr.bin/yacc/tests/grammar.y1183
1 files changed, 0 insertions, 1183 deletions
diff --git a/usr.bin/yacc/tests/grammar.y b/usr.bin/yacc/tests/grammar.y
deleted file mode 100644
index a2f1883..0000000
--- a/usr.bin/yacc/tests/grammar.y
+++ /dev/null
@@ -1,1183 +0,0 @@
-/* $Id: grammar.y,v 1.5 2012/01/15 20:00:59 tom Exp $
- *
- * yacc grammar for C function prototype generator
- * This was derived from the grammar in Appendix A of
- * "The C Programming Language" by Kernighan and Ritchie.
- */
-%expect 1
-%{
-#ifdef YYBISON
-#include <stdlib.h>
-#define YYSTYPE_IS_DECLARED
-#define yyerror yaccError
-#endif
-
-#if defined(YYBISON) || !defined(YYBYACC)
-static void yyerror(const char *s);
-#endif
-%}
-
-%token <text> '(' '*' '&'
- /* identifiers that are not reserved words */
- T_IDENTIFIER T_TYPEDEF_NAME T_DEFINE_NAME
-
- /* storage class */
- T_AUTO T_EXTERN T_REGISTER T_STATIC T_TYPEDEF
- /* This keyword included for compatibility with C++. */
- T_INLINE
- /* This keyword included for compatibility with GCC */
- T_EXTENSION
-
- /* type specifiers */
- T_CHAR T_DOUBLE T_FLOAT T_INT T_VOID
- T_LONG T_SHORT T_SIGNED T_UNSIGNED
- T_ENUM T_STRUCT T_UNION
- /* C9X new types */
- T_Bool T_Complex T_Imaginary
-
- /* type qualifiers */
- T_TYPE_QUALIFIER
-
- /* paired square brackets and everything between them: [ ... ] */
- T_BRACKETS
-
-%token
- /* left brace */
- T_LBRACE
- /* all input to the matching right brace */
- T_MATCHRBRACE
-
- /* three periods */
- T_ELLIPSIS
-
- /* constant expression or paired braces following an equal sign */
- T_INITIALIZER
-
- /* string literal */
- T_STRING_LITERAL
-
- /* asm */
- T_ASM
- /* ( "string literal" ) following asm keyword */
- T_ASMARG
-
- /* va_dcl from <varargs.h> */
- T_VA_DCL
-
-%type <decl_spec> decl_specifiers decl_specifier
-%type <decl_spec> storage_class type_specifier type_qualifier
-%type <decl_spec> struct_or_union_specifier enum_specifier
-%type <decl_list> init_declarator_list
-%type <declarator> init_declarator declarator direct_declarator
-%type <declarator> abs_declarator direct_abs_declarator
-%type <param_list> parameter_type_list parameter_list
-%type <parameter> parameter_declaration
-%type <param_list> opt_identifier_list identifier_list
-%type <text> struct_or_union pointer opt_type_qualifiers type_qualifier_list
- any_id identifier_or_ref
-%type <text> enumeration
-
-%{
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-
-#define OPT_LINTLIBRARY 1
-
-#ifndef TRUE
-#define TRUE (1)
-#endif
-
-#ifndef FALSE
-#define FALSE (0)
-#endif
-
-/* #include "cproto.h" */
-#define MAX_TEXT_SIZE 1024
-
-/* Prototype styles */
-#if OPT_LINTLIBRARY
-#define PROTO_ANSI_LLIB -2 /* form ANSI lint-library source */
-#define PROTO_LINTLIBRARY -1 /* form lint-library source */
-#endif
-#define PROTO_NONE 0 /* do not output any prototypes */
-#define PROTO_TRADITIONAL 1 /* comment out parameters */
-#define PROTO_ABSTRACT 2 /* comment out parameter names */
-#define PROTO_ANSI 3 /* ANSI C prototype */
-
-typedef int PrototypeStyle;
-
-typedef char boolean;
-
-extern boolean types_out;
-extern PrototypeStyle proto_style;
-
-#define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB)
-#define knrLintLibrary() (proto_style == PROTO_LINTLIBRARY)
-#define lintLibrary() (knrLintLibrary() || ansiLintLibrary())
-
-#if OPT_LINTLIBRARY
-#define FUNC_UNKNOWN -1 /* unspecified */
-#else
-#define FUNC_UNKNOWN 0 /* unspecified (same as FUNC_NONE) */
-#endif
-#define FUNC_NONE 0 /* not a function definition */
-#define FUNC_TRADITIONAL 1 /* traditional style */
-#define FUNC_ANSI 2 /* ANSI style */
-#define FUNC_BOTH 3 /* both styles */
-
-typedef int FuncDefStyle;
-
-/* Source file text */
-typedef struct text {
- char text[MAX_TEXT_SIZE]; /* source text */
- long begin; /* offset in temporary file */
-} Text;
-
-/* Declaration specifier flags */
-#define DS_NONE 0 /* default */
-#define DS_EXTERN 1 /* contains "extern" specifier */
-#define DS_STATIC 2 /* contains "static" specifier */
-#define DS_CHAR 4 /* contains "char" type specifier */
-#define DS_SHORT 8 /* contains "short" type specifier */
-#define DS_FLOAT 16 /* contains "float" type specifier */
-#define DS_INLINE 32 /* contains "inline" specifier */
-#define DS_JUNK 64 /* we're not interested in this declaration */
-
-/* This structure stores information about a declaration specifier. */
-typedef struct decl_spec {
- unsigned short flags; /* flags defined above */
- char *text; /* source text */
- long begin; /* offset in temporary file */
-} DeclSpec;
-
-/* This is a list of function parameters. */
-typedef struct _ParameterList {
- struct parameter *first; /* pointer to first parameter in list */
- struct parameter *last; /* pointer to last parameter in list */
- long begin_comment; /* begin offset of comment */
- long end_comment; /* end offset of comment */
- char *comment; /* comment at start of parameter list */
-} ParameterList;
-
-/* This structure stores information about a declarator. */
-typedef struct _Declarator {
- char *name; /* name of variable or function */
- char *text; /* source text */
- long begin; /* offset in temporary file */
- long begin_comment; /* begin offset of comment */
- long end_comment; /* end offset of comment */
- FuncDefStyle func_def; /* style of function definition */
- ParameterList params; /* function parameters */
- boolean pointer; /* TRUE if it declares a pointer */
- struct _Declarator *head; /* head function declarator */
- struct _Declarator *func_stack; /* stack of function declarators */
- struct _Declarator *next; /* next declarator in list */
-} Declarator;
-
-/* This structure stores information about a function parameter. */
-typedef struct parameter {
- struct parameter *next; /* next parameter in list */
- DeclSpec decl_spec;
- Declarator *declarator;
- char *comment; /* comment following the parameter */
-} Parameter;
-
-/* This is a list of declarators. */
-typedef struct declarator_list {
- Declarator *first; /* pointer to first declarator in list */
- Declarator *last; /* pointer to last declarator in list */
-} DeclaratorList;
-
-/* #include "symbol.h" */
-typedef struct symbol {
- struct symbol *next; /* next symbol in list */
- char *name; /* name of symbol */
- char *value; /* value of symbol (for defines) */
- short flags; /* symbol attributes */
-} Symbol;
-
-/* parser stack entry type */
-typedef union {
- Text text;
- DeclSpec decl_spec;
- Parameter *parameter;
- ParameterList param_list;
- Declarator *declarator;
- DeclaratorList decl_list;
-} YYSTYPE;
-
-/* The hash table length should be a prime number. */
-#define SYM_MAX_HASH 251
-
-typedef struct symbol_table {
- Symbol *bucket[SYM_MAX_HASH]; /* hash buckets */
-} SymbolTable;
-
-extern SymbolTable *new_symbol_table /* Create symbol table */
- (void);
-extern void free_symbol_table /* Destroy symbol table */
- (SymbolTable *s);
-extern Symbol *find_symbol /* Lookup symbol name */
- (SymbolTable *s, const char *n);
-extern Symbol *new_symbol /* Define new symbol */
- (SymbolTable *s, const char *n, const char *v, int f);
-
-/* #include "semantic.h" */
-extern void new_decl_spec (DeclSpec *, const char *, long, int);
-extern void free_decl_spec (DeclSpec *);
-extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *);
-extern void check_untagged (DeclSpec *);
-extern Declarator *new_declarator (const char *, const char *, long);
-extern void free_declarator (Declarator *);
-extern void new_decl_list (DeclaratorList *, Declarator *);
-extern void free_decl_list (DeclaratorList *);
-extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *);
-extern Parameter *new_parameter (DeclSpec *, Declarator *);
-extern void free_parameter (Parameter *);
-extern void new_param_list (ParameterList *, Parameter *);
-extern void free_param_list (ParameterList *);
-extern void add_param_list (ParameterList *, ParameterList *, Parameter *);
-extern void new_ident_list (ParameterList *);
-extern void add_ident_list (ParameterList *, ParameterList *, const char *);
-extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *);
-extern void gen_declarations (DeclSpec *, DeclaratorList *);
-extern void gen_prototype (DeclSpec *, Declarator *);
-extern void gen_func_declarator (Declarator *);
-extern void gen_func_definition (DeclSpec *, Declarator *);
-
-extern void init_parser (void);
-extern void process_file (FILE *infile, char *name);
-extern char *cur_text (void);
-extern char *cur_file_name (void);
-extern char *implied_typedef (void);
-extern void include_file (char *name, int convert);
-extern char *supply_parm (int count);
-extern char *xstrdup (const char *);
-extern int already_declared (char *name);
-extern int is_actual_func (Declarator *d);
-extern int lint_ellipsis (Parameter *p);
-extern int want_typedef (void);
-extern void begin_tracking (void);
-extern void begin_typedef (void);
-extern void copy_typedef (char *s);
-extern void ellipsis_varargs (Declarator *d);
-extern void end_typedef (void);
-extern void flush_varargs (void);
-extern void fmt_library (int code);
-extern void imply_typedef (const char *s);
-extern void indent (FILE *outf);
-extern void put_blankline (FILE *outf);
-extern void put_body (FILE *outf, DeclSpec *decl_spec, Declarator *declarator);
-extern void put_char (FILE *outf, int c);
-extern void put_error (void);
-extern void put_newline (FILE *outf);
-extern void put_padded (FILE *outf, const char *s);
-extern void put_string (FILE *outf, const char *s);
-extern void track_in (void);
-
-extern boolean file_comments;
-extern FuncDefStyle func_style;
-extern char base_file[];
-
-extern int yylex (void);
-
-/* declaration specifier attributes for the typedef statement currently being
- * scanned
- */
-static int cur_decl_spec_flags;
-
-/* pointer to parameter list for the current function definition */
-static ParameterList *func_params;
-
-/* A parser semantic action sets this pointer to the current declarator in
- * a function parameter declaration in order to catch any comments following
- * the parameter declaration on the same line. If the lexer scans a comment
- * and <cur_declarator> is not NULL, then the comment is attached to the
- * declarator. To ignore subsequent comments, the lexer sets this to NULL
- * after scanning a comment or end of line.
- */
-static Declarator *cur_declarator;
-
-/* temporary string buffer */
-static char buf[MAX_TEXT_SIZE];
-
-/* table of typedef names */
-static SymbolTable *typedef_names;
-
-/* table of define names */
-static SymbolTable *define_names;
-
-/* table of type qualifiers */
-static SymbolTable *type_qualifiers;
-
-/* information about the current input file */
-typedef struct {
- char *base_name; /* base input file name */
- char *file_name; /* current file name */
- FILE *file; /* input file */
- unsigned line_num; /* current line number in input file */
- FILE *tmp_file; /* temporary file */
- long begin_comment; /* tmp file offset after last written ) or ; */
- long end_comment; /* tmp file offset after last comment */
- boolean convert; /* if TRUE, convert function definitions */
- boolean changed; /* TRUE if conversion done in this file */
-} IncludeStack;
-
-static IncludeStack *cur_file; /* current input file */
-
-/* #include "yyerror.c" */
-
-static int haveAnsiParam (void);
-
-
-/* Flags to enable us to find if a procedure returns a value.
- */
-static int return_val; /* nonzero on BRACES iff return-expression found */
-
-static const char *
-dft_decl_spec (void)
-{
- return (lintLibrary() && !return_val) ? "void" : "int";
-}
-
-static int
-haveAnsiParam (void)
-{
- Parameter *p;
- if (func_params != 0) {
- for (p = func_params->first; p != 0; p = p->next) {
- if (p->declarator->func_def == FUNC_ANSI) {
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-%}
-%%
-
-program
- : /* empty */
- | translation_unit
- ;
-
-translation_unit
- : external_declaration
- | translation_unit external_declaration
- ;
-
-external_declaration
- : declaration
- | function_definition
- | ';'
- | linkage_specification
- | T_ASM T_ASMARG ';'
- | error T_MATCHRBRACE
- {
- yyerrok;
- }
- | error ';'
- {
- yyerrok;
- }
- ;
-
-braces
- : T_LBRACE T_MATCHRBRACE
- ;
-
-linkage_specification
- : T_EXTERN T_STRING_LITERAL braces
- {
- /* Provide an empty action here so bison will not complain about
- * incompatible types in the default action it normally would
- * have generated.
- */
- }
- | T_EXTERN T_STRING_LITERAL declaration
- {
- /* empty */
- }
- ;
-
-declaration
- : decl_specifiers ';'
- {
-#if OPT_LINTLIBRARY
- if (types_out && want_typedef()) {
- gen_declarations(&$1, (DeclaratorList *)0);
- flush_varargs();
- }
-#endif
- free_decl_spec(&$1);
- end_typedef();
- }
- | decl_specifiers init_declarator_list ';'
- {
- if (func_params != NULL) {
- set_param_types(func_params, &$1, &$2);
- } else {
- gen_declarations(&$1, &$2);
-#if OPT_LINTLIBRARY
- flush_varargs();
-#endif
- free_decl_list(&$2);
- }
- free_decl_spec(&$1);
- end_typedef();
- }
- | any_typedef decl_specifiers
- {
- cur_decl_spec_flags = $2.flags;
- free_decl_spec(&$2);
- }
- opt_declarator_list ';'
- {
- end_typedef();
- }
- ;
-
-any_typedef
- : T_EXTENSION T_TYPEDEF
- {
- begin_typedef();
- }
- | T_TYPEDEF
- {
- begin_typedef();
- }
- ;
-
-opt_declarator_list
- : /* empty */
- | declarator_list
- ;
-
-declarator_list
- : declarator
- {
- int flags = cur_decl_spec_flags;
-
- /* If the typedef is a pointer type, then reset the short type
- * flags so it does not get promoted.
- */
- if (strcmp($1->text, $1->name) != 0)
- flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT);
- new_symbol(typedef_names, $1->name, NULL, flags);
- free_declarator($1);
- }
- | declarator_list ',' declarator
- {
- int flags = cur_decl_spec_flags;
-
- if (strcmp($3->text, $3->name) != 0)
- flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT);
- new_symbol(typedef_names, $3->name, NULL, flags);
- free_declarator($3);
- }
- ;
-
-function_definition
- : decl_specifiers declarator
- {
- check_untagged(&$1);
- if ($2->func_def == FUNC_NONE) {
- yyerror("syntax error");
- YYERROR;
- }
- func_params = &($2->head->params);
- func_params->begin_comment = cur_file->begin_comment;
- func_params->end_comment = cur_file->end_comment;
- }
- opt_declaration_list T_LBRACE
- {
- /* If we're converting to K&R and we've got a nominally K&R
- * function which has a parameter which is ANSI (i.e., a prototyped
- * function pointer), then we must override the deciphered value of
- * 'func_def' so that the parameter will be converted.
- */
- if (func_style == FUNC_TRADITIONAL
- && haveAnsiParam()
- && $2->head->func_def == func_style) {
- $2->head->func_def = FUNC_BOTH;
- }
-
- func_params = NULL;
-
- if (cur_file->convert)
- gen_func_definition(&$1, $2);
- gen_prototype(&$1, $2);
-#if OPT_LINTLIBRARY
- flush_varargs();
-#endif
- free_decl_spec(&$1);
- free_declarator($2);
- }
- T_MATCHRBRACE
- | declarator
- {
- if ($1->func_def == FUNC_NONE) {
- yyerror("syntax error");
- YYERROR;
- }
- func_params = &($1->head->params);
- func_params->begin_comment = cur_file->begin_comment;
- func_params->end_comment = cur_file->end_comment;
- }
- opt_declaration_list T_LBRACE T_MATCHRBRACE
- {
- DeclSpec decl_spec;
-
- func_params = NULL;
-
- new_decl_spec(&decl_spec, dft_decl_spec(), $1->begin, DS_NONE);
- if (cur_file->convert)
- gen_func_definition(&decl_spec, $1);
- gen_prototype(&decl_spec, $1);
-#if OPT_LINTLIBRARY
- flush_varargs();
-#endif
- free_decl_spec(&decl_spec);
- free_declarator($1);
- }
- ;
-
-opt_declaration_list
- : /* empty */
- | T_VA_DCL
- | declaration_list
- ;
-
-declaration_list
- : declaration
- | declaration_list declaration
- ;
-
-decl_specifiers
- : decl_specifier
- | decl_specifiers decl_specifier
- {
- join_decl_specs(&$$, &$1, &$2);
- free($1.text);
- free($2.text);
- }
- ;
-
-decl_specifier
- : storage_class
- | type_specifier
- | type_qualifier
- ;
-
-storage_class
- : T_AUTO
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_EXTERN
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_EXTERN);
- }
- | T_REGISTER
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_STATIC
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_STATIC);
- }
- | T_INLINE
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_INLINE);
- }
- | T_EXTENSION
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_JUNK);
- }
- ;
-
-type_specifier
- : T_CHAR
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR);
- }
- | T_DOUBLE
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_FLOAT
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_FLOAT);
- }
- | T_INT
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_LONG
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_SHORT
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_SHORT);
- }
- | T_SIGNED
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_UNSIGNED
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_VOID
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_Bool
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR);
- }
- | T_Complex
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_Imaginary
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_TYPEDEF_NAME
- {
- Symbol *s;
- s = find_symbol(typedef_names, $1.text);
- if (s != NULL)
- new_decl_spec(&$$, $1.text, $1.begin, s->flags);
- }
- | struct_or_union_specifier
- | enum_specifier
- ;
-
-type_qualifier
- : T_TYPE_QUALIFIER
- {
- new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
- }
- | T_DEFINE_NAME
- {
- /* This rule allows the <pointer> nonterminal to scan #define
- * names as if they were type modifiers.
- */
- Symbol *s;
- s = find_symbol(define_names, $1.text);
- if (s != NULL)
- new_decl_spec(&$$, $1.text, $1.begin, s->flags);
- }
- ;
-
-struct_or_union_specifier
- : struct_or_union any_id braces
- {
- char *s;
- if ((s = implied_typedef()) == 0)
- (void)sprintf(s = buf, "%s %s", $1.text, $2.text);
- new_decl_spec(&$$, s, $1.begin, DS_NONE);
- }
- | struct_or_union braces
- {
- char *s;
- if ((s = implied_typedef()) == 0)
- (void)sprintf(s = buf, "%s {}", $1.text);
- new_decl_spec(&$$, s, $1.begin, DS_NONE);
- }
- | struct_or_union any_id
- {
- (void)sprintf(buf, "%s %s", $1.text, $2.text);
- new_decl_spec(&$$, buf, $1.begin, DS_NONE);
- }
- ;
-
-struct_or_union
- : T_STRUCT
- {
- imply_typedef($$.text);
- }
- | T_UNION
- {
- imply_typedef($$.text);
- }
- ;
-
-init_declarator_list
- : init_declarator
- {
- new_decl_list(&$$, $1);
- }
- | init_declarator_list ',' init_declarator
- {
- add_decl_list(&$$, &$1, $3);
- }
- ;
-
-init_declarator
- : declarator
- {
- if ($1->func_def != FUNC_NONE && func_params == NULL &&
- func_style == FUNC_TRADITIONAL && cur_file->convert) {
- gen_func_declarator($1);
- fputs(cur_text(), cur_file->tmp_file);
- }
- cur_declarator = $$;
- }
- | declarator '='
- {
- if ($1->func_def != FUNC_NONE && func_params == NULL &&
- func_style == FUNC_TRADITIONAL && cur_file->convert) {
- gen_func_declarator($1);
- fputs(" =", cur_file->tmp_file);
- }
- }
- T_INITIALIZER
- ;
-
-enum_specifier
- : enumeration any_id braces
- {
- char *s;
- if ((s = implied_typedef()) == 0)
- (void)sprintf(s = buf, "enum %s", $2.text);
- new_decl_spec(&$$, s, $1.begin, DS_NONE);
- }
- | enumeration braces
- {
- char *s;
- if ((s = implied_typedef()) == 0)
- (void)sprintf(s = buf, "%s {}", $1.text);
- new_decl_spec(&$$, s, $1.begin, DS_NONE);
- }
- | enumeration any_id
- {
- (void)sprintf(buf, "enum %s", $2.text);
- new_decl_spec(&$$, buf, $1.begin, DS_NONE);
- }
- ;
-
-enumeration
- : T_ENUM
- {
- imply_typedef("enum");
- $$ = $1;
- }
- ;
-
-any_id
- : T_IDENTIFIER
- | T_TYPEDEF_NAME
- ;
-
-declarator
- : pointer direct_declarator
- {
- $$ = $2;
- (void)sprintf(buf, "%s%s", $1.text, $$->text);
- free($$->text);
- $$->text = xstrdup(buf);
- $$->begin = $1.begin;
- $$->pointer = TRUE;
- }
- | direct_declarator
- ;
-
-direct_declarator
- : identifier_or_ref
- {
- $$ = new_declarator($1.text, $1.text, $1.begin);
- }
- | '(' declarator ')'
- {
- $$ = $2;
- (void)sprintf(buf, "(%s)", $$->text);
- free($$->text);
- $$->text = xstrdup(buf);
- $$->begin = $1.begin;
- }
- | direct_declarator T_BRACKETS
- {
- $$ = $1;
- (void)sprintf(buf, "%s%s", $$->text, $2.text);
- free($$->text);
- $$->text = xstrdup(buf);
- }
- | direct_declarator '(' parameter_type_list ')'
- {
- $$ = new_declarator("%s()", $1->name, $1->begin);
- $$->params = $3;
- $$->func_stack = $1;
- $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
- $$->func_def = FUNC_ANSI;
- }
- | direct_declarator '(' opt_identifier_list ')'
- {
- $$ = new_declarator("%s()", $1->name, $1->begin);
- $$->params = $3;
- $$->func_stack = $1;
- $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
- $$->func_def = FUNC_TRADITIONAL;
- }
- ;
-
-pointer
- : '*' opt_type_qualifiers
- {
- (void)sprintf($$.text, "*%s", $2.text);
- $$.begin = $1.begin;
- }
- | '*' opt_type_qualifiers pointer
- {
- (void)sprintf($$.text, "*%s%s", $2.text, $3.text);
- $$.begin = $1.begin;
- }
- ;
-
-opt_type_qualifiers
- : /* empty */
- {
- strcpy($$.text, "");
- $$.begin = 0L;
- }
- | type_qualifier_list
- ;
-
-type_qualifier_list
- : type_qualifier
- {
- (void)sprintf($$.text, "%s ", $1.text);
- $$.begin = $1.begin;
- free($1.text);
- }
- | type_qualifier_list type_qualifier
- {
- (void)sprintf($$.text, "%s%s ", $1.text, $2.text);
- $$.begin = $1.begin;
- free($2.text);
- }
- ;
-
-parameter_type_list
- : parameter_list
- | parameter_list ',' T_ELLIPSIS
- {
- add_ident_list(&$$, &$1, "...");
- }
- ;
-
-parameter_list
- : parameter_declaration
- {
- new_param_list(&$$, $1);
- }
- | parameter_list ',' parameter_declaration
- {
- add_param_list(&$$, &$1, $3);
- }
- ;
-
-parameter_declaration
- : decl_specifiers declarator
- {
- check_untagged(&$1);
- $$ = new_parameter(&$1, $2);
- }
- | decl_specifiers abs_declarator
- {
- check_untagged(&$1);
- $$ = new_parameter(&$1, $2);
- }
- | decl_specifiers
- {
- check_untagged(&$1);
- $$ = new_parameter(&$1, (Declarator *)0);
- }
- ;
-
-opt_identifier_list
- : /* empty */
- {
- new_ident_list(&$$);
- }
- | identifier_list
- ;
-
-identifier_list
- : any_id
- {
- new_ident_list(&$$);
- add_ident_list(&$$, &$$, $1.text);
- }
- | identifier_list ',' any_id
- {
- add_ident_list(&$$, &$1, $3.text);
- }
- ;
-
-identifier_or_ref
- : any_id
- {
- $$ = $1;
- }
- | '&' any_id
- {
-#if OPT_LINTLIBRARY
- if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */
- $$ = $2;
- } else
-#endif
- (void)sprintf($$.text, "&%s", $2.text);
- $$.begin = $1.begin;
- }
- ;
-
-abs_declarator
- : pointer
- {
- $$ = new_declarator($1.text, "", $1.begin);
- }
- | pointer direct_abs_declarator
- {
- $$ = $2;
- (void)sprintf(buf, "%s%s", $1.text, $$->text);
- free($$->text);
- $$->text = xstrdup(buf);
- $$->begin = $1.begin;
- }
- | direct_abs_declarator
- ;
-
-direct_abs_declarator
- : '(' abs_declarator ')'
- {
- $$ = $2;
- (void)sprintf(buf, "(%s)", $$->text);
- free($$->text);
- $$->text = xstrdup(buf);
- $$->begin = $1.begin;
- }
- | direct_abs_declarator T_BRACKETS
- {
- $$ = $1;
- (void)sprintf(buf, "%s%s", $$->text, $2.text);
- free($$->text);
- $$->text = xstrdup(buf);
- }
- | T_BRACKETS
- {
- $$ = new_declarator($1.text, "", $1.begin);
- }
- | direct_abs_declarator '(' parameter_type_list ')'
- {
- $$ = new_declarator("%s()", "", $1->begin);
- $$->params = $3;
- $$->func_stack = $1;
- $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
- $$->func_def = FUNC_ANSI;
- }
- | direct_abs_declarator '(' ')'
- {
- $$ = new_declarator("%s()", "", $1->begin);
- $$->func_stack = $1;
- $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
- $$->func_def = FUNC_ANSI;
- }
- | '(' parameter_type_list ')'
- {
- Declarator *d;
-
- d = new_declarator("", "", $1.begin);
- $$ = new_declarator("%s()", "", $1.begin);
- $$->params = $2;
- $$->func_stack = d;
- $$->head = $$;
- $$->func_def = FUNC_ANSI;
- }
- | '(' ')'
- {
- Declarator *d;
-
- d = new_declarator("", "", $1.begin);
- $$ = new_declarator("%s()", "", $1.begin);
- $$->func_stack = d;
- $$->head = $$;
- $$->func_def = FUNC_ANSI;
- }
- ;
-
-%%
-
-/* lex.yy.c */
-#define BEGIN yy_start = 1 + 2 *
-
-#define CPP1 1
-#define INIT1 2
-#define INIT2 3
-#define CURLY 4
-#define LEXYACC 5
-#define ASM 6
-#define CPP_INLINE 7
-
-extern char *yytext;
-extern FILE *yyin, *yyout;
-
-static int curly; /* number of curly brace nesting levels */
-static int ly_count; /* number of occurrences of %% */
-static int inc_depth; /* include nesting level */
-static SymbolTable *included_files; /* files already included */
-static int yy_start = 0; /* start state number */
-
-#define grammar_error(s) yaccError(s)
-
-static void
-yaccError (const char *msg)
-{
- func_params = NULL;
- put_error(); /* tell what line we're on, and what file */
- fprintf(stderr, "%s at token '%s'\n", msg, yytext);
-}
-
-/* Initialize the table of type qualifier keywords recognized by the lexical
- * analyzer.
- */
-void
-init_parser (void)
-{
- static const char *keywords[] = {
- "const",
- "restrict",
- "volatile",
- "interrupt",
-#ifdef vms
- "noshare",
- "readonly",
-#endif
-#if defined(MSDOS) || defined(OS2)
- "__cdecl",
- "__export",
- "__far",
- "__fastcall",
- "__fortran",
- "__huge",
- "__inline",
- "__interrupt",
- "__loadds",
- "__near",
- "__pascal",
- "__saveregs",
- "__segment",
- "__stdcall",
- "__syscall",
- "_cdecl",
- "_cs",
- "_ds",
- "_es",
- "_export",
- "_far",
- "_fastcall",
- "_fortran",
- "_huge",
- "_interrupt",
- "_loadds",
- "_near",
- "_pascal",
- "_saveregs",
- "_seg",
- "_segment",
- "_ss",
- "cdecl",
- "far",
- "huge",
- "near",
- "pascal",
-#ifdef OS2
- "__far16",
-#endif
-#endif
-#ifdef __GNUC__
- /* gcc aliases */
- "__builtin_va_arg",
- "__builtin_va_list",
- "__const",
- "__const__",
- "__inline",
- "__inline__",
- "__restrict",
- "__restrict__",
- "__volatile",
- "__volatile__",
-#endif
- };
- unsigned i;
-
- /* Initialize type qualifier table. */
- type_qualifiers = new_symbol_table();
- for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) {
- new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE);
- }
-}
-
-/* Process the C source file. Write function prototypes to the standard
- * output. Convert function definitions and write the converted source
- * code to a temporary file.
- */
-void
-process_file (FILE *infile, char *name)
-{
- char *s;
-
- if (strlen(name) > 2) {
- s = name + strlen(name) - 2;
- if (*s == '.') {
- ++s;
- if (*s == 'l' || *s == 'y')
- BEGIN LEXYACC;
-#if defined(MSDOS) || defined(OS2)
- if (*s == 'L' || *s == 'Y')
- BEGIN LEXYACC;
-#endif
- }
- }
-
- included_files = new_symbol_table();
- typedef_names = new_symbol_table();
- define_names = new_symbol_table();
- inc_depth = -1;
- curly = 0;
- ly_count = 0;
- func_params = NULL;
- yyin = infile;
- include_file(strcpy(base_file, name), func_style != FUNC_NONE);
- if (file_comments) {
-#if OPT_LINTLIBRARY
- if (lintLibrary()) {
- put_blankline(stdout);
- begin_tracking();
- }
-#endif
- put_string(stdout, "/* ");
- put_string(stdout, cur_file_name());
- put_string(stdout, " */\n");
- }
- yyparse();
- free_symbol_table(define_names);
- free_symbol_table(typedef_names);
- free_symbol_table(included_files);
-}
-
-#ifdef NO_LEAKS
-void
-free_parser(void)
-{
- free_symbol_table (type_qualifiers);
-#ifdef FLEX_SCANNER
- if (yy_current_buffer != 0)
- yy_delete_buffer(yy_current_buffer);
-#endif
-}
-#endif
OpenPOWER on IntegriCloud