Convert-Binary-C
view release on metacpan or search on metacpan
ctlib/parser.y view on Meta::CPAN
#define BEGIN_LOCAL (PSTATE->flags |= F_LOCAL)
#define END_LOCAL (PSTATE->flags &= ~F_LOCAL)
#define IS_LOCAL (PSTATE->flags & F_LOCAL)
/*===== TYPEDEFS =============================================================*/
struct _parserState {
const CParseConfig *pCPC;
CParseInfo *pCPI;
PragmaState *pragma;
struct CPP *pp;
struct lexer_state *pLexer;
FileInfo *pFI;
u_32 flags;
};
%}
/*===== YACC PARSER DEFINITION ================================================*/
/* This refined grammar resolves several typedef ambiguities in the
draft proposed ANSI C standard syntax down to 1 shift/reduce
conflict, as reported by a YACC process. Note that the one shift
reduce conflicts is the traditional if-if-else conflict that is not
resolved by the grammar. This ambiguity can be removed using the
method described in the Dragon Book (2nd edition), but this does not
appear worth the effort.
There was quite a bit of effort made to reduce the conflicts to this
level, and an additional effort was made to make the grammar quite
similar to the C++ grammar being developed in parallel. Note that
this grammar resolves the following ANSI C ambiguity as follows:
ANSI C section 3.5.6, "If the [typedef name] is redeclared at an
inner scope, the type specifiers shall not be omitted in the inner
declaration". Supplying type specifiers prevents consideration of T
as a typedef name in this grammar. Failure to supply type specifiers
forced the use of the TYPEDEFname as a type specifier.
ANSI C section 3.5.4.3, "In a parameter declaration, a single typedef
name in parentheses is taken to be an abstract declarator that
specifies a function with a single parameter, not as redundant
parentheses around the identifier". This is extended to cover the
following cases:
typedef float T;
int noo(const (T[5]));
int moo(const (T(int)));
...
Where again the '(' immediately to the left of 'T' is interpreted as
being the start of a parameter type list, and not as a redundant
paren around a redeclaration of T. Hence an equivalent code fragment
is:
typedef float T;
int noo(const int identifier1 (T identifier2 [5]));
int moo(const int identifier1 (T identifier2 (int identifier3)));
...
*/
%union {
HashNode identifier;
Declarator *pDecl;
AbstractDeclarator absDecl;
StructDeclaration *pStructDecl;
TypedefList *pTypedefList;
LinkedList list;
Enumerator *pEnum;
Typedef *pTypedef;
TypeSpec tspec;
Value value;
struct {
u_32 uval;
ContextInfo ctx;
} context;
u_32 uval;
char oper;
}
%{
/*===== STATIC VARIABLES =====================================================*/
/* TOKEN MAPPING TABLE */
static const int tokentab[] = {
0, /* NONE, */ /* whitespace */
0, /* NEWLINE, */ /* newline */
0, /* COMMENT, */ /* comment */
0, /* NUMBER, */ /* number constant */
0, /* NAME, */ /* identifier */
0, /* BUNCH, */ /* non-C characters */
0, /* PRAGMA, */ /* a #pragma directive */
0, /* CONTEXT, */ /* new file or #line */
0, /* STRING, */ /* constant "xxx" */
CONSTANT, /* CHAR, */ /* constant 'xxx' */
'/', /* SLASH, */ /* / */
DIV_ASSIGN, /* ASSLASH, */ /* /= */
'-', /* MINUS, */ /* - */
DEC_OP, /* MMINUS, */ /* -- */
SUB_ASSIGN, /* ASMINUS, */ /* -= */
PTR_OP, /* ARROW, */ /* -> */
'+', /* PLUS, */ /* + */
INC_OP, /* PPLUS, */ /* ++ */
ADD_ASSIGN, /* ASPLUS, */ /* += */
'<', /* LT, */ /* < */
LE_OP, /* LEQ, */ /* <= */
LEFT_OP, /* LSH, */ /* << */
LEFT_ASSIGN, /* ASLSH, */ /* <<= */
'>', /* GT, */ /* > */
GE_OP, /* GEQ, */ /* >= */
( run in 1.000 second using v1.01-cache-2.11-cpan-364913b4093 )