Language   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 242
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 85
dl 0
loc 242
rs 10
c 0
b 0
f 0
wmc 5

4 Methods

Rating   Name   Duplication   Size   Complexity  
A addRule() 0 3 1
B createWithRules() 0 167 1
A rules() 0 3 1
A __construct() 0 10 2
1
<?php
2
	
3
/**
4
	* Language.php
5
	*/
6
	
7
namespace netfocusinc\argh;
8
9
//
10
// CONVENIENCE DEFINITIONS
11
//
12
13
// Syntax Contants
14
define('ARGH_SYNTAX_FLAG', Rule::ARGH_SYNTAX_FLAG, true);
15
define('ARGH_SYNTAX_FLAGS', Rule::ARGH_SYNTAX_FLAGS, true);
16
define('ARGH_SYNTAX_NAME', Rule::ARGH_SYNTAX_NAME, true);
17
define('ARGH_SYNTAX_VALUE', Rule::ARGH_SYNTAX_VALUE, true);
18
define('ARGH_SYNTAX_LIST', Rule::ARGH_SYNTAX_LIST, true);
19
define('ARGH_SYNTAX_COMMAND', Rule::ARGH_SYNTAX_COMMAND, true);
20
define('ARGH_SYNTAX_QUOTED', Rule::ARGH_SYNTAX_QUOTED, true);
21
define('ARGH_SYNTAX_VARIABLE', Rule::ARGH_SYNTAX_VARIABLE, true);
22
23
// Semantic Contants
24
define('ARGH_SEMANTICS_FLAG', Rule::ARGH_SEMANTICS_FLAG, true);
25
define('ARGH_SEMANTICS_FLAGS', Rule::ARGH_SEMANTICS_FLAGS, true);
26
define('ARGH_SEMANTICS_NAME', Rule::ARGH_SEMANTICS_NAME, true);
27
define('ARGH_SEMANTICS_VALUE', Rule::ARGH_SEMANTICS_VALUE, true);
28
define('ARGH_SEMANTICS_LIST', Rule::ARGH_SEMANTICS_LIST, true);
29
define('ARGH_SEMANTICS_COMMAND', Rule::ARGH_SEMANTICS_COMMAND, true);
30
define('ARGH_SEMANTICS_VARIABLE', Rule::ARGH_SEMANTICS_VARIABLE, true);
31
32
/**
33
	* Langugage is a set of Rules (with Syntax and Semantics) used to interpret command line arguments.
34
	*
35
	* The Language class manages the Rules used to interpret command line arguments during parsing.
36
	* This class is a container for Rules, and features convenience methods for constructing a language complete with a set of standard rules.
37
	*
38
	* @api
39
	* 
40
	* @author Benjamin Hough
41
	*
42
	* @since 1.0.0
43
	*/
