Hi all
I have been using lemon successfully to generate a parser used in a
library, and I'd like some source-level way of limiting the visibility
of some lempar symbols.
I threw together a proof of concept for a macro that can be user defined
to allow setting `static` or e.g.
`__attribute___((visibility("hidden")))` for the `Parse.*` functions. By
default it is empty which maintains the existing behaviour.
My proof of concept patch is included below using the macro name
`YYAPIFUNC`.
I feel this is of general utility, and if you find it useful, please
feel free to adopt as you see fit under the usual sqlite terms.
All the Best
Luke
---
Index: tool/lempar.c
==================================================================
--- tool/lempar.c
+++ tool/lempar.c
@@ -231,10 +231,18 @@
#include <stdio.h>
static FILE *yyTraceFILE = 0;
static char *yyTracePrompt = 0;
#endif /* NDEBUG */
+/*
+** Any required function qualifiers for public parts of the parser should be
+** defined ** here, e.g. static, declspec, etc.
+*/
+#ifndef YYAPIFUNC
+#define YYAPIFUNC /* default is empty */
+#endif
+
#ifndef NDEBUG
/*
** Turn parser tracing on by giving a stream to which to write the trace
** and a prompt to preface each trace message. Tracing is turned off
** by making either argument NULL
@@ -249,11 +257,11 @@
** </ul>
**
** Outputs:
** None.
*/
-void ParseTrace(FILE *TraceFILE, char *zTracePrompt){
+YYAPIFUNC void ParseTrace(FILE *TraceFILE, char *zTracePrompt){
yyTraceFILE = TraceFILE;
yyTracePrompt = zTracePrompt;
if( yyTraceFILE==0 ) yyTracePrompt = 0;
else if( yyTracePrompt==0 ) yyTraceFILE = 0;
}
@@ -318,11 +326,11 @@
# define YYMALLOCARGTYPE size_t
#endif
/* Initialize a new parser that has already been allocated.
*/
-void ParseInit(void *yypRawParser ParseCTX_PDECL){
+YYAPIFUNC void ParseInit(void *yypRawParser ParseCTX_PDECL){
yyParser *yypParser = (yyParser*)yypRawParser;
ParseCTX_STORE
#ifdef YYTRACKMAXSTACKDEPTH
yypParser->yyhwm = 0;
#endif
@@ -357,11 +365,11 @@
**
** Outputs:
** A pointer to a parser. This pointer is used in subsequent calls
** to Parse and ParseFree.
*/
-void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) ParseCTX_PDECL){
+YYAPIFUNC void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)
ParseCTX_PDECL){
yyParser *yypParser;
yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
if( yypParser ){
ParseCTX_STORE
ParseInit(yypParser ParseCTX_PARAM);
@@ -425,11 +433,11 @@
}
/*
** Clear all secondary memory allocations from the parser
*/
-void ParseFinalize(void *p){
+YYAPIFUNC void ParseFinalize(void *p){
yyParser *pParser = (yyParser*)p;
while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser);
#if YYSTACKDEPTH<=0
if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack);
#endif
@@ -442,11 +450,11 @@
**
** If the YYPARSEFREENEVERNULL macro exists (for example because it
** is defined in a %include section of the input grammar) then it is
** assumed that the input pointer is never NULL.
*/
-void ParseFree(
+YYAPIFUNC void ParseFree(
void *p, /* The parser to be deleted */
void (*freeProc)(void*) /* Function used to reclaim memory */
){
#ifndef YYPARSEFREENEVERNULL
if( p==0 ) return;
@@ -458,11 +466,11 @@
/*
** Return the peak depth of the stack for a parser.
*/
#ifdef YYTRACKMAXSTACKDEPTH
-int ParseStackPeak(void *p){
+YYAPIFUNC int ParseStackPeak(void *p){
yyParser *pParser = (yyParser*)p;
return pParser->yyhwm;
}
#endif
@@ -482,11 +490,11 @@
** (2) is not a syntax error.
**
** Return the number of missed state/lookahead combinations.
*/
#if defined(YYCOVERAGE)
-int ParseCoverage(FILE *out){
+YYAPIFUNC int ParseCoverage(FILE *out){
int stateno, iLookAhead, i;
int nMissed = 0;
for(stateno=0; stateno<YYNSTATE; stateno++){
i = yy_shift_ofst[stateno];
for(iLookAhead=0; iLookAhead<YYNTOKEN; iLookAhead++){
@@ -889,11 +897,11 @@
** </ul>
**
** Outputs:
** None.
*/
-void Parse(
+YYAPIFUNC void Parse(
void *yyp, /* The parser */
int yymajor, /* The major token code number */
ParseTOKENTYPE yyminor /* The value for the token */
ParseARG_PDECL /* Optional %extra_argument parameter */
){
@@ -1063,14 +1071,14 @@
/*
** Return the fallback token corresponding to canonical token iToken, or
** 0 if iToken has no fallback.
*/
-int ParseFallback(int iToken){
+YYAPIFUNC int ParseFallback(int iToken){
#ifdef YYFALLBACK
assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) );
return yyFallback[iToken];
#else
(void)iToken;
return 0;
#endif
}
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users