Ik ben bezig met een eigen programmeer taaltje, deze moet LL(1) zijn.
De grammatica (geschreven in antlr):
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
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