Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
ssm
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Wietze Mulder
ssm
Commits
8fbb32c4
Commit
8fbb32c4
authored
May 17, 2015
by
Harm Berntsen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CLI mode
parent
b2e61b6d
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
270 additions
and
31 deletions
+270
-31
src/nl/uu/cs/ssmui/CliRunner.java
src/nl/uu/cs/ssmui/CliRunner.java
+140
-0
src/nl/uu/cs/ssmui/CodeTableModel.java
src/nl/uu/cs/ssmui/CodeTableModel.java
+1
-1
src/nl/uu/cs/ssmui/Runner.java
src/nl/uu/cs/ssmui/Runner.java
+99
-13
src/nl/uu/cs/ssmui/SSMRunner.java
src/nl/uu/cs/ssmui/SSMRunner.java
+21
-10
src/nl/uu/cs/ssmui/StepManager.java
src/nl/uu/cs/ssmui/StepManager.java
+9
-7
No files found.
src/nl/uu/cs/ssmui/CliRunner.java
0 → 100644
View file @
8fbb32c4
package
nl.uu.cs.ssmui
;
import
java.io.Reader
;
import
java.util.Vector
;
import
nl.uu.cs.ssm.Machine
;
import
nl.uu.cs.ssm.MachineState
;
import
nl.uu.cs.ssm.Messenger
;
public
class
CliRunner
implements
Messenger
{
private
static
final
long
STEPS_INFINITE
=
-
1
;
private
long
steps
;
private
MachineState
machineState
=
new
MachineState
(
5000
,
2000
,
this
);
private
Machine
machine
=
new
Machine
(
machineState
,
this
);
private
StepManager
stepManager
=
new
StepManager
(
machine
,
false
);
private
CodeTableModel
codeTableModel
=
new
CodeTableModel
(
null
,
machineState
);
public
CliRunner
(
long
steps
)
{
this
.
steps
=
steps
;
}
public
void
run
()
{
long
count
=
0
;
while
(
count
!=
steps
)
{
if
(
doAStepForward
())
{
return
;
}
if
(
count
!=
STEPS_INFINITE
)
{
count
++;
}
}
}
/**
* @return True if we are halted
*/
protected
boolean
doAStepForward
()
{
stepManager
.
beginForwardStep
()
;
machine
.
executeOne
()
;
if
(
machineState
.
isHalted
()
)
return
true
;
stepManager
.
endForwardStep
()
;
return
false
;
}
private
void
reset
()
{
codeTableModel
.
beforeReset
()
;
machine
.
reset
()
;
machineState
=
machine
.
getMachineState
()
;
codeTableModel
.
reset
()
;
}
private
void
resetToInitialState
()
{
machineState
.
resetToInitialState
()
;
}
public
void
load
(
Reader
r
)
{
String
msg
;
try
{
Vector
<
String
>
leftOverLabels
;
AssemblyParseResult
apr
;
AssemblyParser
ap
=
new
AssemblyParser
(
r
)
;
reset
()
;
codeTableModel
.
parseInitialize
()
;
for
(
apr
=
null
;
!
ap
.
isAtEOF
()
;
)
{
apr
=
ap
.
parse1Line
(
apr
)
;
if
(
apr
.
message
!=
null
)
println
(
"Line "
+
apr
.
lineNr
+
": "
+
apr
.
message
)
;
else
if
(
apr
.
instrNArgs
.
size
()
>
0
)
{
leftOverLabels
=
new
Vector
<
String
>()
;
msg
=
codeTableModel
.
enterParsedLine
(
apr
.
definedLabels
,
apr
.
instrNArgs
,
leftOverLabels
)
;
if
(
msg
!=
null
)
println
(
"Line "
+
apr
.
lineNr
+
": "
+
msg
)
;
if
(
leftOverLabels
.
size
()
==
0
)
apr
=
null
;
else
apr
.
addLabels
(
leftOverLabels
)
;
}
}
}
catch
(
Exception
ex
)
{
ex
.
printStackTrace
()
;
}
finally
{
msg
=
codeTableModel
.
parseFinalize
()
;
if
(
msg
!=
null
)
println
(
msg
)
;
}
resetToInitialState
()
;
}
@Override
public
void
println
(
String
s
)
{
System
.
out
.
println
(
s
);
}
@Override
public
void
print
(
String
s
)
{
System
.
out
.
print
(
s
);
}
@Override
public
int
promptInt
()
{
System
.
out
.
print
(
"Please enter an integer: "
);
return
Integer
.
parseInt
(
System
.
console
().
readLine
());
}
@Override
public
int
promptChar
()
{
System
.
out
.
print
(
"Please enter a character: "
);
String
line
=
System
.
console
().
readLine
();
return
line
.
charAt
(
0
);
}
@Override
public
int
[]
promptCharArray
()
{
System
.
out
.
print
(
"Please enter a string: "
);
String
s
=
System
.
console
().
readLine
();
int
[]
result
=
new
int
[
s
.
length
()];
for
(
int
i
=
0
;
i
<
s
.
length
();
i
++)
{
result
[
i
]
=
s
.
codePointAt
(
i
);
}
return
result
;
}
}
src/nl/uu/cs/ssmui/CodeTableModel.java
View file @
8fbb32c4
...
@@ -381,7 +381,7 @@ public class CodeTableModel extends AbstractTableModel
...
@@ -381,7 +381,7 @@ public class CodeTableModel extends AbstractTableModel
{
{
//fireTableChanged( new TableModelEvent( this, row ) ) ;
//fireTableChanged( new TableModelEvent( this, row ) ) ;
fireTableRowsUpdated
(
row
,
row
)
;
fireTableRowsUpdated
(
row
,
row
)
;
if
(
!
ssmRunner
.
isSettingUp
()
)
if
(
ssmRunner
!=
null
&&
!
ssmRunner
.
isSettingUp
()
)
ssmRunner
.
println
(
"Warning: code modified at "
+
Utils
.
asHex
(
e
.
cellIndex
)
)
;
ssmRunner
.
println
(
"Warning: code modified at "
+
Utils
.
asHex
(
e
.
cellIndex
)
)
;
}
}
}
}
...
...
src/nl/uu/cs/ssmui/Runner.java
View file @
8fbb32c4
...
@@ -8,18 +8,26 @@
...
@@ -8,18 +8,26 @@
package
nl.uu.cs.ssmui
;
package
nl.uu.cs.ssmui
;
import
java.io.BufferedReader
;
import
java.io.File
;
import
java.io.File
;
import
java.io.FileReader
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.io.Reader
;
import
javax.swing.UIManager
;
import
javax.swing.UIManager
;
import
nl.uu.cs.ssm.Config
;
public
class
Runner
extends
Thread
public
class
Runner
extends
Thread
{
{
protected
int
delay
=
50
;
protected
int
delay
=
50
;
SSMRunner
ssmRunner
;
SSMRunner
ssmRunner
;
public
Runner
(
File
initialFile
)
public
Runner
(
int
delay
)
{
{
this
.
delay
=
delay
;
try
{
try
{
try
{
try
{
UIManager
.
setLookAndFeel
(
UIManager
.
getSystemLookAndFeelClassName
());
UIManager
.
setLookAndFeel
(
UIManager
.
getSystemLookAndFeelClassName
());
...
@@ -29,16 +37,33 @@ public class Runner extends Thread
...
@@ -29,16 +37,33 @@ public class Runner extends Thread
ssmRunner
=
new
SSMRunner
(
this
);
ssmRunner
=
new
SSMRunner
(
this
);
ssmRunner
.
initComponents
();
ssmRunner
.
initComponents
();
ssmRunner
.
setVisible
(
true
);
ssmRunner
.
setVisible
(
true
);
//System.out.println( "Foc Trav=" + ssmRunner.isFocusTraversable() ) ;
ssmRunner
.
requestFocus
()
;
ssmRunner
.
requestFocus
()
;
if
(
initialFile
!=
null
)
ssmRunner
.
loadFile
(
initialFile
)
;
}
}
catch
(
Exception
e
)
{
catch
(
Exception
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
}
}
public
void
loadFile
(
File
initialFile
)
{
ssmRunner
.
loadFile
(
initialFile
)
;
}
public
void
loadReader
(
Reader
reader
)
{
ssmRunner
.
load
(
reader
)
;
}
public
static
void
usage
()
{
System
.
out
.
println
(
"Simple Stack Machine Interpreter"
);
System
.
out
.
println
(
"Version "
+
Config
.
version
()
+
", "
+
Config
.
versionDate
());
System
.
out
.
println
(
"usage: [--clisteps <steps>] [--cli] [--file <path> OR --stdin]"
);
System
.
out
.
println
(
"\t--clisteps <steps>: The amount of steps to run. -1 for infinite(default). Only in cli mode"
);
System
.
out
.
println
(
"\t--stdin: Read code from stdin"
);
System
.
out
.
println
(
"\t--file <path>: Read code from path"
);
System
.
out
.
println
(
"\t--cli: No GUI, runs code and exits on halt"
);
System
.
out
.
println
(
"\t--guidelay: Amount of time to sleep in milliseconds between steps in the GUI. Default: 50"
);
System
.
exit
(
1
);
}
public
void
run
()
public
void
run
()
{
{
while
(
true
)
while
(
true
)
...
@@ -58,16 +83,77 @@ public class Runner extends Thread
...
@@ -58,16 +83,77 @@ public class Runner extends Thread
}
}
// Main entry point
// Main entry point
static
public
void
main
(
String
[]
args
)
static
public
void
main
(
String
[]
args
)
throws
IOException
{
{
File
initialFile
=
null
;
File
initialFile
=
null
;
long
steps
=
-
1
;
if
(
args
.
length
>
0
)
boolean
stdin
=
false
;
{
boolean
cli
=
false
;
File
f
=
new
File
(
args
[
0
]
)
;
int
guiDelay
=
50
;
if
(
f
.
exists
()
)
for
(
int
i
=
0
;
i
<
args
.
length
;
i
++)
{
initialFile
=
f
;
String
key
=
args
[
i
];
switch
(
key
)
{
case
"--clisteps"
:
i
++;
steps
=
Long
.
parseLong
(
args
[
i
]);
break
;
case
"--stdin"
:
if
(
initialFile
!=
null
)
{
System
.
out
.
println
(
"--stdin cannot be used with --file"
);
usage
();
}
stdin
=
true
;
break
;
case
"--file"
:
if
(
stdin
)
{
System
.
out
.
println
(
"--file cannot be used with --stdin"
);
usage
();
}
else
{
i
++;
initialFile
=
new
File
(
args
[
i
]);
}
break
;
case
"--cli"
:
cli
=
true
;
break
;
case
"--guidelay"
:
i
++;
guiDelay
=
Integer
.
parseInt
(
args
[
i
]);
break
;
default
:
usage
();
}
}
if
(
initialFile
!=
null
&&
!
initialFile
.
exists
())
{
System
.
out
.
println
(
"Input file does not exist"
);
usage
();
}
if
(
cli
)
{
CliRunner
cliRunner
=
new
CliRunner
(
steps
);
if
(
stdin
)
{
BufferedReader
reader
=
new
BufferedReader
(
new
InputStreamReader
(
System
.
in
));
cliRunner
.
load
(
reader
);
reader
.
close
();
}
else
{
if
(!
stdin
&&
initialFile
==
null
)
{
System
.
out
.
println
(
"Need some input in CLI mode"
);
}
FileReader
fr
=
new
FileReader
(
initialFile
)
;
cliRunner
.
load
(
fr
);
fr
.
close
();
}
cliRunner
.
run
();
}
else
{
Runner
r
=
new
Runner
(
guiDelay
);
if
(
stdin
)
{
BufferedReader
reader
=
new
BufferedReader
(
new
InputStreamReader
(
System
.
in
));
r
.
loadReader
(
reader
);
reader
.
close
();
}
else
if
(
initialFile
!=
null
)
{
r
.
loadFile
(
initialFile
);
}
}
}
new
Runner
(
initialFile
)
;
}
}
}
}
src/nl/uu/cs/ssmui/SSMRunner.java
View file @
8fbb32c4
...
@@ -12,8 +12,7 @@ import java.awt.event.MouseAdapter;
...
@@ -12,8 +12,7 @@ import java.awt.event.MouseAdapter;
import
java.awt.event.MouseEvent
;
import
java.awt.event.MouseEvent
;
import
java.io.File
;
import
java.io.File
;
import
java.io.FileReader
;
import
java.io.FileReader
;
import
java.io.UnsupportedEncodingException
;
import
java.io.Reader
;
import
java.nio.ByteBuffer
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.Enumeration
;
import
java.util.Enumeration
;
import
java.util.Vector
;
import
java.util.Vector
;
...
@@ -148,7 +147,7 @@ public class SSMRunner extends JFrame
...
@@ -148,7 +147,7 @@ public class SSMRunner extends JFrame
setupState
=
SETUP_BUSY
;
setupState
=
SETUP_BUSY
;
machineState
=
new
MachineState
(
5000
,
2000
,
this
)
;
// TBD: automatic increase with reasonable increments
machineState
=
new
MachineState
(
5000
,
2000
,
this
)
;
// TBD: automatic increase with reasonable increments
machine
=
new
Machine
(
machineState
,
this
)
;
machine
=
new
Machine
(
machineState
,
this
)
;
stepManager
=
new
StepManager
(
machine
)
;
stepManager
=
new
StepManager
(
machine
,
true
)
;
codeTableModel
=
new
CodeTableModel
(
this
,
machineState
)
;
codeTableModel
=
new
CodeTableModel
(
this
,
machineState
)
;
stackTableModel
=
new
StackTableModel
(
machineState
)
;
stackTableModel
=
new
StackTableModel
(
machineState
)
;
...
@@ -810,18 +809,16 @@ public class SSMRunner extends JFrame
...
@@ -810,18 +809,16 @@ public class SSMRunner extends JFrame
loadFile
(
recentLoadedFile
)
;
loadFile
(
recentLoadedFile
)
;
}
}
protected
void
loadFile
(
File
f
)
protected
void
load
(
Reader
r
)
{
{
setupState
=
SETUP_BUSY
;
setupState
=
SETUP_BUSY
;
String
msg
;
String
msg
;
recentLoadedFile
=
f
;
try
try
{
{
Vector
<
String
>
leftOverLabels
;
Vector
<
String
>
leftOverLabels
;
AssemblyParseResult
apr
;
AssemblyParseResult
apr
;
FileReader
fr
=
new
FileReader
(
f
)
;
AssemblyParser
ap
=
new
AssemblyParser
(
r
)
;
AssemblyParser
ap
=
new
AssemblyParser
(
fr
)
;
reset
()
;
reset
()
;
codeTableModel
.
parseInitialize
()
;
codeTableModel
.
parseInitialize
()
;
for
(
apr
=
null
;
!
ap
.
isAtEOF
()
;
)
for
(
apr
=
null
;
!
ap
.
isAtEOF
()
;
)
...
@@ -841,8 +838,6 @@ public class SSMRunner extends JFrame
...
@@ -841,8 +838,6 @@ public class SSMRunner extends JFrame
apr
.
addLabels
(
leftOverLabels
)
;
apr
.
addLabels
(
leftOverLabels
)
;
}
}
}
}
fr
.
close
()
;
setTitle
(
title
+
" - "
+
f
.
getName
());
}
}
catch
(
Exception
ex
)
catch
(
Exception
ex
)
{
{
...
@@ -858,6 +853,22 @@ public class SSMRunner extends JFrame
...
@@ -858,6 +853,22 @@ public class SSMRunner extends JFrame
setupState
=
SETUP_READY
;
setupState
=
SETUP_READY
;
}
}
protected
void
loadFile
(
File
f
)
{
recentLoadedFile
=
f
;
try
{
FileReader
fr
=
new
FileReader
(
f
)
;
load
(
fr
);
fr
.
close
()
;
setTitle
(
title
+
" - "
+
f
.
getName
());
}
catch
(
Exception
ex
)
{
ex
.
printStackTrace
()
;
}
}
class
SSMFileFilter
extends
javax
.
swing
.
filechooser
.
FileFilter
class
SSMFileFilter
extends
javax
.
swing
.
filechooser
.
FileFilter
{
{
...
...
src/nl/uu/cs/ssmui/StepManager.java
View file @
8fbb32c4
...
@@ -30,16 +30,17 @@ public class StepManager
...
@@ -30,16 +30,17 @@ public class StepManager
private
Vector
<
Vector
<
UndoableEvent
>>
history
;
private
Vector
<
Vector
<
UndoableEvent
>>
history
;
private
Vector
<
UndoableEvent
>
curStepHistory
;
private
Vector
<
UndoableEvent
>
curStepHistory
;
private
StepManager
(
Memory
m
,
Registers
r
)
private
StepManager
(
Memory
m
,
Registers
r
,
boolean
enableHistory
)
{
{
memory
=
m
;
memory
=
m
;
registers
=
r
;
registers
=
r
;
history
=
new
Vector
<
Vector
<
UndoableEvent
>>()
;
if
(
enableHistory
)
history
=
new
Vector
<
Vector
<
UndoableEvent
>>()
;
}
}
protected
StepManager
(
Machine
m
)
protected
StepManager
(
Machine
m
,
boolean
enableHistory
)
{
{
this
(
m
.
memory
(),
m
.
registers
()
)
;
this
(
m
.
memory
(),
m
.
registers
()
,
enableHistory
)
;
machineState
=
m
.
state
()
;
machineState
=
m
.
state
()
;
}
}
...
@@ -66,18 +67,19 @@ public class StepManager
...
@@ -66,18 +67,19 @@ public class StepManager
machineState
.
removeMachineStateListener
(
this
)
;
machineState
.
removeMachineStateListener
(
this
)
;
memory
.
removeMemoryCellListener
(
this
)
;
memory
.
removeMemoryCellListener
(
this
)
;
registers
.
removeMemoryCellListener
(
this
)
;
registers
.
removeMemoryCellListener
(
this
)
;
history
.
addElement
(
curStepHistory
)
;
if
(
history
!=
null
)
history
.
addElement
(
curStepHistory
)
;
}
}
protected
boolean
canDoBackStep
()
protected
boolean
canDoBackStep
()
{
{
return
history
.
size
()
>
0
;
return
history
!=
null
&&
history
.
size
()
>
0
;
}
}
protected
void
backStep
()
protected
void
backStep
()
{
{
int
sz
;
int
sz
;
if
(
(
sz
=
history
.
size
())
>
0
)
if
(
history
!=
null
&&
(
sz
=
history
.
size
())
>
0
)
{
{
Vector
<
UndoableEvent
>
events
=
history
.
elementAt
(
sz
-
1
)
;
Vector
<
UndoableEvent
>
events
=
history
.
elementAt
(
sz
-
1
)
;
for
(
int
i
=
events
.
size
()
-
1
;
i
>=
0
;
i
--
)
for
(
int
i
=
events
.
size
()
-
1
;
i
>=
0
;
i
--
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment