[Lexer/Parser/EBNF] eigen programmeer taaltje

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Meijuh
  • Registratie: December 2006
  • Laatst online: 17-03 21:08
Ik ben bezig met een eigen programmeer taaltje, deze moet LL(1) zijn.
De grammatica (geschreven in antlr):
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
grammar Grammar;

options {
    k=1;                                // LL(1) - do not use LL(*)
    language=Java;                      // target language is Java (= default)
    output=AST;                         // build an AST
}

tokens {
        COLON           =       ':'         ;
        SEMICOLON       =       ';'         ;
    LPAREN          =       '('         ;
        RPAREN          =       ')'         ;
        COMMA       =   ','     ;
        LCURLY      =   '{'     ;
        RCURLY      =   '}'     ;

    // operators
        ASSIGN      =       '='         ;
        PLUS            =       '+'         ;
        MINUS           =       '-'         ;
        DIVIDE      =   '/'     ;
        MULTI       =   '*'     ;
        SMALLER     =   '<'     ;
        GREATER     =   '>'     ;
        SMALLEREQ   =   '<='        ;
        GREATEREQ   =   '>='        ;
    EQUAL       =   '=='        ;
        NOTEQUAL    =   '!='        ;

    // keywords
        FUNCTION        =       'function'      ;
        FUNC        =   '#'     ;
        PRINT       =       'print'         ;
        INTEGER         =       'int'       ;
        STRING      =       'string'    ;
        BOOLEAN     =   'bool'      ;
        DO      =   'do'        ;
        SWAP        =   'swap'      ;
        IF      =   'if'        ;
        THEN        =   'then'      ;
        ELSE        =   'else'      ;
        WHILE       =   'while'     ;
}

// Parser rules


program 
    :   (programBody)* EOF
    ;

programBody
    :   varDeclare (multivar)* assignment? SEMICOLON
    |   statement SEMICOLON
    |   funcDeclaration
    ;
    
assignment  
    :   ASSIGN expression
    ;

statement   
    :   functionUse
    |   IDENTIFIER assignment
        
    ;
expression
    :   functionUse
    |   operand
    ;

varDeclare
    :   type IDENTIFIER
    ;   
    
multivar    
    :   COMMA IDENTIFIER
    ;   
    
funcDeclaration 
    :   FUNCTION type IDENTIFIER LPAREN (varDeclare assignment? COMMA)* RPAREN LCURLY programBody RCURLY
    ;
    

type    :   INTEGER
    |   BOOLEAN
    |   STRING
    ;

operand
    :       IDENTIFIER
        |       NUMBER
        |       LPAREN! expression RPAREN!
        ;

functionUse
    :   FUNC IDENTIFIER LPAREN IDENTIFIER RPAREN
    ;
    


// Lexer rules

IDENTIFIER
        :       LETTER (LETTER | DIGIT)*
        ;

NUMBER
        :       DIGIT+
        ;


COMMENT
        :       '//' .* '\n' 
                { $channel=HIDDEN; }
        ;

WS
        :       (' ' | '\t' | '\f' | '\r' | '\n')+
                { $channel=HIDDEN; }
        ;

fragment DIGIT  :   ('0'..'9') ;
fragment LOWER  :   ('a'..'z') ;
fragment UPPER  :   ('A'..'Z') ;
fragment LETTER :   LOWER | UPPER ;

// EOF


De grammatica is nog niet klaar, maar mijn probleem is als volgt. In java is het mogelijk om een methode en een variabele te laten beginnen met met een letter of cijfer, tevens hoef je niet aan te geven of je een methode declareert. In php moet je bijvoorbeeld $ voor een variabele zetten en wanneer je een functie declareert moet je er function voor zetten.

Hoe java dit doet krijg ik niet voor elkaar in mijn taal, ik moet function voor een functie declaratie zetten en # voor het gebruiken van een functie. Komt dit omdat mijn grammatica LL(1) is en de parser van java LL(2) ? Of komt dat ergens anders door?

Groetjes
meijuh

Asus EN8800GTS, Asus P5E, Intel E8400, 2x500gb Spinpoint (raid0), Zalman HP 600 watt, cnps 9500 led, creative xfi music, 4x1gb hyperX PC2 8500


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Meijuh schreef op donderdag 04 juni 2009 @ 15:44:

De grammatica is nog niet klaar, maar mijn probleem is als volgt. In java is het mogelijk om een methode en een variabele te laten beginnen met met een letter of cijfer, tevens hoef je niet aan te geven of je een methode declareert. In php moet je bijvoorbeeld $ voor een variabele zetten en wanneer je een functie declareert moet je er function voor zetten.

Hoe java dit doet krijg ik niet voor elkaar in mijn taal, ik moet function voor een functie declaratie zetten en # voor het gebruiken van een functie. Komt dit omdat mijn grammatica LL(1) is en de parser van java LL(2) ? Of komt dat ergens anders door?
In Java mag een identifier niet met een cijfer beginnen, alleen met een letter (inclusief _, $ en alle UTF letters): http://java.sun.com/docs/...ion/html/lexical.html#3.8

Misschien heb je überhaupt meer aan de JLS voor je probleem, http://java.sun.com/docs/...d_edition/html/j3TOC.html. Grammars en parsers zijn niet helemaal mijn ding dus ik kan je niet echt verder helpen.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als ik je statement en expression zo herschrijf dat ze niet verschillende redundante opties bieden, dan lijkt antlr dat te accepteren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
statement    
    :
    IDENTIFIER
    (
        LPAREN IDENTIFIER RPAREN
        |
        assignment
    )
    ;
expression
    :
    IDENTIFIER (LPAREN IDENTIFIER RPAREN)?
    |       NUMBER
    |       LPAREN! expression RPAREN!
    ;


Voor je "function"-loze functiondeclaration zal je net zoiets moeten doen dan lijkt me. Uiteraard betekent het wel dat je in je ondersteunende code wat meer intelligentie moet plaatsen en/of de bijbehorende java-functionaliteit op een nog tactischere manier in je grammar moet verwerken. Je useFunction en operand heb ik weggedaan in die grammar-file.

[ Voor 4% gewijzigd door ACM op 04-06-2009 17:23 ]


Acties:
  • 0 Henk 'm!

  • Meijuh
  • Registratie: December 2006
  • Laatst online: 17-03 21:08
Het kon met een rewrite rule:
Dus iets als

(type IDENTIFIER) -> functionDeclare

Asus EN8800GTS, Asus P5E, Intel E8400, 2x500gb Spinpoint (raid0), Zalman HP 600 watt, cnps 9500 led, creative xfi music, 4x1gb hyperX PC2 8500