IF Anweisung in Flex bison realisieren

hallo,
kannst du mir anhand eines Beispiels zeigen wie man eine tabelle anlegt, soweit bin ich noch nicht, hab gerade erst angefangen flex bison richtig anzuwenden kenne mich noch nicht so genau aus.Danke.

Gruß
 
hallo,
kannst du mir anhand eines Beispiels zeigen wie man eine tabelle anlegt, soweit bin ich noch nicht, hab gerade erst angefangen flex bison richtig anzuwenden kenne mich noch nicht so genau aus.Danke.
Ganz simpel könntest du erstmal ein Array dafür nehmen.
C:
typedef struct { const char name[20];
LabelStmt* link;
} label_stmt;

label_stmt label_tab[100];
Gruß
 
Hallo,
ne da ist ein beispiel wie ich die Tabelle mit Kommandos fülle oder wie ne neue Eingabe zeile dann verglichen wird.
dann ne kleine Zusammenfassung:

eine Tabelle, in der alle Kommandowörter aufgeführt sind und die dazu zugehörigen Funktionen, die aufzurufen
sind:

Code:
struct Command
{
  const char*  Keyword;
  FktPtr       Function;
};
Interpreter kann max. 20 Kommandos halten :

Code:
#define MAX_COMMANDS 20
struct Command Commands[ MAX_COMMANDS ];
int NrCommands = 0;
Jetzt noch eine Funktion, die ein neuese Kommando einfügt:
Code:
unsigned char AddCommand( const char* Keyword, FktPtr Function )
{
  if( NrCommands >= MAX_COMMANDS )
    return FALSE;

  Commands[NrCommands].Keyword = Keyword;
  Commands[NrCommands].Function = Function;
  NrCommands++;

  return TRUE;
}
Beispiel:
Code:
void TestFkt( int count, int* args )
{
}

void EchoFkt( int count, int* args )
{
  int i;

  for( i = 0; i < count; ++i )
    printf( "%d\n", args[i] );
}

int main()
{
  AddCommand( "test", TestFkt );
  AddCommand( "echo", EchoFkt );
}
vom Benutzer kommt eine Eingabezeile. Was ist zu tun?
Das erste Wort aus der Einagbezeile ist zu extrahieren. Damit wird in die Kommandotabelle gegangen und der entsprechende Eintrag gesucht. Wird einer gefunden, wird die zugehörie Funktion aufgerufen

Code:
void Execute( const char* Input )
{
  size_t i, j;
  char Command[20];

  // Whitespace am Anfang überlesen

  while( Input[i] != '\0' && ( Input[i] == ' ' || Input[i] == '\t' ||
                               Input[i] == '\n' ) )
    i++;
  if( Input[i] == '\0' )
    return

  j = 0;
  while( Input[i] != '\0' && !( Input[i] == ' ' || Input[i] == '\t' ||
                                Input[i] == '\n' ) ) {
    Command[j++] = Input[i++];

  for( i = 0; i < NrCommands; ++i ) {
    if( stricmp( Commands[i].Keyword, Command ) == 0 ) {
      (*Commands[i].Function)();
      return;
    }
  }

  printf( "Don't know how to \'%s\'\n", Command );
}
so ungefähr wäre das passabel zu meinem beispiel.Danke.

MfG
matrix
 
Hallo,
lange nicht mehr voneinander gehört,
Hab das Programm soweit erweitert, hab auch den label und jump befehl implementiert, damit er im Baum danach suchen kann, aber irgendwie klappt das nicht, ich glaube da stimmt was nicht mit der implementierung von label_stmt und jmp_stmt,

label_stmt: ':' NAME
{ $$ = newStmtNode(LabelK);
$$->child[0] = $2;

}

jmp_stmt: JMP NAME
{$$ = newStmtNode(JmpK);
$$->attr.name = strdup($2);

de Pointer auf den String in attr.name glaube ich ist nicht in ordnung.
Kannst du mir irgendwie weiterhelfen, Ich habe die files in bitbucket hochgeladen kannst dir runterladen in
http://bitbucket.org/matrix/changed-tiny.

Gruß
Matrix
 
Hi.

Bitte verwende die Code-Tags! :google:

Ein Label ist ein Nichtterminalsymbol und besteht aus einem Doppelpunkt und einem Bezeichner. Ein zusätzliches Token NAME ist somit überflüssig.

Gruß
 
Hallo,
hab ne weitere Idee, weiß aber nicht wie ich das implementieren soll.
Ich mach einen Knoten für den label, aber wie schaffe ich denn den namen des Labels in diesem Knoten zu speichern
und wie mache ich die Ausgabe.

Ich glaube so ist es nicht in Ordnung:
label_stmt: ':' NAME
{ $$ = newStmtNode(LabelK);
$$->child[0] = $2;

}

Gruß
matrix

Hi.

Bitte verwende die Code-Tags! :google:

Ein Label ist ein Nichtterminalsymbol und besteht aus einem Doppelpunkt und einem Bezeichner. Ein zusätzliches Token NAME ist somit überflüssig.

Gruß

meinst du etwa so

Code:
label_stmt: ':' ID 
    { $$ = newStmtNode(LabelK);
      /*$$->child[0] = $2;*/
	$$->attr.name = strdup($2);

    }

jmp_stmt: JMP ID
	{$$ = newStmtNode(JmpK);
	/*$$->attr.name = strdup($2);*/
	$$->child[0] = $2;	

	}
danke.
 
Hi.

Ich meine zuallererst mal deine Tokendefinition:
Code:
"label" {return NAME;}
Wozu soll das denn gut sein? Wenn dort das Schlüsselwort "label" auftaucht, lieferst du NAME zurück. Laut deines Beispiels gibt es überhaupt kein "label" Schlüsselwort.

Außerdem hast du hier dem Token NAME überhaupt keinen Wert zugewiesen. Wie willst du dann später noch auf den Namen zugreifen?

Gruß
 
Zurück