回答編集履歴
5
説明変更
test
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
「現段階のプログラム」を見る限り、まだ新たな構文を実装するには理解が足りないように見えます。
|
1
|
+
「現段階のプログラム」を見る限り、まだ新たな構文を実装するには理解が足りないように見えます。
|
2
2
|
|
3
|
+
`if (a == b) {`というコードを書いていることから、「目的コードを生成するコード」と「生成される目的コード」の区別がついていないのではないでしょうか。「生成される目的コード」で比較を行いたいはずなのに、これだと「目的コードを生成するコード」で比較を行ってしまっています。まずは、この区別がつくとこまろで学習を進めることをお勧めします。
|
4
|
+
|
3
|
-
それができたら、次は単純なコードの書き換えを
|
5
|
+
それができたら、次は単純なコードの書き換えを実装できるようになりましょう。例えば、switch文もcaseが1つだと確定していれば、単純なif文に書き換えられます。あとは、switchを読み込んだ際に、このifと同じ目的コードを生成できれば、実装できたことになります。
|
4
6
|
```
|
5
7
|
switch a+1
|
6
8
|
case 1; c:=a+b;
|
4
前段階の説明を追加
test
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
-
「現段階のプログラム」を見る限り、
|
1
|
+
「現段階のプログラム」を見る限り、まだ新たな構文を実装するには理解が足りないように見えます。`if (a == b) {`というコードを書いていることから、「目的コードを生成するコード」と「生成される目的コード」の区別がついていないのではないでしょうか。比較を行いたいのは「生成される目的コード」のはずなのに、これだと「目的コードを生成するコード」で比較を行ってしまっています。まずは、この区別がつくとこまろで学習を進めることをお勧めします。
|
2
2
|
|
3
|
+
それができたら、次は単純なコードの書き換えを行えるようになりましょう。例えば、switch文もcaseが1つだと確定していれば、単純なif文への書き換えだけで実装できます。
|
4
|
+
```
|
5
|
+
switch a+1
|
6
|
+
case 1; c:=a+b;
|
7
|
+
end
|
8
|
+
```
|
9
|
+
↓
|
10
|
+
```
|
11
|
+
if a+1=1 then c:=a+b
|
12
|
+
```
|
13
|
+
ここまできてようやく、caseが複数の場合にどのように実装するかを検討できる段階になります。
|
14
|
+
|
15
|
+
---
|
3
16
|
まずは、switchの構文規則を決めておきましょう。[WikipediaのPL/0](https://ja.wikipedia.org/wiki/PL/0#%E6%96%87%E6%B3%95)を参考に、以下のようにEBNFで定義してみます。switchがどこで終わるか分からないと不便なので、最後にendを記述するルールとしておきます。
|
4
17
|
```
|
5
18
|
switch_statement = "switch" expression {"case" expression ";" statement ";"} "end"
|
@@ -35,4 +48,4 @@
|
|
35
48
|
|
36
49
|
あとは、こちらと同じ結果となる目的コードを生成できれば、現状の枠組みの中でもswitchを実装できます。
|
37
50
|
|
38
|
-
・・・というわけで、switchの実装はけっこう難易度が高いです。ほかにも、こっそり`a+1`保存用の変数を追加する、目的コードの種類を増やすなどの方法もありますが、どちらにしろ難しいのは変わりません。
|
51
|
+
・・・というわけで、switchの実装はけっこう難易度が高いです。ほかにも、こっそり`a+1`保存用の変数を追加する、目的コードの種類を増やすなどの方法もありますが、どちらにしろ難しいのは変わりません。
|
3
別の実装方法追加
test
CHANGED
@@ -35,4 +35,4 @@
|
|
35
35
|
|
36
36
|
あとは、こちらと同じ結果となる目的コードを生成できれば、現状の枠組みの中でもswitchを実装できます。
|
37
37
|
|
38
|
-
・・・というわけで、switchの実装はけっこう難易度が高いです。ほかにも、目的コードの種類を増やすなどの方法もありますが、どちらにしろ難しいのは変わりません。もう少し難易度の低い構文追加で練習してから取り組むことをお勧めします。
|
38
|
+
・・・というわけで、switchの実装はけっこう難易度が高いです。ほかにも、こっそり`a+1`保存用の変数を追加する、目的コードの種類を増やすなどの方法もありますが、どちらにしろ難しいのは変わりません。もう少し難易度の低い構文追加で練習してから取り組むことをお勧めします。
|
2
誤字修正
test
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
else if a+1=2 then
|
20
20
|
c:=a-b
|
21
21
|
```
|
22
|
-
ただ、これだと`a+1`が複数回現れるので、現状の構文解析
|
22
|
+
ただ、これだと`a+1`が複数回現れるので、現状の構文解析器で実装するのは困難です。そこで、こっそり関数内関数`$switch`を定義して、それを呼び出す形にしてみましょう。(ユーザが定義不可な名前にして、ユーザ定義関数とのバッティングを防止する)
|
23
23
|
```
|
24
24
|
function $switch($n)
|
25
25
|
if $n=1 then
|
1
余計なセミコロン削除
test
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
if a+1=1 then
|
18
18
|
c:=a+b
|
19
19
|
else if a+1=2 then
|
20
|
-
c:=a-b
|
20
|
+
c:=a-b
|
21
21
|
```
|
22
22
|
ただ、これだと`a+1`が複数回現れるので、現状の構文解析機で実装するのは困難です。そこで、こっそり関数内関数`$switch`を定義して、それを呼び出す形にしてみましょう。(ユーザが定義不可な名前にして、ユーザ定義関数とのバッティングを防止する)
|
23
23
|
```
|