回答編集履歴

5

説明変更

2022/11/26 03:46

投稿

actorbug
actorbug

スコア2224

test CHANGED
@@ -1,6 +1,8 @@
1
- 「現段階のプログラム」を見る限り、まだ新たな構文を実装するには理解が足りないように見えます。`if (a == b) {`というコードを書いていることから、「目的コードを生成するコード」と「生成される目的コード」の区別がついていないのではないでしょうか。比較を行いたいのは「生成される目的コード」のはずなのに、これだと「目的コードを生成するコード」で比較を行ってしまっています。まずは、この区別がつくとこまろで学習を進めることをお勧めします。
1
+ 「現段階のプログラム」を見る限り、まだ新たな構文を実装するには理解が足りないように見えます。
2
2
 
3
+ `if (a == b) {`というコードを書いていることから、「目的コードを生成するコード」と「生成される目的コード」の区別がついていないのではないでしょうか。「生成される目的コード」で比較を行いたいはずなのに、これだと「目的コードを生成するコード」で比較を行ってしまっています。まずは、この区別がつくとこまろで学習を進めることをお勧めします。
4
+
3
- それができたら、次は単純なコードの書き換えを行えるようになりましょう。例えば、switch文もcaseが1つだと確定していれば、単純なif文への書き換えだで実装できます。
5
+ それができたら、次は単純なコードの書き換えを実装できるようになりましょう。例えば、switch文もcaseが1つだと確定していれば、単純なif文書き換えられます。あとは、switchを読み込ん際に、このifと同じ目的コードを生成きれば、実装できたことになります。
4
6
  ```
5
7
  switch a+1
6
8
  case 1; c:=a+b;

4

前段階の説明を追加

2022/11/26 03:31

投稿

actorbug
actorbug

スコア2224

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

別の実装方法追加

2022/11/26 00:10

投稿

actorbug
actorbug

スコア2224

test CHANGED
@@ -35,4 +35,4 @@
35
35
 
36
36
  あとは、こちらと同じ結果となる目的コードを生成できれば、現状の枠組みの中でもswitchを実装できます。
37
37
 
38
- ・・・というわけで、switchの実装はけっこう難易度が高いです。ほかにも、目的コードの種類を増やすなどの方法もありますが、どちらにしろ難しいのは変わりません。もう少し難易度の低い構文追加で練習してから取り組むことをお勧めします。
38
+ ・・・というわけで、switchの実装はけっこう難易度が高いです。ほかにも、こっそり`a+1`保存用の変数を追加する、目的コードの種類を増やすなどの方法もありますが、どちらにしろ難しいのは変わりません。もう少し難易度の低い構文追加で練習してから取り組むことをお勧めします。

2

誤字修正

2022/11/25 23:06

投稿

actorbug
actorbug

スコア2224

test CHANGED
@@ -19,7 +19,7 @@
19
19
  else if a+1=2 then
20
20
  c:=a-b
21
21
  ```
22
- ただ、これだと`a+1`が複数回現れるので、現状の構文解析で実装するのは困難です。そこで、こっそり関数内関数`$switch`を定義して、それを呼び出す形にしてみましょう。(ユーザが定義不可な名前にして、ユーザ定義関数とのバッティングを防止する)
22
+ ただ、これだと`a+1`が複数回現れるので、現状の構文解析で実装するのは困難です。そこで、こっそり関数内関数`$switch`を定義して、それを呼び出す形にしてみましょう。(ユーザが定義不可な名前にして、ユーザ定義関数とのバッティングを防止する)
23
23
  ```
24
24
  function $switch($n)
25
25
  if $n=1 then

1

余計なセミコロン削除

2022/11/25 22:47

投稿

actorbug
actorbug

スコア2224

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
  ```