Skip to content

Commit 528cc19

Browse files
authored
Merge pull request #9 from ref-humbold/argparser
CLI parser
2 parents 1e1877c + 438d5cc commit 528cc19

File tree

8 files changed

+260
-42
lines changed

8 files changed

+260
-42
lines changed

.circleci/config.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ jobs:
2121
command: ./ci/install_ant_junit5.sh
2222
- run:
2323
name: Download Dependencies
24-
command: ant -lib ./lib resolve
24+
command: ant resolve
2525
- run:
2626
name: Build
27-
command: ant -lib ./lib jar
27+
command: ant jar
2828
- run:
2929
name: Test
30-
command: ant -lib ./lib test
30+
command: ant test
3131
- store_test_results:
3232
path: ./junit/result
3333

.github/workflows/build-and-test.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ jobs:
1818
- name: Download Dependencies
1919
run: |
2020
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
21-
ant -lib ./lib resolve
21+
ant resolve
2222
- name: Build
2323
run: |
2424
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
25-
ant -lib ./lib jar
25+
ant jar
2626
- name: Test
2727
run: |
2828
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
29-
ant -lib ./lib test
29+
ant test

README.md

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,22 @@ Interpreter of a fictional assembly-like APO language
1010

1111
-----
1212

13-
## Dependencies
14-
15-
### Standard build & run
13+
## System requirements
1614

