Ik ben bezig een compiler te schrijven voor een simpele taal in C#. De taal bestaat uit expressies en wat input/ouput statements:
Als parser gebruik ik goldparser om mijn source te parsen aangezien dit de enigste parser is die naar mijn weten ondersteuning bied voor .NET
. De meeste parsers genereren meteen uit de input een syntax tree maar de goldparser genereert alleen een parse tree. Nu moet ik dus zelf code kloppen om de parse tree om te zetten naar een AST (hoe meer code, hoe meer vreugde toch?
).
Nu is mijn vraag: Hoe kan ik het beste dit aanpakken?
Zelf zit ik de denken aan een visitor waarmee ik de parse tree ga 'traversen'. Deze wil ik een factory meegeven die een stukje parse tree als argument neemt, en dit omzet naar een AST node. Nu zit ik nog met de structuur van de AST. Ik moet zowieso een root node hebben die als base dient voor anderen. Maar welke klassen heb ik nog meer nodig? Moet ik bijv. een Statement klasse maken die als base classes weer ReadStatement, WriteStatement, etc. heeft?
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
| {String Char} = {Printable} - ["]
ID = {Letter}{Alphanumeric}*
IntegerLiteral = {Digit}+
StringLiteral = '"' {String Char}* '"'
"Start Symbol" = <Program>
<Program> ::= start <Statements> end
<Statements> ::= <Statement> <Statements>
| <Statement>
<Statement> ::= <Declarations> ;
| <Assignment> ;
| read '(' ID ')' ;
| write '(' <Expression> ')' ;
<Declarations> ::= <Declaration>, <Declarations>
| <Declaration>
<Declaration> ::= <Var Declare>
<Var Declare> ::= <Type> ID
! ===============================
! Variabelen
! ===============================
<Assignment> ::= ID ':=' <Expression>
<Type> ::= int
| string
! ===============================
! Operator precedence
! ===============================
<Expression> ::= <Add Exp>
<Add Exp> ::= <Mult Exp> '+' <Add Exp>
| <Mult Exp> '-' <Add Exp>
| <Mult Exp>
<Mult Exp> ::= <Negate Exp> '*' <Mult Exp>
| <Negate Exp> '/' <Mult Exp>
| <Negate Exp>
<Negate Exp> ::= '-' <Value>
| <Value>
<Value> ::= ID
| IntegerLiteral
| StringLiteral
| '(' <Expression> ')' |
Als parser gebruik ik goldparser om mijn source te parsen aangezien dit de enigste parser is die naar mijn weten ondersteuning bied voor .NET
Nu is mijn vraag: Hoe kan ik het beste dit aanpakken?
Zelf zit ik de denken aan een visitor waarmee ik de parse tree ga 'traversen'. Deze wil ik een factory meegeven die een stukje parse tree als argument neemt, en dit omzet naar een AST node. Nu zit ik nog met de structuur van de AST. Ik moet zowieso een root node hebben die als base dient voor anderen. Maar welke klassen heb ik nog meer nodig? Moet ik bijv. een Statement klasse maken die als base classes weer ReadStatement, WriteStatement, etc. heeft?