Hello List,

I have written a parser in bison which works with flex
together. The compilation and execution work just fine
on machines with bison. I tried to port these in
a Sun OS where only yacc is installed
(version output> yacc: Software Generation Utilities (SGU) Solaris-ELF
(4.0) ). Unfortunately yacc  stops compiling with: "identifier
redecleration" errors.


Here are the 2 errors:

[Mi Okt 01 05:53:06] [EMAIL PROTECTED] flexer  >> make all
lex -t tokenizer.l > tokenizer.c 
916/1000 nodes(%e), 2996/6000 positions(%p), 517/1000 (%n), 14588
transitions,
142/10000 packed char classes(%k),  1589/2000 packed transitions(%a),
1197/12000 output slots(%o)
cc -pedantic -g -c dar.c
yacc -t -d -b parser parser.y 
mv parser.tab.h parser.h
mv parser.tab.c parser.c
cc -pedantic -g -o tokenizer.o -c tokenizer.c 
cc -pedantic -g -o parser.o -c parser.c 
"parser.y", line 66: identifier redeclared: YYSTYPE
        current : union  {int err_code, pointer to struct def_table {..}
def_tab, pointer to struct dec_table {..} dec_tab}
        previous: union  {int err_code, pointer to struct def_table {..}
def_tab, pointer to struct dec_table {..} dec_tab} : "parser.h", line 10
"parser.y", line 159: identifier redeclared: yylval
        current : union  {int err_code, pointer to struct def_table {..}
def_tab, pointer to struct dec_table {..} dec_tab}
        previous: union  {int err_code, pointer to struct def_table {..}
def_tab, pointer to struct dec_table {..} dec_tab} : "parser.h", line 11
cc: acomp failed for parser.c
*** Error code 2
make: Fatal error: Command failed for target `parser_compiling'


I have tried to solve the problem with the first error, deleting the
decleration which is on line 66 as specified in output, but I still get
the same error with the same line as I compile. 

Now I suspect, errors are caused by one of those small differences
between yacc and bison. Yet I can't point out the cause. Therefore, I
decided to ask here even it's not specificly a yacc mailing
list(couldn't find it btw.)

I attach also the parser.y for further inspections.

Thanks in advance.
-Umut


%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "parser.h"
#include "table.h"
#include "dar.h"

int parse_file(char* filename) ;
static void yyerror(char* s) ;
int yylex(void);

#define YYERROR_VERBOSE
#define YY_DEBUG 1 


#if YY_DEBUG
extern int yydebug ;
extern void init_tokenizer();
extern void print_def_table();
extern void print_dec_table();
extern void del_decl_from_table(struct dec_table* d_t_p) ;
extern struct dec_table* add_def_symbol(struct def_table* copy, node** p) ;
extern struct dec_table* add_dec_symbol(struct dec_table* copy, node** p, node* 
vater); 
extern struct dec_table** resolve_definition(unsigned char* s, int len);
extern int chk_dupl_dectbl(struct dec_table* t_p, node* vater) ;

extern void finit_rstck(void) ;
extern void push(node* node_p) ;
extern void push_troot(node* node_p) ;
extern void pop(void) ;
extern node* get_root(void) ;
extern node* lazy_create_node(lib_str label, lib_str name) ;
extern node* getnode_defsym_tbl(char* label);
extern node** get_def_node(unsigned char* s, int len) ;
extern void print_tree(node* vater);
extern void copy_dec2_defnode(node* def_node, lib_str src) ;
extern void define_node(node* source, node* target) ;
extern void copy_partial_tree(node* vater, node* src_tree, node** dst_tree) ;
extern node* tree_search_label(node* vater, lib_str label, short asn_type) ;
extern node* create_node(lib_str label, short asn_type, enum t_boolean 
optional, 
                enum t_boolean is_root, long hi, long lo) ;
extern void bind_child(node** vater, node** child) ;


root_ops r_ops ;

void parse_error(int err_code);

node* local_root = NULL ;
int counter = 0 ;


#endif 
%}

/* test */ 
%union {
   int err_code ;
   struct def_table* def_tab ; 
   struct dec_table* dec_tab ;
}

%start file
%token COMMENT_SIGN 
%token WORD 
%token NEW_LINE 
%token DEFINITION_SIGN 
%token <dec_tab>DECLERATION 
%token <def_tab>OC_BRACK 
%token CC_BRACK SEQLINEBRK
%token ROOT_LABEL 
%token <dec_tab>ROOT_DECLR 
%token <err_code>ERR_ROOT_DECL 
%token <err_code>ERR_ROOT_NLINE 
%token ERR_ROOT_ABSENCE ROOT_NLINE
%token <def_tab>INTEGER 
%token <def_tab>ENUMERATED 
%token <def_tab>BOOLEAN 
%token <def_tab>OCTET_STRING 
%token <def_tab>IA5STRING 
%token <def_tab>UTF8STRING 
%token <def_tab>SEQUENCE 
%token <def_tab>CHOICE
%token CMPLX_COMMENT_SIGN CMPLX_WORD CMPLX_NLINE CMPLX_DSIGN CMPLX_CSIGN 
%token <dec_tab>CMPLX_DECLERATION
%token <def_tab>CMPLX_INTEGER 
%token <def_tab>CMPLX_ENUMERATED 
%token <def_tab>CMPLX_BOOLEAN 
%token <def_tab>CMPLX_OCTET_STRING 
%token <def_tab>CMPLX_IA5STRING  
%token <def_tab>CMPLX_RANGE 
%token <def_tab>CMPLX_UTF8STRING 
%token <def_tab>CMPLX_SEQUENCE 
%token <def_tab>CMPLX_CHOICE
%token SDECL_NLINE
%token <err_code>ERR_SDECL_DUPL 
%token <err_code>SDECL_ERROR
%token <err_code>ERR_INIT_DSIGN 
%token <err_code>ERR_DECLR_WORD 
%token <err_code>ERR_LABEL_NLINE 
%token <err_code>ERR_SIMPL_DUPL 
%token <err_code>ERR_SIMPL_BTYPE 
%token <err_code>ERR_SIMPL_GEN 
%token <err_code>ERR_DEFIN_WORD 
%token <err_code>ERR_CMPLX_LABEL 
%token <err_code>ERR_CMPLX_UNEXPECTED 
%token <err_code>ERR_CMPLX_ROOT
%token <err_code>ERR_CMPLX_DEF  
%token <err_code>ERR_CMPLX_DUPL 
%token <err_code>ERR_CMPLX_TYPE

%type <def_tab>asn_base_type
%type <def_tab>asn_extendable_type
%type <def_tab>asn_complex_type
%type <def_tab>asn_complex_extendable
%type <err_code>error_types
%type <err_code>error_complex_root
%type <err_code>error_complex_types 
%%

file: blocks {  /* post operations */ 
                struct dec_table* row_p ;
                node** look_upp ;
                int i ;
                local_root = r_ops.get_root() ;
                node* n_p2 = getnode_defsym_tbl("MegacoMessage") ;
//              node* n_p = getnode_defsym_tbl("marie") ;
//              node* n_p3 = getnode_defsym_tbl("Message") ;

/*              debug stuff */ 
//              if(local_root != NULL)
//                  printf("POST OPERATIONS: local_root:%.*s\n", 
local_root->label.len, local_root->label.s ) ;
//              else 
//                  printf("POST OPERATIONS: local root is NULL\n") ;


                /* 1. Check if declerations at 0 level exist, 
                 *      if yes try to bind them to vater, also delete from the 
decl table */ 
                /* 2. what to do if i have a definition of root which doesn't 
match the one in
                   the definition table ? */ 
                if(local_root == NULL){

                    printf("Warning root cannot be identified, add \"root 
DECL_IDENT\" to \
                            your module file\n") ;
                    parse_error(ERR_ROOT_ABSENCE) ;
                } 
                
                if(local_root->is_root==TRUE){
                    /* a root exists and we bind the node in decleration table 
with father
                    "null" to it! Warning: There are no duplications of this 
type */ 
                    for(row_p = begin ; row_p != NULL ; row_p = row_p->next){
                        if(row_p->node_p[0]->asn_type==0){
                            if( (look_upp = get_def_node(row_p->def_name.s, 
row_p->def_name.len)) != NULL){
                                for(i=0 ; row_p->node_p[i] != NULL && i < 
MAX_NODE_COPY ; i++)
                                        define_node(*look_upp, 
row_p->node_p[i]) ;

                             } else {
                                /*not defined, not bound, so we only bind it. 
*/ 
                                if(row_p->vater == NULL) {
                                    row_p->vater = local_root ; 
                                    bind_child(&local_root, 
&(row_p->node_p[0]));
                                }
                             }  

                         }  else { /* */ }
                        
                        /* defined but not yet bound, so we do it*/ 
                        if(row_p->vater == NULL){
                                
                            bind_child(&local_root, &(row_p->node_p[0])) ;
                            printf("del_decl_from_table for:%.*s!\n", 
row_p->label.len, row_p->label.s) ;
                        del_decl_from_table(row_p) ;
                        }
                   }
                } else { 
                
                
                }

                print_dec_table(); 
                print_def_table();
                print_tree(n_p2);
//              print_tree(n_p);
//              print_tree(n_p3) ;
            } 
   ;

blocks: asn_simple_block {/* */ }
      |asn_simple_block SEQLINEBRK blocks {/* */ }
      | asn_simple_block comment_block blocks {/* */ }
      | ERR_INIT_DSIGN blocks {parse_error($1);}
      | root_block blocks
      ;

root_block: ROOT_LABEL ROOT_DECLR ROOT_NLINE{
                node** node_pp, * node_p ;
                local_root = r_ops.get_root() ;
//              printf("root found it has been defined as:%.*s\n", 
(*node_pp)->label.len, (*node_pp)->label.s) ;

                /* root's definition name is found in the list */ 
                if( (node_pp = get_def_node($2->def_name.s, $2->def_name.len)) 
!= NULL){

                    (*node_pp)->is_root = TRUE ;
                    if(local_root == NULL)
                        r_ops.push(*node_pp) ;
                    else printf("Warning: Root already has been declared: 
%.*s?\n", 
                    local_root->label.len, local_root->label.s) ;

                } else {
                /* root's definition name not found in the list */ 
                        node* virt_root = NULL ;
                        node_p = lazy_create_node($2->label, $2->def_name) ;
                        node_p->is_root = TRUE ;
                        r_ops.push(node_p) ;
                        add_dec_symbol($2, &node_p, virt_root) ;        
                }
                        /* resolve_definition()*/ 
            }
            | ROOT_LABEL error_types {parse_error($2); }
            ;

comment_block:  COMMENT_SIGN comment_words NEW_LINE 
             |  COMMENT_SIGN NEW_LINE 
             ;  


comment_words:  WORD | WORD comment_words ;

asn_simple_block: asn_complex_block 
                | WORD ERR_LABEL_NLINE asn_simple_block {parse_error($2);}
                | WORD ERR_DECLR_WORD asn_simple_block { parse_error($2); } 
                | WORD DEFINITION_SIGN asn_base_type NEW_LINE {
                    int i ;
                        
                    node* node_p = create_node($3->label, $3->asn_type, FALSE, 
FALSE, $3->lo, $3->hi) ;
                    add_def_symbol($3, &node_p) ;

                    struct dec_table** d_t, **t_pp ;
                    d_t = resolve_definition(node_p->label.s, 
node_p->label.len);
            
                    for(t_pp = d_t ; *t_pp != NULL ; t_pp++){
                        for(i=0; (*t_pp)->node_p[i] != NULL ; i++ ){
                            define_node(node_p, (*t_pp)->node_p[i]) ;
                            }
                        
                        /* declerations at level 0(or with vater NULL), "label 
def_name" are left 
                         * in the list until the post operations. They will be 
first cleaned up
                         * at that procedure */ 
                        if((*t_pp)->vater != NULL)
                            del_decl_from_table(*t_pp) ;
                    }

                } asn_simple_block 

                | WORD DECLERATION SDECL_NLINE {
                    local_root = r_ops.get_root()/* root level = 0 */;   
                    node *lazy_p, ** lookupp;
                    struct dec_table* t_p = NULL ;
                    /* check if label of decleration is duplicated at belonging 
level*/ 
                    if( chk_dupl_dectbl($2, local_root) != 0 ) {
                
                        parse_error(ERR_SDECL_DUPL);
                    
                    } else {

                        /* check type for decleration, if yes then 
                         * copy decleration label to the definition node */ 
                        lazy_p = lazy_create_node($2->label, $2->def_name) ;
                        

                        /* check if we have a definition for this root level 
decleration
                         * if yes, copy_partial_tree overtakes every op. At 
this point 
                         * the decleration can only be binded to the  big root 
*/       
                        if( (lookupp = get_def_node($2->def_name.s, 
$2->def_name.len)) != NULL){

                            copy_partial_tree(NULL, *lookupp, &lazy_p) ;
//                          PRINT_NODE(lazy_p) ;

                            if(local_root == NULL) {

                                t_p = add_dec_symbol($2, &lazy_p, NULL) ;

                            } else{

                                lookupp = get_def_node(local_root->label.s, 
local_root->label.len) ;
                                bind_child(lookupp, &lazy_p) ;
                            }

                        } else {
                             
                             t_p = add_dec_symbol($2, &lazy_p, NULL) ;  
                             
                             if(local_root != NULL) {

                                lookupp = get_def_node(local_root->label.s, 
local_root->label.len) ;
                                bind_child(lookupp, &lazy_p) ;
                                if(t_p != NULL) del_decl_from_table(t_p) ;

                             }

                        }
                            

                            /* at this point we know that there exist a root 
decleration.
                             * is it fully defined also? If only yes, the 
decleration node
                             * can be bound */ 

                    }
                  }asn_simple_block 

                | WORD simple_dec_errors asn_simple_block 
                | WORD DECLERATION simple_dec_errors asn_simple_block
                | WORD error_types DECLERATION NEW_LINE asn_simple_block { 
parse_error($2); }
                | WORD DECLERATION error_types NEW_LINE asn_simple_block { 
parse_error($3); }
                | WORD DEFINITION_SIGN asn_base_type ERR_SIMPL_DUPL 
asn_simple_block {parse_error($4);}
                | WORD DEFINITION_SIGN asn_base_type error_types 
asn_simple_block{parse_error($4);}
                | WORD DEFINITION_SIGN error_types 
asn_simple_block{parse_error($3);}
                ;

error_types: ERR_SIMPL_BTYPE 
           | ERR_SIMPL_GEN 
           | ERR_DEFIN_WORD
           | ERR_DECLR_WORD
           | ERR_ROOT_DECL
           | ERR_ROOT_NLINE
           | ERR_SIMPL_GEN error_types 
           | ERR_SIMPL_BTYPE error_types 
           | ERR_DEFIN_WORD error_types
           | ERR_DECLR_WORD error_types
           | ERR_ROOT_DECL error_types
           | ERR_ROOT_NLINE error_types
           ;
           
simple_dec_errors: ERR_SDECL_DUPL 
                 | SDECL_ERROR
                 | ERR_SDECL_DUPL simple_dec_errors
                 | SDECL_ERROR simple_dec_errors 

error_complex_types: ERR_CMPLX_LABEL
                   | ERR_CMPLX_DEF
                   | ERR_CMPLX_UNEXPECTED
                   | ERR_CMPLX_TYPE
                   | ERR_CMPLX_LABEL error_complex_types 
                   | ERR_CMPLX_DEF error_complex_types
                   | ERR_CMPLX_UNEXPECTED error_complex_types 
                   | ERR_CMPLX_TYPE error_complex_types
                   ;

complex_words:  CMPLX_WORD | CMPLX_WORD complex_words ;

asn_complex_block: {/* */ }
                 | CMPLX_NLINE asn_complex_block {/* */ }
                 | error_complex_root asn_complex_block { parse_error($1); }
                 | CMPLX_CSIGN complex_words CMPLX_NLINE asn_complex_block 
{/*comment in complex*/}
                 | CMPLX_WORD error_complex_types asn_complex_block  { 
parse_error($2);}
                 | CMPLX_WORD CMPLX_DSIGN asn_complex_type {
                   /* definition section */ 
                 }asn_complex_block 

                 | CMPLX_WORD CMPLX_DECLERATION {
                        node** t_pp, * node_p ;
                        /* decleration as "mess Message"  */ 
                        local_root = r_ops.get_root() ;

                        if( chk_dupl_dectbl($2, local_root) != 0)
                            parse_error(ERR_SDECL_DUPL) ;

                        node_p = lazy_create_node($2->label, $2->def_name); 

                        if( (t_pp = get_def_node($2->def_name.s, 
$2->def_name.len)) != NULL )
                            copy_partial_tree(NULL, *t_pp, &node_p ) ; // 
define_node(t_p, node_p) ;
                        else
                            add_dec_symbol($2, &node_p, local_root) ;
                        
                        if(local_root != NULL) bind_child(&local_root, &node_p) 
;
                        else printf("Warning from bison! Logical Failure\n"); 


                 } asn_complex_block 

                 | CMPLX_WORD CMPLX_DSIGN error_complex_types asn_complex_block 
{  parse_error($3); }
                 | CMPLX_WORD error_complex_types CMPLX_DECLERATION 
asn_complex_block {parse_error($2);}
                 
                 | CMPLX_WORD CMPLX_DSIGN asn_complex_type error_complex_types 
asn_complex_block { 
                        parse_error($4); 
                 }
                 | CMPLX_WORD asn_complex_type CMPLX_RANGE{
                        node* search_p = NULL;
                        local_root = r_ops.get_root() ;
                        
                        if( (search_p = tree_search_label(local_root, 
$2->label, $2->asn_type))==NULL){

                            search_p = create_node($2->label, $2->asn_type, 
FALSE, FALSE, $2->lo, $2->hi) ;
                            bind_child(&local_root, &search_p) ;        
                        } else {
                                printf("there is already a node %.*s at %.*s 
level, not adding\n", 
                                        search_p->label.len, search_p->label.s, 
local_root->label.len,
                                        local_root->label.s) ;
                        }

                 }asn_complex_block
                 | CMPLX_WORD asn_complex_type {

                 }asn_complex_block 
                 
                 | CMPLX_WORD asn_complex_extendable OC_BRACK {
                        /* pre recursive complex environment ops */     
                        node* node_p = create_node($2->label, $2->asn_type, 
FALSE, FALSE, $2->lo, $2->hi);
                        r_ops.push(node_p) ;

                  }asn_complex_block CC_BRACK{
                        /* post recursive complex environment ops */ 
                        node* search_res, *t_p ;
                        node* complex_child = r_ops.get_root() ; /*gets the one 
upper root */ 
                        r_ops.pop() ; /* clean the node from roots list */ 
                        t_p = r_ops.get_root() ;
                        if( (search_res = tree_search_label(t_p, 
complex_child->label, complex_child->asn_type))==NULL){
                            bind_child(&t_p, &complex_child) ;
                        } 
                    
//                      printf("complex block closed his local_root:%.*s\n", 
t_p->label.len, t_p->label.s) ;
                 }asn_complex_block

                 | CMPLX_WORD CMPLX_DSIGN asn_complex_extendable CMPLX_NLINE 
asn_complex_block
                 | CMPLX_WORD CMPLX_DSIGN asn_complex_extendable OC_BRACK 
asn_complex_block CC_BRACK asn_complex_block
                 
                 | WORD DEFINITION_SIGN asn_extendable_type OC_BRACK {
                        /* pre complex environment ops */ 
                        node* node_p = create_node($4->label, $4->asn_type, 
FALSE, FALSE, $4->lo, $4->hi) ;
                        r_ops.push(node_p) ;
                        local_root = r_ops.get_root() ;
                        /* add to the definition list */ 
                        add_def_symbol($4, &node_p); 
                 
                 } asn_complex_block CC_BRACK {
                    /* post complex environment operations */
                    int i ;
                    struct dec_table** d_t = NULL ; 
                    struct dec_table** t_pp = NULL;
                    local_root = r_ops.get_root() ;
                    const char* lit_root = "root" ;

                    /* check decleration table for the definition name */ 
                    d_t = resolve_definition(local_root->label.s, 
local_root->label.len);

                        for(t_pp = d_t ; *t_pp != NULL ; t_pp++){

                            /* if root decleration has been found */ 
                            if((*t_pp)->vater == NULL && 
                                strncmp((char *)(*t_pp)->label.s, lit_root, 
(*t_pp)->label.len)==0){
                                local_root->is_root = TRUE ; 
                                r_ops.push_troot(local_root) ;
                            }else {     
                                for(i=0; (*t_pp)->node_p[i] != NULL ; i++ ){
                                    copy_partial_tree(NULL, local_root, 
&((*t_pp)->node_p[i]) ); 
                                }
                            }
                            del_decl_from_table(*t_pp) ;
                        }

                    free(d_t) ;         /* must free the allocated list */ 
                    r_ops.pop() ;
                }
                ; /* end of complex parse rules */ 

error_complex_root:  ERR_CMPLX_ROOT


                 
asn_base_type: INTEGER {/* printf(" hop there was a integer there, i 
saw!\n");*/  } 
             | ENUMERATED  
             | BOOLEAN  
             | OCTET_STRING {/*printf(" haha octet string also matches!\n")*/} 
             | IA5STRING 
             | UTF8STRING 
             | asn_extendable_type
             ;

asn_extendable_type: SEQUENCE 
                   | CHOICE 
                   ;

asn_complex_type: CMPLX_INTEGER {/*printf(" hop there was a integer there, i 
saw!\n"); */} 
                | CMPLX_ENUMERATED  
                | CMPLX_BOOLEAN  
                | CMPLX_OCTET_STRING {/*printf(" haha octet string also 
matches!\n")*/} 
                | CMPLX_IA5STRING 
                | CMPLX_UTF8STRING
                ;

asn_complex_extendable: CMPLX_SEQUENCE
                      | CMPLX_CHOICE
                      ;

%%

extern FILE* yyin ;

int parse_file(char* filename){
    FILE* file_stream ;

    if( (file_stream = fopen(filename, "r")) == NULL){
        printf("File cannot be opened. Halt\n") ;
    }
    yyin = file_stream ;
    while(!feof(yyin)) { yyparse() ; } /* liest eine zeile und das war's! */ 

return EXIT_SUCCESS ;    
}

static void yyerror(char *s){ 
//    printf("Line %d: Char %d: %s (last token was '%s')\n",
//      lineno, charno, s, yytext) ; 
      printf("(last token was '%s')\n", s) ; 
}
int main(void){ 

r_ops.init_rstack = finit_rstck ;
r_ops.push = push ;
r_ops.push_troot = push_troot ;
r_ops.pop = pop ;
r_ops.get_root = get_root ;
asn_mod_root = NULL ;
init_tokenizer();
r_ops.init_rstack() ;
parse_file("simple.txt") ;
return  EXIT_SUCCESS ;
}


void parse_error(int type){

        switch(type){
        
            case ERR_INIT_DSIGN:
                 printf("a stand alone ::= is found, exitting\n"); 
            break ;
            
            case ERR_DECLR_WORD :
                printf("Special decleration keyword is different than base type 
and \
                must be followed by newline, exitting.\n"); 
            break ;

            case ERR_LABEL_NLINE:
                printf("no decleration found after label, exitting\n"); 
            break ;

            case ERR_SIMPL_DUPL:
                printf("Duplicated labels, quitting\n"); 
            break ;
            case ERR_SDECL_DUPL:
                printf("Duplicated decleration labels, quitting\n"); 
            break ;
            case ERR_SIMPL_BTYPE:
                printf("Only one base type is allowed\n"); 
            break ;

            case ERR_SIMPL_GEN:
                printf("After base type should a newline follow, quitting\n");
            break ;

            case ERR_DEFIN_WORD:
                printf("Definition is followed by a base type and nothing else, 
quitting\n");
            break ;

            case ERR_CMPLX_LABEL:
                printf("No use of more than one label in cascaded environment 
allowed, exitting.\n");
            break;

            case ERR_CMPLX_UNEXPECTED:
                printf("No use of stand-alone decleration sign in casc. env 
allowed, exitting\n");
            break;

            case ERR_CMPLX_DEF:
                printf("No use of more than one base/extendable types in 
cascaded environment allowed, exitting.\n"); 
            break;
            case ERR_CMPLX_TYPE:
                printf("No use of Base Type words in declerations, 
quitting\n"); 
            break ;
            case ERR_ROOT_DECL:
                printf("root has already being defined, quitting\n");
            break;
            case ERR_ROOT_ABSENCE:
                printf("No root decleration has been found, quitting\n") ;
            break;
            case ERR_ROOT_NLINE:
                printf("root has no identifier, quitting\n");
            break;
            case ERR_CMPLX_ROOT:
                printf("root cannot be defined in recursive env.\n");
            break;
            default:
                printf("have you forgotten to bridge? val:%d\n", type);
            break ;     
        }

exit(0);
}

_______________________________________________
help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison

Reply via email to