[flex/bison] grammatica vars

Pagina: 1
Acties:

  • cenix
  • Registratie: September 2001
  • Laatst online: 17-05 08:56
Hoe kan ik met flex/bison zorgen dat ik de gevonden waardes weer kan
teruglezen?
Wat ik wil is een stukje tekst met deze vorm '1 0 obj' lezen waarbij ik wil
zien welke waardes er voor obj gelezen zijn.

momenteel probeer ik zoiets:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
%union
{
    int nr;
}

%type <nr> number

%%

inobj:
          OBJ number
          {
             printf("nummer %d\n", $2);
          }


waardoor ik deze melding krijg bij het 'compileren' met bison
symbol number used, not defined as token, and no rules for it
parser.y contains 1 useless nonterminal.
als ik %type vervang door %token krijg ik geen foutmelding, maar zoals verwacht werkt het dan niet.
Heb ik iets verkeerd begrepen of ligt het ergens anders aan?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je bent OBJ vergeten te definieren als een token

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cenix
  • Registratie: September 2001
  • Laatst online: 17-05 08:56
nee hoor:
hieronder het volledige stukje grammatica. En daarbij krijg ik de fout ook echt op 'number'.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

int yyparse(void);
int yylex(void);

int yywrap()
{
    return 1;
}

void yyerror(char *str)
{
    fprintf(stderr, "Error: %s\n", str);
}

#define YYDEBUG 1
%}

%start commands
%token OBJ ENDOBJ NUMBER

%union
{
    int nr;
}

%type <nr> number

%%

commands: /* empty */
        | commands command
        | error '\n' { yyerrok; yyclearin; }
        ;

command:
        inobj
        |
        notinobj
        ;

inobj:
        OBJ number
        {
            printf("number %d\n", $2);
        }
        ;
        
notinobj:
        ENDOBJ
        {
            printf("\tLeft object\n");
        }
        ; 
%%

main()
{
    yyparse();
}


sorry voor de lange post >:)

[ Voor 9% gewijzigd door cenix op 02-11-2004 14:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

number is ook helemaal niet gedefinieerd. Je hebt wel een NUMBER, wat een terminal is. Bedoel je die niet gewoon? (Ook even NUMBER in uppercase schrijven bij %type)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cenix
  • Registratie: September 2001
  • Laatst online: 17-05 08:56
Dat denk ik niet, want ik heb '%type <nr> number' met kleine letters geschreven en bij de grammatica regels heb ik ook 'OBJ number' met kleine letters staan.
De %token NUMBER stond er nog in van eerdere tests, maar wordt nu niet meer gebruikt.

Wat ik verder ook vreemd vindt is dat diverse voorbeelden op internet dezelfde manier gebruiken. Ik denk dat ik die voorbeelden eens ga proberen te runnen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is number dan? Je hebt het verder nergens gedefinieerd. De parser verwacht bij een inobj een OBJ token gevormd door een number. Wat is een number? Geen token, je hebt het niet gedefinieerd als token. Het is ook geen non-terminal, omdat er verder geen rule bestaat die number weer opbreekt in verdere terminals en non-terminals.

En dat terzijde, je bedoelt gewoon een token. Ik neem aan dat het een getal is die wordt ingelezen door de lexer? De lexer retourneert het token NUMBER met als data het getal zelf. Die data is waarvoor je %type definieert

Probeer het nou maar, doe een find&replace op 'number' naar 'NUMBER', en zorg dat je lexer een NUMBER returnt als ie een getal tegenkomt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cenix
  • Registratie: September 2001
  • Laatst online: 17-05 08:56
grmppf.. ik heb het probleem gevonden.

Ik had in m'n lex rules een regex staan die controleerde op een sequence
<nummer> <nummer> obj en pas daarna door mocht.. hierdoor krijgt de parser
een verkeerde token terug |:(
Nu dat ik gewoon op 'obj' test en de parser laat controleren op het juiste voorkomen van een sequence, lukt het wel..

@.oisyn: ik weet niet of de rename naar hoofdletters geholpen heeft, maar ik ga ervan uit van wel :Y)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

cenix schreef op 02 november 2004 @ 15:56:
Nu dat ik gewoon op 'obj' test en de parser laat controleren op het juiste voorkomen van een sequence, lukt het wel..
Dat is dan ook wat de parser behoort te doen, niet de lexer ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cenix
  • Registratie: September 2001
  • Laatst online: 17-05 08:56
Jep, maar omdat ik eerst begonnen ben met het schrijven van een lexer, en daarna pas de parser heb toegevoegd en onvolledig ben geweest met het nalopen van de lexer liep ik tegen problemen aan.

Morgen eerst nog maar eens de zaken nalopen en controleren :+
Pagina: 1