17-
> *versions used by the author are in double parentheses and italic*
18-
19-
General:
15+
> versions used by the author are in italics
2016
2117
+ Operating system \
22-
*((Debian testing))*
18+
*Debian testing*
2319
+ [Java](https://www.oracle.com/technetwork/java/javase/overview/index.html) \
24-
*((APT package `openjdk-17-jdk`, version 17 SE))*
20+
*APT package `openjdk-17-jdk`, version 17 SE*
2521
+ [Apache ANT](http://ant.apache.org/) \
26-
*((APT package `ant`, version 1.10.+))*
22+
*APT package `ant`, version 1.10.+*
2723

28-
### Unit testing
24+
## Dependencies
2925

30-
> libraries are automatically downloaded during build process
26+
> dependencies are automatically downloaded during build process
3127
28+
+ Apache Commons CLI 1.6.+
3229
+ JUnit 5.+
3330
+ AssertJ 3.+
3431

build.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
<format property="date.version" pattern="yyMMdd" locale="en,GB" />
55
</tstamp>
66

7-
<property name="major.version" value="1" />
8-
<property name="minor.version" value="2" />
7+
<property name="major.version" value="2" />
8+
<property name="minor.version" value="0" />
99
<property name="spec.version" value="${major.version}.${minor.version}" />
1010
<property name="jar.version" value="${major.version}.${minor.version}.${date.version}" />
1111
<property name="vendor" value="Rafał Kaleta" />
@@ -18,6 +18,7 @@
1818
<property name="ant.output.dir" value="antBuild" />
1919
<property name="build.dir" value="${ant.output.dir}/bin" />
2020
<property name="dist.dir" value="${ant.output.dir}/dist" />
21+
<property name="dist.lib.dir" value="${dist.dir}/lib" />
2122
<property name="junit.output.dir" value="${ant.output.dir}/junit" />
2223
<property name="junit.result.dir" value="${junit.output.dir}/result" />
2324
<property name="junit.report.dir" value="${junit.output.dir}/report" />
@@ -76,6 +77,7 @@
7677
<target name="jar" depends="compile"
7778
description="Compile source files &amp; Create executable jar">
7879
<jar destfile="${dist.dir}/${jar.file}" basedir="${build.dir}" excludes="**/*Test.class">
80+
<zipgroupfileset dir="${ivy.lib.dir}" includes="*.jar" />
7981
<manifest>
8082
<attribute name="Built-By" value="${vendor}" />
8183
<attribute name="Main-Class" value="${main.package}.Interpreter" />

ivy.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<ivy-module version="2.0">
22
<info organisation="ref_humbold" module="apo_language" />
33
<dependencies>
4+
<dependency org="commons-cli" name="commons-cli" rev="1.6.+" />
45
<dependency org="org.junit.jupiter" name="junit-jupiter-api" rev="5.+" />
56
<dependency org="org.junit.jupiter" name="junit-jupiter-engine" rev="5.+" />
67
<dependency org="org.junit.jupiter" name="junit-jupiter-params" rev="5.+" />
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package apolang;
2+
3+
import org.apache.commons.cli.*;
4+
5+
class CliParser
6+
{
7+
private final CommandLineParser parser = new DefaultParser();
8+
private final Options options = new Options();
9+
private final HelpFormatter helpFormatter = new HelpFormatter();
10+
11+
CliParser()
12+
{
13+
options.addOption(Option.builder("m")
14+
.longOpt("memory")
15+
.hasArg()
16+
.argName("SIZE")
17+
.type(Integer.class)
18+
.desc("Provide memory size in kB (default is 1 kB)")
19+
.build());
20+
options.addOption("h", "help", false, "Display this help message and exit");
21+
}
22+
23+
Arguments parse(String[] args)
24+
throws ParseException
25+
{
26+
Arguments arguments = new Arguments();
27+
CommandLine commandLine = parser.parse(options, args);
28+
String[] remainingArgs = commandLine.getArgs();
29+
30+
arguments.help = commandLine.hasOption('h');
31+
32+
if(arguments.help)
33+
{
34+
return arguments;
35+
}
36+
37+
try
38+
{
39+
arguments.memorySize = Integer.parseInt(commandLine.getOptionValue('m', "1"));
40+
}
41+
catch(NumberFormatException e)
42+
{
43+
throw new ParseException("Invalid memory size. %s".formatted(e.getMessage()));
44+
}
45+
46+
if(remainingArgs.length == 0)
47+
{
48+
throw new ParseException("File not provided.");
49+
}
50+
51+
arguments.filename = remainingArgs[0];
52+
53+
if(!arguments.filename.endsWith(".apo"))
54+
{
55+
throw new ParseException("Invalid file extension, should be '.apo'.");
56+
}
57+
58+
return arguments;
59+
}
60+
61+
void printHelp()
62+
{
63+
helpFormatter.printHelp("apolang [OPTIONS]... FILE", options);
64+
}
65+
66+
static class Arguments
67+
{
68+
private boolean help;
69+
private int memorySize;
70+
private String filename;
71+
72+
boolean isHelp()
73+
{
74+
return help;
75+
}
76+
77+
int getMemorySize()
78+
{
79+
return memorySize;
80+
}
81+
82+
String getFilename()
83+
{
84+
return filename;
85+
}
86+
}
87+
}

src/main/java/apolang/Interpreter.java

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,46 @@
33
import java.io.IOException;
44
import java.nio.file.Path;
55
import java.nio.file.Paths;
6+
import org.apache.commons.cli.ParseException;
67

78
import apolang.interpreter.Controller;
89

910
public final class Interpreter
1011
{
12+
private static final CliParser cliParser = new CliParser();
13+
1114
public static void main(String[] args)
1215
throws IOException
1316
{
14-
if(args.length == 0)
17+
CliParser.Arguments arguments;
18+
19+
try
1520
{
16-
System.err.println("No file specified. Execution stopped.");
17-
return;
21+
arguments = cliParser.parse(args);
1822
}
19-
20-
int memorySize = 1;
21-
String filename = args[0];
22-
23-
if(args.length > 1)
23+
catch(ParseException e)
2424
{
25-
try
26-
{
27-
memorySize = Integer.parseInt(args[1]);
28-
}
29-
catch(Exception e)
30-
{
31-
System.err.println("Invalid memory size. Execution stopped.");
32-
return;
33-
}
25+
System.err.printf("Error while parsing arguments:%n\t%s%n\tExecution stopped.%n",
26+
e.getMessage());
27+
return;
3428
}
3529

36-
if(!filename.endsWith(".apo"))
30+
if(arguments.isHelp())
3731
{
38-
System.err.println("Wrong filename extension. Execution stopped.");
32+
cliParser.printHelp();
3933
return;
4034
}
4135

42-
Path path = Paths.get(filename);
43-
Controller controller = new Controller(memorySize, path);
36+
Path path = Paths.get(arguments.getFilename());
37+
Controller controller = new Controller(arguments.getMemorySize(), path);
4438

4539
try
4640
{
4741
controller.parse();
4842
}
4943
catch(Exception e)
5044
{
51-
System.err.printf("parser error>> %s\n\tExecution stopped.\n", e);
45+
System.err.printf("parser error>> %s%n\tExecution stopped.%n", e);
5246
e.printStackTrace(System.err);
5347
return;
5448
}
@@ -59,7 +53,7 @@ public static void main(String[] args)
5953
}
6054
catch(Exception e)
6155
{
62-
System.err.printf("interpreter error>> %s\n\tExecution stopped.\n", e);
56+
System.err.printf("interpreter error>> %s%n\tExecution stopped.%n", e);
6357
e.printStackTrace(System.err);
6458
}
6559
}

0 commit comments

Comments
 (0)