summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc/rgens/server/CLIArgsParser.java
blob: fa0d39949bbf1627d59ec87d09c26f73f37e4342 (plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package bjc.rgens.server;

import java.io.File;

public class CLIArgsParser {
	public static void parseArgs(String[] args, GrammarServerEngine eng) {
		boolean didTerminalOp = false;
		boolean forceInteractive = false;

		// @TODO report error status
		boolean didError = false;

		if(args.length < 0) return;
		
		if(args.length == 1 && args[0].equals("--help")) {
			// @TODO show help
		} else {
			for(int i = 0; i < args.length; i++) {
				String arg = args[i];

				switch(arg) {
					case "-lc":
					case "--load-config-file":
						String configFileName = args[++i];

						eng.doLoadConfig(configFileName);
						break;
					case "-lg":
					case "--load-grammar-file":
						String grammarFileName = args[++i];

						File grammarFile = new File(grammarFileName);

						String ruleName = grammarFile.getName();
						ruleName = ruleName.substring(0, ruleName.lastIndexOf('.'));

						if(!args[i+1].startsWith("-")) {
							ruleName = args[++i];
						}

						eng.doLoadGrammar(ruleName, grammarFileName);

						break;
					case "-ll":
					case "--load-long-file":
						String longRuleFileName = args[++i];

						File longRuleFile = new File(longRuleFileName);

						String longRuleName = longRuleFile.getName();
						longRuleName = longRuleName.substring(0, longRuleName.lastIndexOf('.'));

						if(!args[i+1].startsWith("-")) {
							longRuleName = args[++i];
						}

						eng.doLoadLongRule(longRuleName, longRuleFileName);

						break;
					case "-ge":
					case "--generate-exported-rule":
						String exportedRuleName = args[++i];

						if(eng.hasExportedRule(exportedRuleName)) {
							eng.doGenerateExportedRule(exportedRuleName);
							didTerminalOp = true;
						} else {
							System.out.printf("Error: No exported rule named %s\n", exportedRuleName);
						}
						break;
					case "-gg":
					case "--generate-grammar-rule":
						String grammarName = args[++i];
						
						if(!eng.hasLoadedGrammar(grammarName)) {
							System.out.printf("Error: No grammar named %s\n", grammarName);
						} else {
							String ruleToGenerate = "";

							if(!args[i+1].startsWith("-")) {
								ruleToGenerate = args[++i];
							} else if(eng.hasInitialRule(grammarName)) {
								ruleToGenerate = eng.getInitialRule(grammarName);
							} else {
								System.out.printf("Error: Grammar %s has no initial rule. A "
										+ "rule must be provided.",grammarName);
							}

							eng.doGenerateGrammar(grammarName, ruleToGenerate);
							didTerminalOp = true;
						}
						break;
					case "-st":
					case "--stress-test":
						String thingToTest = args[++i];

						// @TODO support testing rules from grammars
						// 		 as well as a specified number of times
						if(thingToTest.equals("*")) {
							eng.doStressTest(10000);
						} else {
							eng.doStressTest(thingToTest, 1000);
						}

						didTerminalOp = true;

						break;
					case "-d":
					case "--debug":
						if(eng.debugMode) {
							System.out.println("Warning: debug mode is already on. Use -nd or --no-debug"
									+ " to turn it off");
						} else {
							eng.debugMode = true;
						}
						break;
					case "-nd":
					case "--no-debug":
						if(!eng.debugMode) {
							System.out.println("Warning: debug mode is already off. Use -d or --debug"
									+ " to turn it on");
						} else {
							eng.debugMode = false;
						}
						break;
					case "-i":
					case "--interactive":
						forceInteractive = true;
						break;
					default:
						System.out.println("Error: Unrecognized argument " + arg);
						break;
				}
			}
		}

		if(!forceInteractive && didTerminalOp) {
			System.exit(didError ? 1 : 0);
		}
	}
}