Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
Compilerbau - Aufgabe 1 - Stack und Syntree
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Marc-Jan Szpineter
Compilerbau - Aufgabe 1 - Stack und Syntree
Commits
492d0676
Commit
492d0676
authored
2 years ago
by
Marc-Jan Szpineter
Browse files
Options
Downloads
Patches
Plain Diff
Replace syntree.c
parent
20b5aed7
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
syntree/syntree.c
+4
-38
4 additions, 38 deletions
syntree/syntree.c
with
4 additions
and
38 deletions
syntree/syntree.c
+
4
−
38
View file @
492d0676
...
@@ -10,9 +10,11 @@ Sheung Tung Tony Tam
...
@@ -10,9 +10,11 @@ Sheung Tung Tony Tam
Eine dynamische liste (node_list) enthaelt die nodes des syntrees.
Eine dynamische liste (node_list) enthaelt die nodes des syntrees.
Jedem Knoten wird eine ID in Form eines unsigned int zugewiesen (beginnend bei 0) und ueber diese ID ist
Jedem Knoten wird eine ID in Form eines unsigned int zugewiesen (beginnend bei 0) und ueber diese ID ist
der node auch direkt in der Liste referenzierbar (z.B. node_list[5]).
der node auch direkt in der Liste referenzierbar (z.B. node_list[5]).
Der root node hat ID 0 und wird erstmal nicht gebraucht, hat aber den Effekt, dass damit die Rechnung bei 1 beginnt.
(Der root node ist ein dummy node, denn der Baum waechst von den Blaettern zur Wurzel
und es kann isolierte Knoten geben).
Der aktuelle ID-Wert wird im syntree gespeichert und bei jedem Knoten einfach hochgezaehlt.
Der aktuelle ID-Wert wird im syntree gespeichert und bei jedem Knoten einfach hochgezaehlt.
Der root node ist ein dummy node, denn der Baum waechst von den Blaettern zur Wurzel
und es kann isolierte Knoten geben.
Jeder node hat eine Liste an children (dynamisch).
Jeder node hat eine Liste an children (dynamisch).
Dabei wird einfach eine Liste an SyntreeNodeIDs gespeichert.
Dabei wird einfach eine Liste an SyntreeNodeIDs gespeichert.
...
@@ -40,9 +42,6 @@ int syntreeInit(Syntree *self) {
...
@@ -40,9 +42,6 @@ int syntreeInit(Syntree *self) {
self
->
next_ID
=
0
;
self
->
next_ID
=
0
;
self
->
root
=
self
->
next_ID
++
;
self
->
root
=
self
->
next_ID
++
;
/* DEBUG */
//printf("syntreeInit(...), size: %d\n", self->size);
self
->
node_list
=
malloc
(
SIZE_OF_UNIT
*
NODE_LIST_INIT_CAPACITY_IN_UNITS
);
self
->
node_list
=
malloc
(
SIZE_OF_UNIT
*
NODE_LIST_INIT_CAPACITY_IN_UNITS
);
self
->
capacity
=
NODE_LIST_INIT_CAPACITY_IN_UNITS
;
self
->
capacity
=
NODE_LIST_INIT_CAPACITY_IN_UNITS
;
...
@@ -64,9 +63,6 @@ int syntreeInit(Syntree *self) {
...
@@ -64,9 +63,6 @@ int syntreeInit(Syntree *self) {
void
syntreeRelease
(
Syntree
*
self
)
{
void
syntreeRelease
(
Syntree
*
self
)
{
/* DEBUG */
//printf("syntreeRelease(...), size: %d\n", self->size);
for
(
int
i
=
0
;
i
<
self
->
size
;
++
i
)
{
for
(
int
i
=
0
;
i
<
self
->
size
;
++
i
)
{
free
(
self
->
node_list
[
i
].
children
);
// free all references to children from all nodes
free
(
self
->
node_list
[
i
].
children
);
// free all references to children from all nodes
}
}
...
@@ -79,9 +75,6 @@ void syntreeRelease(Syntree *self) {
...
@@ -79,9 +75,6 @@ void syntreeRelease(Syntree *self) {
SyntreeNodeID
syntreeNodeNumber
(
Syntree
*
self
,
int
number
)
{
SyntreeNodeID
syntreeNodeNumber
(
Syntree
*
self
,
int
number
)
{
/* DEBUG */
//printf("syntreeNodeNumber(...), size: %d\n", self->size);
SyntreeNodeID
id
=
self
->
next_ID
++
;
SyntreeNodeID
id
=
self
->
next_ID
++
;
// realloc() on node_list
// realloc() on node_list
...
@@ -102,9 +95,6 @@ SyntreeNodeID syntreeNodeNumber(Syntree *self, int number) {
...
@@ -102,9 +95,6 @@ SyntreeNodeID syntreeNodeNumber(Syntree *self, int number) {
SyntreeNodeID
syntreeNodeTag
(
Syntree
*
self
,
SyntreeNodeID
id
)
{
SyntreeNodeID
syntreeNodeTag
(
Syntree
*
self
,
SyntreeNodeID
id
)
{
/* DEBUG */
//printf("syntreeNodeTag(...), size: %d\n", self->size);
SyntreeNodeID
new_id
=
self
->
next_ID
++
;
SyntreeNodeID
new_id
=
self
->
next_ID
++
;
// realloc() on node_list
// realloc() on node_list
...
@@ -127,30 +117,18 @@ SyntreeNodeID syntreeNodeTag(Syntree *self, SyntreeNodeID id) {
...
@@ -127,30 +117,18 @@ SyntreeNodeID syntreeNodeTag(Syntree *self, SyntreeNodeID id) {
self
->
node_list
[
new_id
].
children
[
0
]
=
id
;
self
->
node_list
[
new_id
].
children
[
0
]
=
id
;
/*
if (self->root == 0) {
self->root = new_id;
}
*/
return
new_id
;
return
new_id
;
}
}
SyntreeNodeID
syntreeNodePair
(
Syntree
*
self
,
SyntreeNodeID
id1
,
SyntreeNodeID
id2
)
{
SyntreeNodeID
syntreeNodePair
(
Syntree
*
self
,
SyntreeNodeID
id1
,
SyntreeNodeID
id2
)
{
/* DEBUG */
//printf("syntreeNodePair(...), size: %d\n", self->size);
return
syntreeNodeAppend
(
self
,
syntreeNodeTag
(
self
,
id1
),
id2
);
return
syntreeNodeAppend
(
self
,
syntreeNodeTag
(
self
,
id1
),
id2
);
}
}
SyntreeNodeID
syntreeNodeAppend
(
Syntree
*
self
,
SyntreeNodeID
list
,
SyntreeNodeID
elem
)
{
SyntreeNodeID
syntreeNodeAppend
(
Syntree
*
self
,
SyntreeNodeID
list
,
SyntreeNodeID
elem
)
{
/* DEBUG */
//printf("syntreeNodeAppend(...), size: %d\n", self->size);
// 'list' is no list node?
// 'list' is no list node?
if
(
self
->
node_list
[
list
].
amount_of_children
<=
0
)
{
if
(
self
->
node_list
[
list
].
amount_of_children
<=
0
)
{
fprintf
(
stderr
,
"ERROR in syntreeNodeAppend(...): list node with ID %d is no list node. The function didn't append element with ID %d.
\n
"
,
list
,
elem
);
fprintf
(
stderr
,
"ERROR in syntreeNodeAppend(...): list node with ID %d is no list node. The function didn't append element with ID %d.
\n
"
,
list
,
elem
);
...
@@ -169,9 +147,6 @@ SyntreeNodeID syntreeNodeAppend(Syntree *self, SyntreeNodeID list, SyntreeNodeID
...
@@ -169,9 +147,6 @@ SyntreeNodeID syntreeNodeAppend(Syntree *self, SyntreeNodeID list, SyntreeNodeID
SyntreeNodeID
syntreeNodePrepend
(
Syntree
*
self
,
SyntreeNodeID
elem
,
SyntreeNodeID
list
)
{
SyntreeNodeID
syntreeNodePrepend
(
Syntree
*
self
,
SyntreeNodeID
elem
,
SyntreeNodeID
list
)
{
/* DEBUG */
//printf("syntreeNodePrepend(...), size: %d\n", self->size);
// 'list' is no list node?
// 'list' is no list node?
if
(
self
->
node_list
[
list
].
amount_of_children
<=
0
)
{
if
(
self
->
node_list
[
list
].
amount_of_children
<=
0
)
{
fprintf
(
stderr
,
"ERROR in syntreeNodePrepend(...): list node with ID %d is no list node. The function didn't append element with ID %d.
\n
"
,
list
,
elem
);
fprintf
(
stderr
,
"ERROR in syntreeNodePrepend(...): list node with ID %d is no list node. The function didn't append element with ID %d.
\n
"
,
list
,
elem
);
...
@@ -196,9 +171,6 @@ SyntreeNodeID syntreeNodePrepend(Syntree *self, SyntreeNodeID elem, SyntreeNodeI
...
@@ -196,9 +171,6 @@ SyntreeNodeID syntreeNodePrepend(Syntree *self, SyntreeNodeID elem, SyntreeNodeI
void
syntreePrint
(
const
Syntree
*
self
,
SyntreeNodeID
root
)
{
void
syntreePrint
(
const
Syntree
*
self
,
SyntreeNodeID
root
)
{
/* DEBUG */
//printf("syntreePrint(...)\n");
syntreePrint_rec
(
self
,
root
);
syntreePrint_rec
(
self
,
root
);
if
(
self
!=
NULL
)
{
if
(
self
!=
NULL
)
{
...
@@ -232,9 +204,6 @@ void syntreePrint_rec(const Syntree *self, SyntreeNodeID root) {
...
@@ -232,9 +204,6 @@ void syntreePrint_rec(const Syntree *self, SyntreeNodeID root) {
void
syntree_allocateNewSpaceForNodes
(
Syntree
*
self
)
{
void
syntree_allocateNewSpaceForNodes
(
Syntree
*
self
)
{
/* DEBUG */
//printf("syntree_allocateNewSpaceForNodes(...), size: %d\n", self->size);
Node
*
new_space
=
realloc
(
self
->
node_list
,
(
self
->
capacity
+
NODE_LIST_ADD_WHEN_FULL_IN_UNITS
)
*
SIZE_OF_UNIT
);
Node
*
new_space
=
realloc
(
self
->
node_list
,
(
self
->
capacity
+
NODE_LIST_ADD_WHEN_FULL_IN_UNITS
)
*
SIZE_OF_UNIT
);
if
(
new_space
==
NULL
)
{
if
(
new_space
==
NULL
)
{
...
@@ -250,9 +219,6 @@ void syntree_allocateNewSpaceForNodes(Syntree *self) {
...
@@ -250,9 +219,6 @@ void syntree_allocateNewSpaceForNodes(Syntree *self) {
void
syntree_allocateNewSpaceForChildren
(
Syntree
*
self
,
SyntreeNodeID
id
)
{
void
syntree_allocateNewSpaceForChildren
(
Syntree
*
self
,
SyntreeNodeID
id
)
{
/* DEBUG */
//printf("syntree_allocateNewSpaceForChildren(...), size: %d\n", self->size);
SyntreeNodeID
*
new_space
=
realloc
(
self
->
node_list
[
id
].
children
,
(
self
->
node_list
[
id
].
capacity_children
+
NODE_CHILDREN_LIST_ADD_WHEN_FULL_IN_UNITS
)
*
(
sizeof
(
SyntreeNodeID
))
);
SyntreeNodeID
*
new_space
=
realloc
(
self
->
node_list
[
id
].
children
,
(
self
->
node_list
[
id
].
capacity_children
+
NODE_CHILDREN_LIST_ADD_WHEN_FULL_IN_UNITS
)
*
(
sizeof
(
SyntreeNodeID
))
);
if
(
new_space
==
NULL
)
{
if
(
new_space
==
NULL
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment