Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
prob-teaching-notebooks
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
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
general
stups
prob-teaching-notebooks
Commits
da836c18
Commit
da836c18
authored
4 years ago
by
Chris
Browse files
Options
Downloads
Patches
Plain Diff
Zuweisung von Zahl zu Variable und LOOPs mit 0 Durchläufen funktionieren jetzt richtig
parent
d1345f0b
No related branches found
No related tags found
1 merge request
!1
Master
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
info4/kapitel-8/Interpreter/interpreter.py
+109
-9
109 additions, 9 deletions
info4/kapitel-8/Interpreter/interpreter.py
with
109 additions
and
9 deletions
info4/kapitel-8/Interpreter/interpreter.py
+
109
−
9
View file @
da836c18
...
@@ -23,7 +23,7 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
...
@@ -23,7 +23,7 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
value_1
=
0
value_1
=
0
if
token_queue
[
position
+
2
].
k
==
'
NUMBER
'
:
if
token_queue
[
position
+
2
].
k
==
'
NUMBER
'
:
value_1
+
=
int
(
token_queue
[
position
+
2
].
v
)
value_1
=
int
(
token_queue
[
position
+
2
].
v
)
value_list
.
update
({
identifier_1
:
value_1
})
value_list
.
update
({
identifier_1
:
value_1
})
return
position
+
3
,
value_list
return
position
+
3
,
value_list
...
@@ -31,7 +31,8 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
...
@@ -31,7 +31,8 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
raise
SyntaxError
(
"
IDENTIFIER in Zuweisung erwartet.
"
)
raise
SyntaxError
(
"
IDENTIFIER in Zuweisung erwartet.
"
)
identifier_2
=
token_queue
[
position
+
2
].
v
identifier_2
=
token_queue
[
position
+
2
].
v
if
identifier_2
in
forbidden_identifiers
:
if
identifier_2
in
forbidden_identifiers
:
raise
Exception
(
"
Identifier
"
+
identifier_2
+
"
ist bereits in Loop vorhanden und darf nicht verwendet werden.
"
)
raise
Exception
(
"
Identifier
"
+
identifier_2
+
"
ist bereits in Loop vorhanden und darf nicht verwendet werden.
"
)
if
identifier_2
in
value_list
:
if
identifier_2
in
value_list
:
value_2
=
value_list
.
get
(
identifier_2
)
value_2
=
value_list
.
get
(
identifier_2
)
...
@@ -49,29 +50,124 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
...
@@ -49,29 +50,124 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
value_list
.
update
({
identifier_1
:
value_1
})
value_list
.
update
({
identifier_1
:
value_1
})
return
position
+
5
,
value_list
return
position
+
5
,
value_list
def
verify_assignment
(
token_queue
,
position
,
forbidden_identifiers
):
identifier_1
=
token_queue
[
position
].
v
if
identifier_1
in
forbidden_identifiers
:
raise
Exception
(
"
Identifier
"
+
identifier_1
+
"
ist bereits in Loop vorhanden und darf nicht verwendet werden.
"
)
if
not
token_queue
[
position
+
1
].
k
==
'
EQUALS
'
:
raise
SyntaxError
(
"
:= in Zuweisung erwartet.
"
)
if
token_queue
[
position
+
2
].
k
==
'
NUMBER
'
:
return
position
+
3
if
not
token_queue
[
position
+
2
].
k
==
'
IDENTIFIER
'
:
raise
SyntaxError
(
"
IDENTIFIER in Zuweisung erwartet.
"
)
identifier_2
=
token_queue
[
position
+
2
].
v
if
identifier_2
in
forbidden_identifiers
:
raise
Exception
(
"
Identifier
"
+
identifier_2
+
"
ist bereits in Loop vorhanden und darf nicht verwendet werden.
"
)
if
not
token_queue
[
position
+
4
].
k
==
'
NUMBER
'
:
raise
SyntaxError
(
"
NUMBER in Zuweisung erwartet.
"
)
if
not
token_queue
[
position
+
3
].
k
in
[
'
PLUS
'
,
'
MINUS
'
]:
raise
SyntaxError
(
"
PLUS oder MINUS in Zuweisung erwartet.
"
)
return
position
+
5
def
verify_loop
(
token_queue
,
position
,
forbidden_identifiers
):
identifier_token
=
token_queue
[
position
+
1
]
if
not
identifier_token
.
k
==
'
IDENTIFIER
'
:
raise
SyntaxError
(
'
IDENTIFIER in LOOP erwartet.
'
)
if
identifier_token
.
v
in
forbidden_identifiers
:
raise
SyntaxError
(
"
Identifier
"
+
identifier_token
.
v
+
"
ist bereits in Loop vorhanden und darf nicht verwendet werden.
"
)
if
not
token_queue
[
position
+
2
].
k
==
'
DO
'
:
raise
SyntaxError
(
'
DO in LOOP erwartet.
'
)
forbidden_identifiers
.
append
(
identifier_token
.
v
)
end_found
=
False
while
not
end_found
:
position
=
verify_program
(
token_queue
,
position
,
forbidden_identifiers
)
if
token_queue
[
position
].
k
==
'
SEMICOLON
'
:
position
=
position
+
1
continue
elif
token_queue
[
position
].
k
==
'
END
'
:
end_found
=
True
else
:
raise
SyntaxError
(
"
SEMICOLON oder END erwartet.
"
)
forbidden_identifiers
.
remove
(
identifier_token
.
v
)
return
position
+
1
def
verify_program
(
token_queue
,
position
,
forbidden_identifiers
):
current_key
=
token_queue
[
position
].
k
if
current_key
==
'
IDENTIFIER
'
:
try
:
current_position
=
verify_assignment
(
token_queue
,
position
,
forbidden_identifiers
)
except
IndexError
:
raise
Exception
(
"
Frühzeitiges Ende einer Zuweisung.
"
)
elif
current_key
==
'
LOOP
'
:
try
:
current_position
=
verify_loop
(
token_queue
,
position
,
forbidden_identifiers
)
except
IndexError
:
raise
Exception
(
"
Frühzeitiges Ende eines LOOPs
"
)
else
:
raise
SyntaxError
(
"
Keine passende Anweisung gefunden
"
)
return
current_position
def
process_loop
(
token_queue
,
position
,
value_list
,
forbidden_identifiers
):
def
process_loop
(
token_queue
,
position
,
value_list
,
forbidden_identifiers
):
identifier_token
=
token_queue
[
position
+
1
]
identifier_token
=
token_queue
[
position
+
1
]
if
not
identifier_token
.
k
==
'
IDENTIFIER
'
:
if
not
identifier_token
.
k
==
'
IDENTIFIER
'
:
raise
SyntaxError
(
'
IDENTIFIER in LOOP erwartet.
'
)
raise
SyntaxError
(
'
IDENTIFIER in LOOP erwartet.
'
)
if
identifier_token
.
v
in
forbidden_identifiers
:
raise
SyntaxError
(
"
Identifier
"
+
identifier_token
.
v
+
"
ist bereits in Loop vorhanden und darf nicht verwendet werden.
"
)
if
not
token_queue
[
position
+
2
].
k
==
'
DO
'
:
if
not
token_queue
[
position
+
2
].
k
==
'
DO
'
:
raise
SyntaxError
(
'
DO in LOOP erwartet.
'
)
raise
SyntaxError
(
'
DO in LOOP erwartet.
'
)
if
identifier_token
.
v
in
value_list
:
number_of_loops
=
int
(
value_list
.
get
(
identifier_token
.
v
))
number_of_loops
=
int
(
value_list
.
get
(
identifier_token
.
v
))
else
:
number_of_loops
=
0
saved_position
=
position
+
3
saved_position
=
position
+
3
forbidden_identifiers
.
append
(
identifier_token
.
v
)
forbidden_identifiers
.
append
(
identifier_token
.
v
)
# TODO increment position without changing values when number of loops = 0
if
number_of_loops
==
0
:
end_found
=
False
position
=
saved_position
while
not
end_found
:
position
=
verify_program
(
token_queue
,
position
,
forbidden_identifiers
)
if
token_queue
[
position
].
k
==
'
SEMICOLON
'
:
position
=
position
+
1
continue
elif
token_queue
[
position
].
k
==
'
END
'
:
end_found
=
True
else
:
raise
SyntaxError
(
"
SEMICOLON oder END erwartet.
"
)
for
index
in
range
(
number_of_loops
):
for
index
in
range
(
number_of_loops
):
position
=
saved_position
position
=
saved_position
end_found
=
False
end_found
=
False
while
(
not
end_found
)
:
while
not
end_found
:
position
,
value_list
=
process_program
(
token_queue
,
position
,
value_list
,
forbidden_identifiers
)
position
,
value_list
=
process_program
(
token_queue
,
position
,
value_list
,
forbidden_identifiers
)
if
token_queue
[
position
].
k
==
'
SEMICOLON
'
:
if
token_queue
[
position
].
k
==
'
SEMICOLON
'
:
position
=
position
+
1
position
=
position
+
1
continue
continue
elif
token_queue
[
position
].
k
==
'
END
'
:
elif
token_queue
[
position
].
k
==
'
END
'
:
end_found
=
True
end_found
=
True
else
:
raise
SyntaxError
(
"
SEMICOLON oder END erwartet.
"
)
else
:
raise
SyntaxError
(
"
SEMICOLON oder END erwartet.
"
)
forbidden_identifiers
.
remove
(
identifier_token
.
v
)
return
position
+
1
,
value_list
return
position
+
1
,
value_list
def
process_program
(
token_queue
,
position
,
value_list
,
forbidden_identifiers
):
def
process_program
(
token_queue
,
position
,
value_list
,
forbidden_identifiers
):
current_key
=
token_queue
[
position
].
k
current_key
=
token_queue
[
position
].
k
if
current_key
==
'
IDENTIFIER
'
:
if
current_key
==
'
IDENTIFIER
'
:
...
@@ -88,6 +184,7 @@ def process_program(token_queue, position, value_list, forbidden_identifiers):
...
@@ -88,6 +184,7 @@ def process_program(token_queue, position, value_list, forbidden_identifiers):
raise
SyntaxError
(
"
Keine passende Anweisung gefunden
"
)
raise
SyntaxError
(
"
Keine passende Anweisung gefunden
"
)
return
current_position
,
values
return
current_position
,
values
def
interpret
(
program
):
def
interpret
(
program
):
tokens
=
lexer
.
tokenize
(
program
)
tokens
=
lexer
.
tokenize
(
program
)
current_position
=
0
current_position
=
0
...
@@ -103,4 +200,7 @@ def interpret(program):
...
@@ -103,4 +200,7 @@ def interpret(program):
return
values
.
get
(
"
x0
"
)
return
values
.
get
(
"
x0
"
)
return
0
return
0
print
(
interpret
(
loop_program
))
print
(
interpret
(
loop_program
))
print
(
interpret
(
'''
x1:= 2;
LOOP x1 DO x2 := 2 END; x0 := x2 + 1
'''
))
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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