forked from glayzzle/php-parser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtry.js
More file actions
40 lines (39 loc) · 1.29 KB
/
try.js
File metadata and controls
40 lines (39 loc) · 1.29 KB
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
/**
* Copyright (C) 2018 Glayzzle (BSD3 License)
* @authors https://github.com/glayzzle/php-parser/graphs/contributors
* @url http://glayzzle.com
*/
"use strict";
module.exports = {
/**
* ```ebnf
* try ::= T_TRY '{' inner_statement* '}'
* (
* T_CATCH '(' namespace_name variable ')' '{' inner_statement* '}'
* )*
* (T_FINALLY '{' inner_statement* '}')?
* ```
* @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L448
* @return {Try}
*/
read_try: function() {
this.expect(this.tok.T_TRY);
const result = this.node("try");
let always = null;
const catches = [];
const body = this.next().read_statement();
// https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L455
while (this.token === this.tok.T_CATCH) {
const item = this.node("catch");
this.next().expect("(") && this.next();
const what = this.read_list(this.read_namespace_name, "|", false);
const variable = this.read_variable(true, false);
this.expect(")");
catches.push(item(this.next().read_statement(), what, variable));
}
if (this.token === this.tok.T_FINALLY) {
always = this.next().read_statement();
}
return result(body, catches, always);
}
};