質問するログイン新規登録

回答編集履歴

5

fix

2017/07/06 09:53

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -39,4 +39,18 @@
39
39
  ;
40
40
  ```
41
41
 
42
- 特殊すぎるwww
42
+ 特殊すぎるwww
43
+
44
+ 位置づけで言うと clone 等と同じ位置づけの様です。
45
+
46
+ ```
47
+ %token T_UNSET_CAST "(unset) (T_UNSET_CAST)"
48
+ %token T_NEW "new (T_NEW)"
49
+ %token T_CLONE "clone (T_CLONE)"
50
+ %token T_EXIT "exit (T_EXIT)"
51
+ %token T_IF "if (T_IF)"
52
+ %token T_ELSEIF "elseif (T_ELSEIF)"
53
+ %token T_ELSE "else (T_ELSE)"
54
+ %token T_ENDIF "endif (T_ENDIF)"
55
+ %token T_ECHO "echo (T_ECHO)"
56
+ ```

4

fix

2017/07/06 09:53

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -22,4 +22,21 @@
22
22
 
23
23
  さらに追記
24
24
 
25
- もう少し説明すると php の exit(1) は `exit` の右項に取る式 `exit (1)` という解釈をされていました。
25
+ もう少し説明すると php の exit(1) は `exit` の右項に取る式 `exit (1)` という解釈をされていました。ただ右項として実際に `(1)` を渡す事は出来ず、BNF 上 exit の引数は exit_expr という専用のパースが行われていました。
26
+
27
+ 一般式の BNF
28
+ ```
29
+ expr:
30
+ variable { $$ = $1; }
31
+ | expr_without_variable { $$ = $1; }
32
+ ```
33
+
34
+ exit の右項のの BNF
35
+ ```
36
+ exit_expr:
37
+ /* empty */ { $$ = NULL; }
38
+ | '(' optional_expr ')' { $$ = $2; }
39
+ ;
40
+ ```
41
+
42
+ 特殊すぎるwww

3

fix

2017/07/06 09:51

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -20,3 +20,6 @@
20
20
 
21
21
  ですので exit は return 等と同じ「構文」で良いと思います。
22
22
 
23
+ さらに追記
24
+
25
+ もう少し説明すると php の exit(1) は `exit` の右項に取る式 `exit (1)` という解釈をされていました。

2

fix

2017/07/06 09:46

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  https://github.com/php/php-src/blob/master/Zend/zend_compile.c#L8274
10
10
 
11
- 実際は exit は print 等と同じ builtin 命令として登録されており、明確に関数とは区別されていました。また
11
+ 実際は exit は print や return 等と同じ builtin 命令として登録されており、明確に関数とは区別されていました。また
12
12
 
13
13
  ```php
14
14
  if (is_callable('exit')) {
@@ -17,3 +17,6 @@
17
17
  ```
18
18
 
19
19
  で呼べないので関数として認識していない様でした。
20
+
21
+ ですので exit は return 等と同じ「構文」で良いと思います。
22
+

1

fix

2017/07/06 09:41

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -1,3 +1,19 @@
1
1
  プログラミング言語は式と文で出来ています。プログラミング言語のシンタックスを表現する意味での式と文は明確に区別されますが、書籍などでは return は制御構文、exit(1) 等も「関数呼び出し」という構文と書かれる事はあります。
2
2
 
3
+ <del>実際には exit(1) は関数なので式です。</del>
4
+
5
+ 追記
6
+
3
- 実際には exit(1) は関数なのです。
7
+ すいません。exit は関数では無かったです。
8
+
9
+ https://github.com/php/php-src/blob/master/Zend/zend_compile.c#L8274
10
+
11
+ 実際は exit は print 等と同じ builtin 命令として登録されており、明確に関数とは区別されていました。また
12
+
13
+ ```php
14
+ if (is_callable('exit')) {
15
+ echo "yes";
16
+ }
17
+ ```
18
+
19
+ で呼べないので関数として認識していない様でした。