[Antlr] Parser blijft fouten geven

Pagina: 1
Acties:

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 06-05 18:56
Ik ben een applicatie aan het maken voor mijn opleiding. Dat moet een parser worden voor een bepaalde kennisdatabase. Deze code heb ik gebruikt om mijn parser te testen. Voor de volledigheid dit is een stukje code die een fuzzy logic set beschrijft:

code:
1
2
3
4
5
6
7
KB
UNIVERSE flux
    SET little 0 0 0 8 SETEND
    SET normal 0 8 8 16 SETEND
    SET much 8 16 16 16 SETEND
UNIVERSEEND
KBEND


Het bestand lees ik in door met java een bestand door te laten browsen naar een file en vervolgens als inputstream te sturen naar de lexer. Maar het wil ik niet werken. Ik blijf steeds dezelfde error krijgen:

code:
1
line 1:1: expecting "KB", found 'K'


Ik vermoede eerst dat het aan het inlezen ligt. Maar als ik token voor token af laat drukken op hetscherm laat hij de volledige inhoud van het bestand op het scherm zien.
Misschien is het wel een heel simpel probleem maar met behulp van de documentatie op Antlr en google kan ik er maar niet uitkomen.

Dit is de BNF code

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
65
66
67
68
69
70
71
72
73
74
75
class BNFparser extends Parser;

knowledgeBase
    :   "KB"
        universeList  
        "KBEND"
    ;
    
universeList
    : universe (universe)*
    ;

universe
    :   "UNIVERSE"
        universeName
        setList
        "UNIVERSEEND"
    ;
    
setList
    :   set (set)*
    ;

set
    : "SET" 
        setName
        x1
        x2
        x3
        x4
        "SETEND"
        
    ;

universeName
    :   name
    ;
    
setName
    :   name
    ;
    
x1
    :   n:DIGIT
    { System.out.println("x1: "+n.getText()+"/n"); }
    ;
x2
    :   n:DIGIT
    { System.out.println("x2: "+n.getText()+"/n"); }
    ;
x3
    :   n:DIGIT
    { System.out.println("x3: "+n.getText()+"/n"); }
    ;
x4  
    :   n:DIGIT
    { System.out.println("x4: "+n.getText()+"/n"); }
    ;
    
name 
    :   LETTER
        ( LETTER 
        | DIGIT )
    ;
    

class BNFlexer extends Lexer;

LETTER
    :   ('a'..'z'|'A'..'Z')
    ;

DIGIT
    :   ('0'..'9')
    ;


Ik vermoed dat ik een fout maak in de structuur van mijn bestand. Op zich een heel simpele structuur! Wie kan mij verder helpen? :)

http://hawvie.deviantart.com/


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Het is al een hele tijd geleden dat ik iets met ANTLR heb gedaan. Maar mijn gok is dat je KB een token moet maken.

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 06-05 18:56
Alarmnummer schreef op dinsdag 11 januari 2005 @ 20:23:
Het is al een hele tijd geleden dat ik iets met ANTLR heb gedaan. Maar mijn gok is dat je KB een token moet maken.
Dus in principe zou dit het oplossen?

code:
1
2
3
4
5
knowledgeBase
    :   KBPREFIX
        universeList  
        KBPOSTFIX
    ;


en

code:
1
KBPREFIX: "KB";


Bedoel je dat met er een token van maken?

http://hawvie.deviantart.com/


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Je moet een 'testLiterals' optie toevoegen bij LETTER:
code:
1
2
3
4
LETTER
    options { testLiterals = true; }
    :    ('a'..'z'|'A'..'Z')
    ;

Dan kijkt ie eerst of de token bestaat als keyword.

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 06-05 18:56
Heeft het misschien wat te maken met het feit dat ik een bestand in lees? Want als ik het cut'n past voorbeeld van de antlr download gaat het ook fout.. Waar moet ik rekening mee houden als ik een bestand probeer te parsen?

http://hawvie.deviantart.com/


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

HawVer schreef op dinsdag 11 januari 2005 @ 22:22:
Heeft het misschien wat te maken met het feit dat ik een bestand in lees? Want als ik het cut'n past voorbeeld van de antlr download gaat het ook fout.. Waar moet ik rekening mee houden als ik een bestand probeer te parsen?
Ik geloof dat er op zijn site wel een goeie tutorial te vinden is. Ik heb in het verleden het een en ander met ANTLR gedaan en heb me altijd kunnen redden met de documentatie.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Mijn suggestie heeft niet geholpen?

Ik zie nu iets anders wat volgens mij niet helemaal goed is. Je hebt:
code:
1
2
3
4
5
6
7
8
9
name 
    :    LETTER
        ( LETTER 
        | DIGIT )
    ;

LETTER
    :    ('a'..'z'|'A'..'Z')
    ;

Een name kan dan maximaal 2 chars lang zijn: LETTER LETTER of LETTER DIGIT. Logischer is:
code:
1
2
3
4
NAME
    options { testLiterals = true; }
    :    ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')*
    ;

(Uit m'n hoofd)

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 06-05 18:56
Goed ik heb de fout opgelost. Waar het nou precies aan lag weet ik niet. Ik heb een heel aantal extra verwijzingen eruit gehaald die in principe dubbelop waren. Daarna heb ik een aantal nondeterminism warnings eruit gesloopt door flink wat aan de naamgeving te doen. Bijvoorbeeld KB kan ook voorkomen in KBEND. Daarna zat ik met een volgend probleem.. Een token van een naam wordt nooit ergens mee afgesloten. Met andere woorden hij leest de rest van de code leest ie in al zou het de naam van univserse zijn. Dus toen heb ik overal apart de spatie gedefinieerd. Met de commandline input werkt ie in ieder geval helemaal nu hopen dat hij het doet als ik hem als bestand in lees. :)

Nu kom ik op dit resultaat uit:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
class BNFparser extends Parser;

knowledgeBase
    :   "KBSTART" WH
        universe (universe)*  
        "KBEND" WH
    ;
    
universe
    :   
      "UNIVERSESTART" WH
        DIGNAM (DIGNAM)* WH
        set (set)*
      "UNIVERSEEND" WH
    ;
    
set
    : "SETSTART" WH
        DIGNAM (DIGNAM)* WH
        x1 WH
        x2 WH
        x3 WH
        x4 WH
        "SETEND" WH
        
    ;
    
x1
    : n:DIGIT 
    { System.out.println("x1: "+n.getText()+"/n"); }
    ;
x2
    :   n:DIGIT 
    { System.out.println("x2: "+n.getText()+"/n"); }
    ;
x3
    :   n:DIGIT 
    { System.out.println("x3: "+n.getText()+"/n"); }
    ;
x4  
    :   n:DIGIT
    { System.out.println("x4: "+n.getText()+"/n"); }
    ;
    

class BNFlexer extends Lexer;
options {

  testLiterals=false;    // don't automatically test for literals
  k=10;                   // two characters of lookahead
  
}

DIGNAM
    options { testLiterals = true; }
    :    ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')*
    ;

DIGIT
    :   ('0'..'9')
    ;

WH
    :   ' '
    ;

WS
  : ( '\t'
    | '\f'

    // handle newlines
    | ( "\r\n"  // Evil DOS
      | '\r'    // Macintosh
      | '\n'    // Unix (the right way)
      )
      { newline(); }
    )
    { $setType(Token.SKIP); }
  ;

http://hawvie.deviantart.com/

Pagina: 1