Hi,
My name is David Ja, an undergraduate student at university of
pennsylvania. I am attempting to start a minor research project myself. I
been trying to adapted bison to my own purpose but after a month of trying I
can't seem to figure out a way to make it work. All I wanted to do was to
take advantage of bison's parser which generates the DFA, which in turn,
allows me to step through the DFA in sequence generating a sample string
that fits the grammar input. For example if the grammar is the grammar for
an web address. My program will be able to generate
http://www.abc.org<http://www.abc.org>.
I have attached my "attempt" code with this email. The problem I arrive at
is I don't seem to be able to compile it with bison code. For some reason,
even if I leave it in the same folder as bison src, I still arrive at a
deference to pointer error. I'm sorry if I made an elementary mistake or
something stupid. Thank you for any help/suggestions you can give me. It is
also possible I'm not taking advantage of bison data structure the right
way. If so I am sorry if I wasted any of your time. This is my first attempt
at understand the inner working of a program of this magnitude. If I am not
being clear about something or if I email the wrong place. I am extremely
sorry. Again thank you very much for any help you can give me.
Best,
David
/* Author: David Ja Date: Aug 02, 2005
*
* attempt at a string generating function
* this is not a complete code
* the ideal situation is that this would be
* inserted into bison main so that it runs this
* right after it completed generating DFAs.
* (after lalr)
* Thus the DFA that is generated can be immediately
* utilized and use to generate a string
*/
#include "state.h"
#include "gram.h"
#include "symtab.h"
#include "assoc.h"
#include "location.h"
#include "uniqstr.h"
#include "system.h"
#include "complain.h"
#include "reader.h"
#include "reduce.h"
#include "hash.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int stack[10];
int stackPointer;
char* myoutput;
/*
* push onto stack
*/
int push(int currentState)
{
stackPointer++; // increase stack pointer
if(stackPointer == 10) {
printf("full stack\n");
return 0;
}
else {
stack[stackPointer] = currentState; // store current state
number on stack
stack[stackPointer+1] = '\0';
}
return 1;
}
/*
* pop off stack
*/
int pop()
{
if(stackPointer == -1) {
printf("below stack\n");
return 0;
}
else {
stack[stackPointer] = '\0'; // reset the values store on stack
to NULL (popping)
}
stackPointer--; // reduce stack pointer
}
/*
* find the state to go to if reduced
*/
int findReduce(int currentState, int random)
{
int i;
int length;
// transition is goto
if(TRANSITION_IS_GOTO(states[currentState]->transitions, random)) {
for(i = 0; i<(states[currentState]->reductions->num); i++) {
// find the rule where the lhs sym is the same as teh
access symbol of the resulting goto
if(states[currentState]->reductions->rules[i]->lhs ==
TRANSITION_SYMBOL(states[currentState]->transitions, random)){
break;
}
}
// if not found
if(i >= (states[currentState]->reductions->num)) {
return -1;
}
// if found
else {
// get number of right hand symbol
length =
rule_rhs_lengt(states[currentState]->reductions->rules[i]);
// pop states off the stack
for(i = 0; i<length; i++) {
pop();
}
// return the state the goto ends up
return
states[currentState]->transitions->states[random]->state_number;
}
}
else {
return -1;
}
return 0;
}
/*
* step into state i and return the next state
*/
int getNextState(int currentState)
{
int random;
// get a random number to chose a path to take in the DFA
random = rand()%(states[currentState]->transitions->num);
if(states[currentState]->transitions->states[random]!= NULL) {
// if shift
if(TRANSITION_IS_SHIFT(states[currentState]->transitions,
random)) {
if(myoutput != NULL) {
// add the symbol to the myoutput string
strcat(myoutput,
symbols[TRANSITION_SYMBOL(states[currentState]->transitions, random)]->tag);
}
else {
// if first symbol, make myoutput string the
symbol
strcpy(myoutput,
symbols[TRANSITION_SYMBOL(states[currentState]->transitions, random)]->tag);
}
// push state onto stack
push(currentState);
// return state that is shifted to
return
states[currentState]->transitions->states[random]->state_number;
}
// reduce case (gotos)
else {
return findReduce(currentState, random); // find the
state where goto ends in
}
}
return 0;
}
/*
* generate a string of tokens base on bison's data structure
*/
char* stringGenerator()
{
int currentState;
stack[0] = '\0'; // set stack to NULL at first
stackPointer = -1; // stack pointer bellow stack
currentState = getNextState(0); // take in state 0
while(currentState != -1) {
currentState = getNextState(currentState); // continue to take
in state until end
}
return myoutput; // returns string output
}
_______________________________________________
[email protected] http://lists.gnu.org/mailman/listinfo/help-bison