44
class Language
45
{	
46
	
47
	//
48
	// PRIVATE PROPERTIES
49
	//
50
	
51
	/** @var array An array of Rules */
52
	private $rules; // array of Rule(s)
53
	
54
	//
55
	// STATIC METHODS
56
	//
57
	
58
	/**
59
		* Creates a Language, complete with a set of Rules used for interpreting command line arguments
60
		*
61
		* This is the main function to use when creating a new Langugage.
62
		*
63
		* @since 1.0.0
64
		*
65
		* @return Language
66
		*/
67
	public static function createWithRules()
68
	{
69
		// Create a new Language instance
70
		$language = new self();
71
		
72
		//
73
		// Add a standard set of Rules
74
		//
75
		
76
		// Hyphenated Flag with List
77
		$language->addRule(new Rule(
78
				'Hyphenated Flag with List',
79
				'-f [one, two, three]',
80
				'/^\-(' . ARGH_SYNTAX_FLAG . ')[\s]+\[(' . ARGH_SYNTAX_LIST . ')\]$/i',
81
				[ARGH_SEMANTICS_FLAG, ARGH_SEMANTICS_LIST]
82
			)
83
		);
84
		
85
		// Double Hyphenated Flag with List
86
		$language->addRule(new Rule(
87
				'Double Hyphenated Name with List',
88
				'--key=[one, two, three]',
89
				'/^\-\-(' . ARGH_SYNTAX_NAME . ')=\[(' . ARGH_SYNTAX_LIST . ')\]$/i',
90
				[ARGH_SEMANTICS_NAME, ARGH_SEMANTICS_LIST]
91
			)
92
		);
93
		
94
		// Hyphenated Flag with Quoted Value
95
		$language->addRule(new Rule(
96
				'Hyphenated Flag with Quoted Value',
97
				'-f \'Hello World\'',
98
				'/^\-(' . ARGH_SYNTAX_FLAG . ')[\s]+\'(' . ARGH_SYNTAX_QUOTED . ')\'$/i',
99
				[ARGH_SEMANTICS_FLAG, ARGH_SEMANTICS_VALUE]
100
			)
101
		);
102
		
103
		// Double Hyphenated Key with Quoted Value
104
		$language->addRule(new Rule(
105
				'Double Hyphenated Name with Quoted Value',
106
				'--key=\'quoted value\'',
107
				'/^\-\-(' . ARGH_SYNTAX_NAME . ')=\'(' . ARGH_SYNTAX_QUOTED . ')\'$/i',
108
				[ARGH_SEMANTICS_NAME, ARGH_SEMANTICS_VALUE]
109
			)
110
		);
111
		
112
		// Hyphenated Flag with Value
113
		$language->addRule(new Rule(
114
				'Hyphenated Flag with Value',
115
				'-f value',
116
				'/^\-(' . ARGH_SYNTAX_FLAG . ')[\s]+(' . ARGH_SYNTAX_VALUE . ')$/i',
117
				[ARGH_SEMANTICS_FLAG, ARGH_SEMANTICS_VALUE]
118
			)
119
		);
120
		
121
		/*
122
		// Command with Naked Subcommand
123
		$language->addRule(new Rule(
124
				'Command with Naked Subcommand',
125
				'cmd sub',
126
				'/^(' . ARGH_SYNTAX_COMMAND . ')[\s]+(' . ARGH_SYNTAX_COMMAND . ')$/i',
127
				[ARGH_SEMANTICS_COMMAND, ARGH_SEMANTICS_SUB]
128
			)
129
		);
130
		*/
131
		
132
		// Hyphenated Key with Value
133
		$language->addRule(new Rule(
134
				'Hyphenated Name with Value',
135
				'-key value',
136
				'/^\-(' . ARGH_SYNTAX_NAME . ') (' . ARGH_SYNTAX_VALUE . ')$/i',
137
				[ARGH_SEMANTICS_NAME, ARGH_SEMANTICS_VALUE]
138
			)
139
		);
140
		
141
		// Double Hyphenated Key with Value
142
		$language->addRule(new Rule(
143
				'Double Hyphenated Name with Value',
144
				'--key=value',
145
				'/^\-\-(' . ARGH_SYNTAX_NAME . ')=(' . ARGH_SYNTAX_VALUE . ')$/i',
146
				[ARGH_SEMANTICS_NAME, ARGH_SEMANTICS_VALUE]
147
			)
148
		);
149
		
150
		// Double Hyphenated Boolean Key
151
		$language->addRule(new Rule(
152
				'Double Hyphenated Boolean Key',
153
				'--key',
154
				'/^\-\-(' . ARGH_SYNTAX_NAME . ')$/i',
155
				[ARGH_SEMANTICS_NAME]
156
			)
157
		);
158
		
159
		// Hyphenated Boolean Name
160
		$language->addRule(new Rule(
161
				'Hyphenated Boolean Key',
162
				'-key',
163
				'/^\-(' . ARGH_SYNTAX_NAME . ')$/i',
164
				[ARGH_SEMANTICS_NAME]
165
			)
166
		);
167
		
168
		// Hyphenated Boolean Flag
169
		$language->addRule(new Rule(
170
				'Hyphenated Boolean Flag',
171
				'-f',
172
				'/^\-(' . ARGH_SYNTAX_FLAG . ')$/i',
173
				[ARGH_SEMANTICS_FLAG]
174
			)
175
		);
176
		
177
		// Hyphenated Multi Flag
178
		$language->addRule(new Rule(
179
				'Hyphenated Multi Flag',
180
				'-xvf',
181
				'/^\-(' . ARGH_SYNTAX_FLAGS . ')$/i',
182
				[ARGH_SEMANTICS_FLAGS]
183
			)
184
		);
185
		
186
		/*
187
		// Command with Delimited Subcommand
188
		$language->addRule(new Rule(
189
				'Command with Delimited Subcommand',
190
				'cmd:sub',
191
				'/^(' . ARGH_SYNTAX_COMMAND . '):(' . ARGH_SYNTAX_COMMAND . ')$/i',
192
				[ARGH_SEMANTICS_COMMAND, ARGH_SEMANTICS_SUB]
193
			)
194
		);
195
		*/
196
		
197
		// Command
198
		$language->addRule(new Rule(
199
				'Command',
200
				'cmd',
201
				'/^(' . ARGH_SYNTAX_COMMAND . ')$/i',
202
				[ARGH_SEMANTICS_COMMAND]
203
			)
204
		);
205
		
206
		// Naked Multi Flag
207
		$language->addRule(new Rule(
208
				'Naked Multi Flag',
209
				'xvf',
210
				'/^(' . ARGH_SYNTAX_FLAGS . ')$/i',
211
				[ARGH_SEMANTICS_FLAGS]
212
			)
213
		);
214
		
215
		// Quoted Naked Variable
216
		$language->addRule(new Rule(
217
				'Quoted Naked Variable',
218
				'value',
219
				'/^\'(' . ARGH_SYNTAX_QUOTED . ')\'$/i',
220
				[ARGH_SEMANTICS_VARIABLE]
221
			)
222
		);
223
		
224
		// Naked Variable
225
		$language->addRule(new Rule(
226
				'Naked Variable',
227
				'value',
228
				'/^(' . ARGH_SYNTAX_VARIABLE . ')$/i',
229
				[ARGH_SEMANTICS_VARIABLE]
230
			)
231
		);
232
		
233
		return $language;
234
	}
235
	
236
	//
237
	// PUBLIC METHODS
238
	//
239
	
240
	/**
241
		* Langugage Constructor
242
		*
243
		* The preferred way of constructing a new Language, is with the static createWithRules() method.
244
		* This constructor is useful for creating custom languages, with non-standard rule sets.
245
		*
246
		* @since 1.0.0
247
		*
248
		* @throws Exception
249
		*/
250
	public function __construct()
251
	{
252
		try
253
		{
254
			// Create an array of Rules
255
			$this->rules = array();
256
		}
257
		catch(\Exception $e)
0 ignored issues
show
Unused Code introduced by
catch (\Exception $e) is not reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
258
		{
259
			throw($e);
260
		}
261
		
262
	} // END: __construct()
263
	
264
	/**
265
		* Returns the set of Rules maintained by this Language.
266
		*
267
		* @since 1.0.0
268
		*
269
		* @return array An array of Rules
270
		*/
271
	public function rules()
272
	{
273
		return $this->rules;
274
	}
275
	
276
	/**
277
		* Adds a Rule to the set of rules maintained by this Language.
278
		*
279
		* @since 1.0.0
280
		*
281
		* @param $rule Rule
282
		*/
283
	public function addRule(Rule $rule)
284
	{
285
		$this->rules[] = $rule;
286
	}
287
	
288
}
289